出现场景:
服务器如何识别客户端,Http在web开发中基本都是短连接,一次请求的生命周期从request开始,到response就结束了
种类: | Cookie:客户端回话技术,数据存储在客户端,键值对存储,支持过期时间,默认cookie会自动携带本网站所有cookie。cookie不能跨域名、跨网站,通过HttpResponse来操作cookie。 |
---|---|
cookie | 使用更简洁,服务器压力小,数据不是很安全 |
session | 服务器要维护session,相对安全 |
token | 拥有session所有优点,自己维护略微麻烦,支持更多终端 |
cookie
cookie本身由浏览器生成,通过Response将cookie写到浏览器上,写一次访问,浏览器会根据不同的规则携带cookie过来
cookie不能跨浏览器,不能跨域名
cookie默认不支持中文,可以通过转码来实现存储中文
设置cookie,用返回给客户端的response
max_age:整数,指定cookie过期时间
expries:整数,指定过期时间,还支持是一个datetime或timedelta,可以指定一个具体日期时间
max_age和expries选一个指定即可
response.set_cookie(key,value [,max_age=None,exprise=None])
request.COOKIES.get(key) | 获取cookie,用客户端发来的request |
response.set_signed_cookie(key, value, salt) | 设置加密cookie |
request.get_signed_cookie(key, salt) | 获取加密cookie |
response.delete_cookie(key) | 删除cookie |
session
服务端会话技术 | request.session[key] = value # 保存session |
数据存储在服务器中 | request.session.get(key) # 获取session |
默认Session存储在内存中 | del request.session[key] # 删除session,只删除session_data里的数据部分 |
Django中默认会把Session持久化到数据库中 | request.session.flush() # 将cookie和数据库的session一起删除 |
Session在django中储存在数据库中的数据默认保留时长是14天 | |
可以存储中文,在存储时会默认转化为unicode字符串,获取时再转回中文 | clear() # 清除所有会话 |
主键是字符串 | |
数据使用了数据安全的,编码方式base64,在数据字符串前会添加一串混淆串" |
Token
服务端会话技术
自定义的session
在web页面开发中,使用起来和session基本一致
在移动端和客户端开发中,通常以json形式传输,需要移动端自己存储token,需要获取token关联数据的时候,主动传递token
在数据库中定义一个token字段,通过定义函数为数据添加不重复的token
浏览器:将token通过cookie传给前端,前端保存后 发起请求以token识别用户
移动端:将token使用json传给移动端
CSRF 防跨站攻击
网页中使用post请求django服务器时,默认有验证csrf,
在html文件中添加{% csrf_token %}即可成功验证
防止恶意注册,确保客户端就是我们自己的客户端
使用了cookie中的csrftoken进行验证,传输
服务器发送给客户端,客户端将cookie获取过来,还要进行编码转换(数据安全)
实现过程:
在存在有{% csrf_token %}标签的html页面中,响应会自动设置一个type为hidden的cookie:csrftoken
当页面发起POST动作时,会自动验证csrftoken
验证通过则正常执行以后流程,不通过则返回403