1. Cookie
1.1 概述
- 是什么:Cookie 是服务器通过 HTTP 响应发送到客户端的小型数据,存储在客户端并在后续请求中携带,用于状态保持或存储简单数据。
- 作用:会话管理(如用户登录状态)、个性化设置(如语言选择)、跟踪分析(如统计用户行为)。
- 特点:
- 存储在客户端,由浏览器管理。
- 可设置有效期、路径等属性。
- 安全属性包括
HttpOnly
和 Secure
。
1.2 HTTP 报文示例
1.2.1 服务器设置 Cookie
HTTP/1.1 200 OK
Set-Cookie: sessionId=abc123; Path=/; HttpOnly; Secure
1.2.2 客户端携带 Cookie
GET /dashboard HTTP/1.1
Cookie: sessionId=abc123
1.3 优缺点
- 优点:
- 在客户端保存,减少服务器存储压力。
- 简单易用,可设置多种属性控制行为。
- 缺点:
- 易受到安全威胁(如 XSS、CSRF 攻击)。
- 数据存储量有限,浏览器有大小和数量限制。
2. Session
2.1 概述
- 是什么:Session 是服务器端保存的会话状态,通常依赖于 Session ID 实现,Session ID 通过 Cookie 或其他方式传递给客户端。
- 作用:在服务器端记录用户状态(如购物车信息、权限信息)。
- 特点:
- 存储在服务器端,生命周期由服务器控制。
- 通常与 Cookie 配合,通过
sessionId
标识会话。
- 在分布式系统中,需要解决会话共享问题。
2.2 HTTP 报文示例
2.2.1 服务器设置 Session ID
HTTP/1.1 200 OK
Set-Cookie: JSESSIONID=xyz789; Path=/; HttpOnly
2.2.2 客户端携带 Session ID
GET /profile HTTP/1.1
Cookie: JSESSIONID=xyz789
2.3 优缺点
- 优点:
- 在服务器端存储状态,安全性更高。
- 可存储复杂的用户数据。
- 缺点:
- 服务器需要维护会话,增加存储压力。
- 在分布式系统中,Session 共享较复杂。
3. Token
3.1 概述
- 是什么:Token 是服务器生成的加密字符串,通常用于无状态的身份验证。客户端持有 Token,后续请求中通过
Authorization
头传递。
- 作用:在分布式系统中实现身份验证,常用于 OAuth、JWT 等认证机制。
- 特点:
- 无需在服务器端保存状态,具备跨平台性。
- 包含身份和权限信息(如 JWT)。
- 通常有过期时间,防止长期有效。
3.2 HTTP 报文示例
3.2.1 服务器返回 Token
HTTP/1.1 200 OK
Content-Type: application/json
{
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
}
3.2.2 客户端携带 Token
GET /secure-data HTTP/1.1
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
3.3 优缺点
- 优点:
- 无需在服务器端存储状态,适合分布式系统。
- 支持跨平台、跨域访问。
- 缺点:
- Token 加密和验证需要额外计算开销。
- 若被泄露,可能导致安全问题。
4. 总结三者区别
特性 | Cookie | Session | Token |
---|
存储位置 | 客户端(浏览器) | 服务器 | 客户端 |
状态管理 | 有状态 | 有状态 | 无状态 |
适用场景 | 保存少量数据 | 用户会话管理 | 分布式身份认证、跨平台 |
安全性 | 依赖属性(如 HttpOnly、Secure) | 需要加密存储 | 通常基于加密和签名 |
性能表现 | 数据量小,对服务器性能无直接影响 | 数据存储占用服务器内存或数据库 | 减轻服务器负担,适合分布式系统 |
5. 使用场景
- Cookie + Session:适用于传统 Web 应用,保持会话状态。
- Token:适用于分布式系统、移动端或单页应用(SPA),结合 HTTPS 提高安全性。