一.Cookie、Session、Token的由来
我们知道HTTP协议无连接的, 也就是不保存用户的状态信息
早期(十几年前)的网页是静态的, 数据都是写死的, 人们访问网页只是用来查看新闻的, 没有保存用户状态的需求
而往后出现了像论坛、博客、网购这一类需要保存用户信息的网站, 如果网站不保存用户的状态信息, 意味着用户每次访问都需要重新输入用户名和密码, 这无疑对用户的体验是极其不好的
于是, 就出现了会话跟踪技术, 我们可以把它理解为客户端与服务端之间的一次会晤, 一次会晤包含的多次请求与响应, 每次请求都带着请求参数, 比如请求登入的请求参数是用户名和密码, 服务端就会拿着请求参数与数据库去比对, 找到相应的用户信息
如何实现会话跟踪 : 在HTTP协议中可以使用Cookie来完成, 在Web开发中可以使用Session来完成
-
Cookie是存在浏览器中的键值对, 每次发送请求都携带者参数, 但是容易被截获, 不安全
-
于是就出现了Session, 它是存在于服务端的键值对, key为随机字符串, 安全性提高了, 但所有的数据都存在服务器中, 服务器的压力很大
-
之后便产生了Token的概念, 服务端签发加密后的字符串给客户端浏览器保存, 客户端每次请求携带用户名和密码, 并加上由服务端签发的用户名和密码加密的字符串, 服务端收到请求后再对用户名密码加密, 与后面携带的密文对比, 由于它也是保存在客户端浏览器上的, 所以也叫Cookie
二.Cookie简介
1.什么是Cookie
- Cookie是服务器保存在客户端浏览器之上的key-value键值对 :
username='shawn';password="123"
- 它是随着服务器的响应发送给客户端, 客户端将其保存, 下一次请求时会将Cookie放在其中, 服务器通过识别Cookie就能知道是哪个客户端浏览器
2.Cookie规范
- Cookie大小上限为4KB
- 一个服务器最多在客户端浏览器上保存20个Cookie
- 一个浏览器最多保存300个Cookie
上面是HTTP中Cookie的规范, 现在浏览器的竞争, 有些Cookie大小能打到8KB, 最多可以保存500个Cookie
不同浏览器之间的Cookie是不共享的
3.安全性
- Cookie保存在浏览器本地, 意味着很容易被窃取和篡改
三.Session简介
1.什么是Session
-
存放在服务器上的键值对 :
{'weqweq':{'username':'shawn','password':'123'}}
-
Cookie可以保存状态, 但本身最大只能支持4069字节, 并且不安全, 于是就出现了Session
-
它能支持更多字节, 并且保存在服务器上, 具有较高的安全性,Session基于Cookie, 本地存放服务器返回给浏览器的随机字符串
-
客户端浏览器请求中携带随机字符串(session_id), 服务端收到后与数据库中存储的session做对比
ps : session存储的方式多种多样, 可以是数据库、缓存、硬盘等等
2.Cookie、Session小结
1. cookie是存在于浏览器上的, 保存形式以key:value键值对的形式
2. session是存在于服务端的, django中保存在django_session表中, key: 对应session_key字段, value: 对应session_data, 还有一个session_date用来保存终止会话时间
3. session是基于cookie工作的, 在django中session会告知浏览器以sessionid:随机字符的格式保存数据
四.Token简介
1.什么是Token
- session数据保存在服务端, 提升了安全性, 但如果用户数据量特别多, 那么服务器的压力就会非常大
- 所以不再在服务端中保存数据
- Token采用了jwt(json web token)的认证方式, 数据格式分为三段式 :
{公司信息。。}.{name:lqz,id:10}.加密后的字符串
- 登入成功之后, 将第一段数据与第二段数据进行加密(加密算法是你后端开发自定义的), 加密后得到的字符串放在最后一段, 然后整体的返回给浏览器
- 浏览器下次访问的时候就会带着该信息, 服务端收到再取前两段进行加密与第三段对比
五.django中cookie的使用
1.Cookie四件套
- 增 :
obj.set_cookie('key','value)
- 查 :
request.COOKIE.get('key')
- 改 :
obj.set_cookie('key','value')
- 删 :
obj.delete_cookie('key')
2.Cookie四件套示例
- 增
def cookie_test(request):
# obj1 = HttpResponse()
# return obj1
# obj2 = render(request,'cookie_test.html')
# return obj2
obj = HttpResponse('生成了两个cookie')
# 设置cookie
obj.set_cookie('name','shawn')
obj.set_cookie('pwd','123')
return obj
- 查
# 获取cookie
def get_cookie(request):
name = request.COOKIES.get('name')
pwd = request.COOKIES.get('pwd')
return HttpResponse(f'获取到cookie,name:{name},pwd:{pwd}')
- 改
# 更新cookie,与设置一样
def set_cookie(request):
obj = HttpResponse('重新对cookie进行了设置')
obj.set_cookie('name','xing')
obj.set_cookie('pwd','11122')
return obj
- 删
# 删除cookie
def del_cookie(request):
obj = HttpResponse('删除了一个cookie')
obj.delete_cookie('name')
return obj
3.其他操作
- cookie加盐
# 为cookie进行加盐
def set_salt(request):
obj = HttpResponse('为name加了个盐中盐')
obj.set_cookie('name', 'shawn')
# 加盐操作
obj.set_signed_cookie('name', 'shawn', salt='盐中盐')
return obj
# 获取加盐的cookie
def get_salt(request):
name_salt = request.COOKIES.get('name')
salts = request.get_signed_cookie('name', salt='盐中盐')
return HttpResponse(f'获取到加盐的cookie名:{salts}\n加盐后的cookie:{name_salt}')
- 设置超时时间, 直接在设置cookie的时候加参数(两种方法)
# expires常用,支持IE浏览器(以秒为单位)
def set_timeout(request):
obj = HttpResponse('超时删除cookie')
obj.set_cookie('name', 'shawn', max_age=5