Cookie、Session、Token和JWT的区别讲解

Cookie、Session和token的区别


发展史


一、在互联网刚开始的时候,Web 基本上就是文档的浏览而已,既然是浏览,作为服务器, 不需要记录谁在某一段时间里都浏览了什么文档,每次请求都是一个新的HTTP协议, 就是请求加响应, 尤其是我不用记住是谁刚刚发了HTTP请求, 每个请求对我来说都是全新的。所以说这时候开发特别简单。单纯的获取服务器资源


二、后来随着需求业务的增加,需要记住登陆用户的身份。服务器必须将每个用户的身份给识别出来。但是在这个时候问题就出来了,因为HTTP请求时无状态的。


在这里讲解一下什么是HTTP请求的无状态?


1、服务器不保留与客户交互时的任何信息以及状态。大致就是说用户的每次请求与你的其它请求没有半毛钱的关系。
这就出现了一个问题,那我们如何记录用户的状态及如何区分用户呢?
2、既然HTTP不能记录,那我们应该如何用其他方法解决这个问题呢。
那就出现了Cookie和Session,请你们记住,这两个玩意就是为了让HTTP客观上有状态的。


Cookie和Session


Cookie是储存在客户端的,Session是储存在服务端的。


注意:

  • cookie是没有过期时间的。
	1、只是它的保存时间是一个会话周期(session), 临时性Cookie,不会被持久化,也就是当你关闭你的浏览器后,
	  这个cookie就会消失,
	2、但是cookie有expires属性,可以设置失效时间,如果Cookie没有设置expires属性,cookie 的生命周期只是在当前的会话中,如果expires设置一个过去的时间点,那么这个cookie 会被立即删掉(失效)
	3、 关闭浏览器意味着这次会话的结束,此时 cookie 随之失效。

Cookie的实现过程:
	1、客户端请求服务器后,如果服务器需要记录用户状态,服务器会在响应信息中包含一个Set-Cookie的响应头			  
	2、客户端会根据这个响应头存储Cookie信息。再次请求服务器时,客户端会在请求信息中包含一个Cookie请求头。
	3、服务器会根据这个请求头进行用户身份、状态等较验.
Session的实现过程:
	反正就是服务端生成,存储在服务器的内存中以及保存在文件或数据库中,返回给前端储存到cookie中,
    1、session是有过期时间的,可以设置过期时间或者服务器关闭就会消失
    2、session多了服务端会有内存压力,这就需要负载均衡了以及不同服务器的session共享问题。

这对服务器说是一个巨大的开销 , 严重的限制了服务器扩展能力, 比如说用户用两个机器组成了一个集群, 用户通过机器A登录了系统, 那session id会保存在机器A上, 假设用户的下一次请求被转发到机器B怎么办?机器B可没有我的 session id啊。
有时候会采用一点小伎俩: session sticky(会话粘黏) , 就是用户的请求一直粘连在机器A上, 但是这也不管用, 要是机器A挂掉了, 还得转到机器B去。
那只好做session 的复制了, 把session id 在两个机器之间搬来搬去。这样特别麻烦。


为了解决服务器压力,之后出现了token和JWT。为什么会出现这个呢,最好的方法是不是服务端最好不用存储类似于sessionId的数据。


Token 和JWT

首先都叫令牌,你就想想着古代皇上御赐的腰牌吧。

Token

Token,我个人理解的话和session区别不大,但是session会消耗服务器内存,但是我自己做的项目就是后端自己生成的Token,然后存入数据库或者缓冲层,返回给前端,就这个样子。

具体流程:
1、前端发起登录请求,后端接受请求后生成token,储存在缓冲层,设置失效时间。
2、返回给前端,然后前端储存在localstorage。。等等
3、前端每次请求,就在请求头里面携带这个token,后端设置拦截器,每次请求前置时查看这个token与缓冲
层里面的token是否一直,一直就放行,不一直就返回false
JWT
全称:JSON WEB TOKEN 可以使用在RESTFUL接口定义, 也可以使用在普通的web
组成
第一部分为头部(header),第二部分我们称其为载荷(payload),第三部分是签证(signature)
具体流程
1、 在头部信息中声明加密算法和常量, 然后把header使用json转化为字符串
2、在载荷中声明用户信息,同时还有一些其他的内容;再次使用json 把载荷部分进行转化,转化为字符串
(但是你觉得载荷中应不应该放置敏感的信息,当然不行,因为有效载荷中的内容是base64进行编码的,并不是进行加密的,而且JWT存储在localstorage等等,能够被获取到)
3、 使用在header中声明的加密算法和每个项目随机生成的secret来进行加密, 把第一步分字符串和第二部分的字符串进行加密, 生成新的字符串。此字符串是独一无二的。
4、解密的时候,只要客户端带着JWT来发起请求,服务端就直接使用secret进行解密。

JWT的话推荐这大佬的,非常详细,有Java相关代码。
此外,JWT还可以使用双token模式,即token在后端存储。
关于前端如何存储的token的话可以采取这位大佬的讲解


参考相关文章:

  • https://blog.csdn.net/AkiraNicky/article/details/99307713
  • https://blog.csdn.net/m19123456789
  • https://blog.csdn.net/weixin_30548917/article/details/96607045
  • https://blog.csdn.net/qq_36894974/article/details/105322171
    (如若有遗漏请联系我)

允许转载,若有侵权,将进行追究

若侵权他人,请联系我,进行删除,谢谢

来自一个写代码的小哥哥

若有错误,请联系我,进行修改


写代码,挣钱,努力,挣钱,run,run,run

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值