Cookie、Session和Token的详解

什么是Cookie、Session和Token?

1. Cookie

什么是Cookie?
Cookie是存储在浏览器端的一小段文本数据,由服务器通过HTTP响应头的Set-Cookie字段发送给浏览器,浏览器随后会自动在每次请求中通过Cookie头将其带回给服务器。

工作流程

  1. 用户第一次访问服务器;
  2. 服务器通过响应头Set-Cookie返回一个 Cookie;
  3. 浏览器保存 Cookie;
  4. 以后每次请求都会自动携带该Cookie

2. Session

什么是Session?
Session是存储在服务器端的用户状态信息。服务器为每个用户创建一个唯一的Session ID,并通过Cookie将这个ID传递给浏览器,浏览器后续请求时带上这个ID,服务器就能识别用户身份

  • SessionId通常放在 Cookie 里

工作流程

  1. 用户第一次访问 → 服务器创建 Session;
  2. 服务器生成一个SessionId
  3. 通过 Cookie 发给浏览器;
  4. 后续请求:浏览器携带 SessionId
  5. 服务器根据 SessionId 找到对应 Session 数据。
  • 数据存在服务器,安全性高

3. Token

什么是Token?
Token是服务器生成的一串“访问凭证字符串”,用于身份认证,通常不依赖服务器存储状态(无状态)

工作流程(以 JWT 为例)

  1. 用户登录成功;
  2. 服务器生成 Token(包含用户信息);
  3. 返回给客户端;
  4. 客户端存储 Token(Cookie / LocalStorage);
  5. 每次请求在请求头携带:Authorization: Bearer token值
  6. 服务器校验 Token 是否合法
  • 无状态(不依赖服务器存储)
  • 经常用在OAuth2 / JWT 登录体系

4. 三者的主要区别

  1. Cookie ≠ Session
  • Cookie 是 客户端
  • Session 是 服务器端
  • 但:Session 通常通过 Cookie 传 SessionId
1
2
Cookie 存的是 SessionId
Session 存的是用户真实数据
  1. Token 可以完全替代 Session

现代系统通常这样做:

1
2
不再用 Session
只用 Token + JWT
  1. Cookie、Session、Token 对比总结
对比项 Cookie Session Token
存储位置 客户端 服务器 客户端
安全性
是否占服务器内存 ✅ 是
是否支持分布式 ❌ 默认不支持
是否无状态
是否前后端分离友好
是否自动携带 ✅(通过 Cookie) ❌(需手动加 Header)

5. JWT:现代化的Token标准

JWT 是一种“自包含”的 Token 格式标准,用来在客户端和服务器之间安全地传递用户身份信息。
本质上:

  • Token

  • 是一种统一的Token 格式规范

  • JWT = 身份证格式

  • Token = 身份证号码

JWT的结构

1
2
3
4
xxxxx.yyyyy.zzzzz

// 也就是:
Header.Payload.Signature

三部分组成:

部分 作用
Header 说明算法类型
Payload 存放用户数据(userId、角色、过期时间等)
Signature 防篡改签名

Sa-Token 和 JWT 的关系

对比 JWT Sa-Token
类型 Token 规范 Token 框架
是否是标准 ✅ 是国际标准 ❌ 不是标准
是否直接用 ✅ 可直接用 ✅ 可直接用
是否包含权限体系 ❌ 不包含 ✅ 包含
是否支持踢人 ❌ 天然不支持 ✅ 支持
是否支持 Redis ❌ 只能自己写 ✅ 原生支持

6. 应用场景

项目类型 推荐方案
传统 JSP / Thymeleaf 项目 ✅ Cookie + Session
企业后台管理系统(低并发) ✅ Session
前后端分离 Web 项目 ✅ JWT
SpringCloud 微服务 ✅ JWT
App / 小程序 ✅ JWT
单点登录 SSO ✅ JWT
高并发系统 ✅ JWT
电商、秒杀系统 ✅ JWT

END