一、应用场景
(1)用于服务器能够识别客户端(身份认证)
(2)解决Web开发的短连接问题,生命周期从Request开始,到Response结束
二、种类
(1)cookie
一种客户端会话技术,将数据以键值对形式存储在客户端
基本过程:
1.用户发出登陆请求
2.登陆成功后,生成cookie并将cookie保存在浏览器中
3.再次登陆时,用cookie的值验证用户名、密码
4.通过验证后成功登陆
(2)session
一种服务端会话技术,存储在服务器中,默认使用BASE64做数据安全。Django中默认过期时间为14天。session依赖于cookie(将session_key以cookie形式存储在客户端)
基本过程:
与cookie相似,不同的是第2、3步,
1.~
2.认证成功后生成session,并保存到数据库且将数据库表中的session_key以cookie形式存储到浏览器
3.再次请求时,用携带的session与数据库中session_data做验证用户名和密码
4.~
*(3)token
服务端会话技术,可以理解为一种自定义的session(也是将数据存储在数据库中,但是不需要专门的表来存放;不同的是session是django自动存储到服务端,而token不是)。在web开发中,使用起来和session基本一致。在移动端或者客户端开发中,通常以json形式传输。主要应用于移动端或客户端(不支持cookie的设备)
基本过程:
1.用户通过用户名和密码发送请求。
2.服务器端程序验证正确性。
3.服务器端程序返回一个带签名的token 给客户端。
4.客户端储存token,并且每次访问API都携带Token到服务器端的。
5.服务端只需验证token,校验成功则返回请求数据,校验失败则返回错误码。
(4)cookie,session,token对比
-cookie使用更简洁,服务器的压力较小。但数据相对不安全
-session数据相对安全,但服务器需要维护。需要一张专门的表(django_session)用来存放session信息。随着用户请求越来越多,服务器的内存开销也会越来越大
-token拥有session的所有优点,维护相对麻烦,支持更多终端(web,移动端,客户端)。与session不同的是不需要将token信息存放在服务器中(token可以与账户密码存放在一起可以)
三、cookie
cookie默认是不支持中文的,可以通过base64编码解码对中文字符进行cookie的存储与读取
1.通过加盐生成cookie
一种加密方式。一般的加密方式由于加密规则固定,很容易被破解,安全系数不高。但是密码加盐里包含随机值和加密方式。随机值是电脑随机产生的,然后按照加密方式生成一串字符串保存在服务器。
-设置加盐cookie(HttpResponse()的方法):set_signed_cookie('key', 'value', 'salt_name')
-取得加盐cookie(HttpResponse()的方法):get_signed_cookie('key', salt='salt_name')
在web中可以看到原来的值被编码成“乱码”的形式
2.删除cookie
由于cookie是存储在浏览器中的,所以用浏览器的工具删除,这里不做说明
四、session
Django中将session存储在数据库中(django_session表中),过期时间默认为14天
1.生成session
-设置session(request的方法):request.session['key'] = value
-取得session(request的方法):request.session.get('key')
在web中将session_key存储在cookie中
2.删除session
与cookie不同,session存储在服务端,所以删除只能在服务端:request.session.flush()删除session和浏览器的sessionid
(只删除cookie或者只删除session,会出现“脏数据”)
*五、token
1.生成token
(1)这里采用函数生成token的方法
(2)将token保存就到数据库
2.token验证
再次访问时,带有token参数。只需验证token即可,不需要使用用户名密码来验证(每次登陆token都不一样,token主要用于本次登录的子页面的验证)
(用GET方式获取参数)