Session 与 Cookie 会话管理

3 min

来源:https://zhuanlan.zhihu.com/p/631349844

为什么需要会话管理?

HTTP 是无状态协议,每次请求都是独立的,服务器不知道两次请求是否来自同一用户。Cookie 和 Session 就是用来解决这个问题的。


Cookie

什么是 Cookie?

  • 存储在浏览器端的小型数据文件
  • 由服务器通过 Set-Cookie 响应头设置
  • 浏览器后续请求会自动携带 Cookie

工作流程:

  1. 浏览器首次请求服务器
  2. 服务器返回响应,附带 Set-Cookie
  3. 浏览器保存 Cookie
  4. 后续请求自动在 Cookie 头中携带
# 服务器响应
HTTP/1.1 200 OK
Set-Cookie: session_id=abc123; Path=/; HttpOnly; Max-Age=3600

# 浏览器后续请求
GET /api/user HTTP/1.1
Cookie: session_id=abc123

主要属性:

属性说明
Name=ValueCookie 名称和值
PathCookie 生效的路径
DomainCookie 生效的域名
Max-Age过期时间(秒),不设置则为会话 Cookie
Expires过期时间点
HttpOnly禁止 JavaScript 访问,防止 XSS
Secure仅通过 HTTPS 传输
SameSite限制跨站请求携带(Strict/Lax/None)

Session

什么是 Session?

  • 存储在服务器端的会话数据
  • 通过 Session ID 关联用户
  • 比 Cookie 更安全,敏感数据不暴露给客户端

工作流程:

  1. 浏览器首次请求,服务器创建 Session,生成 Session ID
  2. 服务器将 Session ID 通过 Cookie 发送给浏览器
  3. 浏览器后续请求携带 Session ID
  4. 服务器根据 Session ID 查找对应的 Session 数据
服务器内存/数据库:
┌─────────────────────────────────┐
│ Session Store                   │
├──────────────┬──────────────────┤
│ Session ID   │ Session Data     │
├──────────────┼──────────────────┤
│ abc123       │ {user: "张三"}    │
│ def456       │ {user: "李四"}    │
└──────────────┴──────────────────┘

Cookie vs Session 对比

特性CookieSession
存储位置浏览器端服务器端
安全性较低(可被查看/篡改)较高(数据在服务器)
数据大小限制约 4KB无明确限制
生命周期可设置长期有效通常会话结束或超时失效
服务器压力需要存储空间
跨域支持可通过 Domain 设置通常不支持

使用场景

Cookie 适用:

  • 记住用户名、偏好设置
  • 跟踪用户行为(非敏感)
  • 长期登录状态

Session 适用:

  • 用户登录状态
  • 购物车数据
  • 敏感信息临时存储

常见安全问题

攻击类型说明防御措施
XSS(跨站脚本)恶意脚本窃取 Cookie设置 HttpOnly
CSRF(跨站请求伪造)伪造用户请求设置 SameSite、使用 CSRF Token
Session 固定攻击强制用户使用攻击者的 Session ID登录后重新生成 Session ID
Session 劫持窃取 Session ID使用 HTTPS、设置 Secure