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

- 用户第一次访问服务器;
- 服务器通过响应头
Set-Cookie返回一个 Cookie; - 浏览器保存 Cookie;
- 以后每次请求都会自动携带该Cookie。
2. Session
什么是Session?
Session是存储在服务器端的用户状态信息。服务器为每个用户创建一个唯一的Session ID,并通过Cookie将这个ID传递给浏览器,浏览器后续请求时带上这个ID,服务器就能识别用户身份。
- SessionId通常放在 Cookie 里
工作流程
- 用户第一次访问 → 服务器创建 Session;
- 服务器生成一个
SessionId; - 通过 Cookie 发给浏览器;
- 后续请求:浏览器携带
SessionId; - 服务器根据
SessionId找到对应 Session 数据。
- 数据存在服务器,安全性高
3. Token
什么是Token?
Token是服务器生成的一串“访问凭证字符串”,用于身份认证,通常不依赖服务器存储状态(无状态)
工作流程(以 JWT 为例)
- 用户登录成功;
- 服务器生成 Token(包含用户信息);
- 返回给客户端;
- 客户端存储 Token(Cookie / LocalStorage);
- 每次请求在请求头携带:
Authorization: Bearer token值 - 服务器校验 Token 是否合法
- 无状态(不依赖服务器存储)
- 经常用在OAuth2 / JWT 登录体系
4. 三者的主要区别
- Cookie ≠ Session
- Cookie 是 客户端 的
- Session 是 服务器端 的
- 但:Session 通常通过 Cookie 传
SessionId
1 | |
- Token 可以完全替代 Session
现代系统通常这样做:
1 | |
- Cookie、Session、Token 对比总结
| 对比项 | Cookie | Session | Token |
|---|---|---|---|
| 存储位置 | 客户端 | 服务器 | 客户端 |
| 安全性 | 低 | 高 | 中 |
| 是否占服务器内存 | 否 | ✅ 是 | 否 |
| 是否支持分布式 | ✅ | ❌ 默认不支持 | ✅ |
| 是否无状态 | ❌ | ❌ | ✅ |
| 是否前后端分离友好 | ❌ | ❌ | ✅ |
| 是否自动携带 | ✅ | ✅(通过 Cookie) | ❌(需手动加 Header) |
5. JWT:现代化的Token标准
JWT 是一种“自包含”的 Token 格式标准,用来在客户端和服务器之间安全地传递用户身份信息。
本质上:
是 Token
是一种统一的Token 格式规范
JWT = 身份证格式
Token = 身份证号码
JWT的结构
1 | |
三部分组成:
| 部分 | 作用 |
|---|---|
| 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 |