wangguangwu
wangguangwu
发布于 2024-11-26 / 49 阅读
0
0

Cookie、Session、Token 的总结及示例

1.1 概述

  • 是什么:Cookie 是服务器通过 HTTP 响应发送到客户端的小型数据,存储在客户端并在后续请求中携带,用于状态保持或存储简单数据。
  • 作用:会话管理(如用户登录状态)、个性化设置(如语言选择)、跟踪分析(如统计用户行为)。
  • 特点
    • 存储在客户端,由浏览器管理。
    • 可设置有效期、路径等属性。
    • 安全属性包括 HttpOnlySecure

1.2 HTTP 报文示例

HTTP/1.1 200 OK
Set-Cookie: sessionId=abc123; Path=/; HttpOnly; Secure
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. 总结三者区别

特性CookieSessionToken
存储位置客户端(浏览器)服务器客户端
状态管理有状态有状态无状态
适用场景保存少量数据用户会话管理分布式身份认证、跨平台
安全性依赖属性(如 HttpOnly、Secure)需要加密存储通常基于加密和签名
性能表现数据量小,对服务器性能无直接影响数据存储占用服务器内存或数据库减轻服务器负担,适合分布式系统

5. 使用场景

  • Cookie + Session:适用于传统 Web 应用,保持会话状态。
  • Token:适用于分布式系统、移动端或单页应用(SPA),结合 HTTPS 提高安全性。

评论