手打不易,如果转摘,请注明出处!
注明原文:https://zhangxiaofan.blog.csdn.net/article/details/133498756
文章目录
- 简析Cookie、Session、Token
-
- [什么是 Cookie ?](#什么是 Cookie ?)
- [什么是 Session ?](#什么是 Session ?)
- [Cookie 和 Session 到底是什么关系?](#Cookie 和 Session 到底是什么关系?)
- [什么是 Token ?](#什么是 Token ?)
- [Session VS Token ?](#Session VS Token ?)
- 总结
简析Cookie、Session、Token
什么是 Cookie ?
- cookie 存储在前端
例如第一次请求后端,会创建一个 sessionId 返回给前端,那么前端就会把 sessionId:xxxx 保存到 cookie 中, 下次请求的时候,前端会携带这个数据发送到后端。 - cookie 无法跨域
- cookie 只支持存储字符串数据, 大部分浏览器都不能超过 4KB
例如某次访问CSDN中的cookie
json
{
Cookie:
JSESSIONID=5124fa26-9334-4c7d-9123-6141b14b9c92;
uuid_tt_dd=10_20850520640-1656988062941-486962;
UserName=qXXXX4;
UserInfo=8d100c5XXX4dd7a3fbc5e97;
UserToken=8d100c5XXX0f4dd7a3fbc5e97;
UserNick=Mr.XXX.;
...
}
什么是 Session ?
- session 存储在后端
session 用于记录前后端会话信息,本身是基于 cookie 实现的,session 存储在后端(例如:redis),sessionId 则存储在前端的 cookie 中。因此 session 相对来说更安全。
简单的来说:sessionID 是连接 Cookie 和 Session 的一道桥梁 ;
注意:这并不是说它是唯一的桥梁,我们也可以在 sessionId 拼接在请求 url 的 parameter 中。 - session 能存储任意Object对象,大小理论上不限制,只要内存够。
一般session存哪些信息?
例如 org.apache.shiro.session.mgt.SimpleSession
就存储了以下信息:
java
private transient Serializable id;
private transient Date startTimestamp;
private transient Date stopTimestamp;
private transient Date lastAccessTime;
private transient long timeout;
private transient boolean expired;
private transient String host;
private transient Map<Object, Object> attributes;
包括:id、时间戳、过期时间、host、各种属性 attributes Map等等。
Cookie 和 Session 到底是什么关系?
网上一大把的文章都在对比 cookie 和 session。
严格来说, cookie 是一种存储方式, session 是会话记录。它们不应该看成一个维度的概念 。
相同点就是它们都可以用来存储用户信息。
cookie 安全性、存储量有一定限制,但不会占用服务端资源。
session 安全性高、存储信息大,认证会话信息一般都存放在 session。
cookies 只是一种可以用来实现 session 的方式,但并不是唯一,理论上只要 sessionId 可以通过其他安全方式传输到服务端就行。
我也是比较 反对直接拿 cookie 和 session 做对比的 。
因此笔者认为,如果非要加一层关系,那么可以看成 协作互补。
什么是 Token ?
说到 token ,这里必须说一下 token 可以简单看成 2 大类型:
一种是本身不携带信息 的token(传统token);
一种是本身就携带用户或认证信息 的 token(例如JWT);
sessionId 就可以看成一个传统的 token。
token 就是一个令牌,前端请求发送到服务端,验证成功后,后端会生成一个 token 给前端,前端下次请求(有效期内)只需要带着这个 token 就可以访问后端API。
对于传统的 Token 来讲 ,服务端拿到 token 后需要去查数据库(Mysql、Redis等)校验是否过期或者是否有效
对于JWT这种类型的 Token 来讲,服务端本身是不存储信息的,直接通过解密和验证JWT即可。
Session VS Token ?
很多人直接把这两者进行比较,这样容易受误导。因为 Token 是有不同的实现方式,有的携带认证信息,有的不携带认证信息,那么在比较的时候,就要区分开来。
- session 是把会话信息到了服务端, 让本身无状态的 HTTP 变得
有状态
, 而 Token 是为了让服务端无状态
. - session 存储用户信息到服务端后,返回 sessionId 给前端,用于 sessionId 的随机性,所以可以看成 session 存储是安全的。 传统的 token 也需要存储信息到服务端,sessionId 就可以看成一个传统的 token 。而 JWT这类Token 是本身携带信息的 token,无需存储到后端服务器。
- session 可以看成
空间换时间
, JWT这类Token 可以看成时间换空间
,传统的 token 实际上也占用了空间。 - token 实现跨域更方便,因为本身就是让服务端
无状态
。
总结
- Cookie 和 Session 不要直接拿来对比, Cookie 是一种前端存储方式 ,Session 是存在服务端的会话记录 。详情看:[Cookie 和 Session 到底是什么关系?](#Cookie 和 Session 到底是什么关系?)
- Session 与 Token 做比较的时候,也要区分是 传统Token 还是 JWT之类的token