Session、Cookie、Token 详解(原理 + 区别 + 实战)
一、为什么需要 Session / Cookie / Token?
HTTP 协议有一个非常重要的特点:
👉无状态
也就是说,每一次请求都是独立的,服务器不会记住你是谁。
例如:
登录 → 下一个请求 → 服务器不知道你是否登录过所以就需要一种机制来:
👉记录用户身份状态
二、Cookie 详解
1. 什么是 Cookie?
Cookie 是:
👉存储在浏览器端的一小段数据
由服务器生成,并发送给客户端保存。
2. 工作流程
客户端请求 → 服务器响应 → Set-Cookie ↓ 浏览器保存 Cookie ↓ 后续请求自动携带 Cookie3. 示例
Set-Cookie: username=admin之后请求:
Cookie: username=admin4. Cookie 特点
存储在客户端
自动随请求发送
有大小限制(一般 4KB)
可以设置过期时间
5. Cookie 问题
❌ 不安全(容易被窃取)
❌ 容量小
❌ 依赖浏览器
三、Session 详解
1. 什么是 Session?
Session 是:
👉存储在服务器端的用户会话数据
2. 工作流程
1. 用户登录 2. 服务器创建 Session(保存用户信息) 3. 返回 SessionID 给客户端(通过 Cookie) 4. 后续请求携带 SessionID 5. 服务器通过 SessionID 查找用户信息3. 关键点
👉 Session ≠ Cookie
Session:数据(服务器)
Cookie:载体(客户端)
4. 示例流程
Cookie: JSESSIONID=abc123服务器:
SessionMap: abc123 → 用户信息5. Session 优点
✅ 数据安全(存在服务器)
✅ 可存储复杂数据
6. Session 缺点
❌ 占用服务器内存
❌ 分布式系统难以共享
❌ 扩展性差
四、Token 详解
1. 什么是 Token?
Token 是:
👉一种身份认证凭证(字符串)
常见实现:
JWT(JSON Web Token)
2. 工作流程
1. 用户登录 2. 服务器生成 Token 3. 返回给客户端 4. 客户端存储 Token 5. 每次请求携带 Token 6. 服务器校验 Token3. 请求示例
Authorization: Bearer xxxxxxx4. Token 特点
无状态(服务器不存储)
可跨域
适合分布式系统
5. Token 优点
✅ 无需服务器存储
✅ 支持分布式
✅ 扩展性强
6. Token 缺点
❌ 一旦泄露风险较大
❌ 不容易主动失效(需额外机制)
五、三者核心区别
1. 对比表
| 特性 | Cookie | Session | Token |
|---|---|---|---|
| 存储位置 | 客户端 | 服务器 | 客户端 |
| 安全性 | 低 | 高 | 中 |
| 是否无状态 | 否 | 否 | 是 |
| 分布式支持 | 差 | 差 | 强 |
| 容量 | 小 | 大 | 中 |
| 依赖浏览器 | 是 | 是 | 否 |
2. 一句话总结
👉 Cookie:存数据
👉 Session:存状态
👉 Token:做认证
六、三者关系(重点理解)
关系图
Cookie ← 存储 SessionID Session ← 存储用户数据 Token ← 替代 Session 的方案经典组合
👉 Session + Cookie
Cookie 存 SessionID Session 存用户数据👉 Token 模式
客户端存 Token 服务器只负责校验七、实际开发中的选择
1. 单体应用(传统)
👉 使用:
Session + Cookie2. 前后端分离
👉 使用:
Token(JWT)原因:
支持跨域
前端可控
更灵活
3. 分布式系统
👉 推荐:
Token
或 Session + Redis
八、安全问题(面试重点)
1. Cookie 风险
XSS(跨站脚本攻击)
CSRF(跨站请求伪造)
2. Token 风险
Token 被盗用
3. 防护措施
HTTPS
HttpOnly Cookie
Token 设置过期时间
Refresh Token 机制
九、面试高频问题
1. Session 和 Cookie 的区别?
👉 Session 在服务端,Cookie 在客户端
👉 Cookie 存 SessionID
2. Token 为什么适合分布式?
👉 因为:
无状态
不依赖服务器存储
3. JWT 由哪几部分组成?
Header.Payload.Signature4. 如何实现登录认证?
常见流程:
登录 → 生成 Token → 返回 → 请求携带 → 校验十、总结(速记版)
HTTP 无状态 → 需要身份认证机制
Cookie:客户端存数据
Session:服务端存数据
Token:无状态认证
现代开发:Token 为主
