一、相同点
都是用于身份验证
二、不同点
1. 存储位置不同
Cookie和Token存储在客户端
Session存储在服务器端
例子:F12打开控制台,在application(应用)中可看到Ccokie、Token等信息,Token可以放在local storage、cookie或者session storage里面,如下图:
2.身份验证机制不同
Session+Cookie验证机制:
Session是用户第一次登录时,在服务器开辟一块内存空间保存用户登录相关信息,并返回一个SessionId给客户端保存,一般保存在Cookie里面。下次客户端发送请求时,会自动把Cookie发送给服务器,服务器拿到Cookie中的SessionId,通过SessionId查找到保存在服务器端的用户信息进行身份验证。
注意:Session和Cookie都可以单独使用,只不过只用Cookie如果用户登录信息都存Cookie会不安全;Session也不一定要跟Cookie同时使用,有些时候Cookie禁用后,SessionId可保存在local storage或者session storage,传递的时候通过url地址或者header传递。
JWT(json web token)验证机制:
Token是用户第一次登录时,服务器用一定的算法规则生成一个Token返回会客户端保存。这个Token不会保存在服务器端,Token本身包含了所有的用户信息,下次发送请求时,客户端可以把Token发送给服务器,由于服务器解密后进行身份验证。
3.安全性不同
安全性:Cookie<Session<Token
Cookie保存在客服端比较容易窃取。Session保存在服务服务器端相对安全。Token最安全因为Token的生成规则安全性比较高且有效期短不容易被篡改,防篡改但是不防盗用。
• PS:JWT生成的Token包含:header(头部,编码前JSON格式)+payload(载荷,编码前JSON格式))+signature(签名)。签名中由于包含了只有服务器知道的私密算法,所以比较安全。
4.时间空间效率不同
Session是以空间换时间:保存在服务器端会消耗服务器的内存,但是鉴权时间快
Token反过来:加解密过程比较耗时,但是节省服务器内存
5. 多服务器负载均衡的影响不同
Session在多台服务器进行负载均衡时如果没有对应的session共享机制比较容易出问题,例如创建Session是在服务器A但是下次请求到服务器B,就会出现未登录情况
6.发送请求时浏览器自动添加Cookie到请求中,Token需要开发主动添加
7.Session会在服务器端记录会话状态,而Token使服务器无状态化,无状态话以为server没有保存client的状态信息,所以发送的请求必须包含能够让服务器理解的全部信息,包含自己的状态信息。
http请求本身是无状态的,无状态意味着上一次请求和下一次请之间是完全独立没有关系的,服务器无法识别这些请求是否由同一个人发送。导致用户操作时每发送一次请求就需要重新登录一次。为了解决这个问题才诞生了Session和Token这种身份验证机制。