?? cookie、session、token,是我们工作中经常接触,但是具体什么区别,原理是什么,可能不太清楚。那现在我们一起再来学习下吧。
?? 大家都知道,http是一种无状态的超文本传输协议,也就是说服客户端的每次请求都是全新的请求,服务器不知道客户端历史请求的数据。为了弥补这个缺陷,也就引入了cookie和session。
cookie和session
?? 当客户端发起请求后,服务端会在内存中开辟一个空间,这个对象就是session对象,数据类型是concurrentHashMapl,用于存储此次会话的用户操作记录。cookie是服务器发送到浏览器的一小段数据,服务器下发给浏览器的这部分数据,浏览器就行存储,下次请求时候会带上这些数据,他是实现session的一种方式。当然我们要注意的是,session的实现并不是只有通过cookie的,即使浏览器禁用了cookie,也有其他方式实现seesion。
seesion创建过程如下图:
1、首次发起请求后,服务端创建session对象,并将sessionid和响应数据返回给客户端
2、客户端通过响应头中的set-cookie中返回的seesionid,将sessionid存储在浏览器cookie中,(在这个过程中设置的cookie的过期时间,如果设置过期时间,cookie会到设置的时间过期,如果没有设置此次会话结束,cookie也就过期)
3、再次发起请求时,携带cookie发送给服务端
4、服务端判断cookie中的sessionid是否是合法的,如果不合法,返回错误提示,如果合法继续后续的逻辑,并返回最终的响应结果
token
以JWT(json web token)为例,token分为三个部分:头部,载荷和签名
如下图:
红色部分是头部Header:指定token类型和签名类型;
紫色是载荷:储存用户id等信息;
蓝色的为签名:保证整个信息的完整性、可靠性如下图:基于token实现的交互图 1、客户端发送用户信息请求登陆2、账号如果存在,且密码正确,生成token字符串并下发给客户端3、客户端保持token,并在下次请求时携带4、服务端验证token有效后,处理请求,并返回内容,如果token无效时,返回登陆失败
最后列下session、cookie、token三种的对比图
session | cookie | token | |
---|---|---|---|
储存端 | 服务端 | 客户端(浏览器) | 客户端 |
存储值 | 不限,当访问增多时,性能降低 | 不超过4kb,每个浏览器最多20个 | 由开发这设定 |
安全性 | 比cookie高,篡改者只能看到session_id,看不到其他信息 | 不安全,本地cookie易被盗取或者篡改 | 安全,服务端加密生成的名牌,存储在客户端无法解密 |
支持跨域 | 支持跨域需要特殊处理,比如基于代理服务实现 | 支持跨域需要特殊处理,比如基于代理服务实现 | 支持跨域 |
缺点 | 数据存储在内存中,意味着用户下次请求必须在这台服务器上,这样才能获得授权,这样在分布式的应用上就限制了应用的扩展能力 | 安全性差,大小受限 | 登陆状态信息需要续签(为了避免token实现后用户重新登陆,每次返回返回一个最新的token替代旧的token) |
ps:如有错误,欢迎纠正!