Session 与 Cookie 会话管理
3 min
为什么需要会话管理?
HTTP 是无状态协议,每次请求都是独立的,服务器不知道两次请求是否来自同一用户。Cookie 和 Session 就是用来解决这个问题的。
Cookie
什么是 Cookie?
- 存储在浏览器端的小型数据文件
- 由服务器通过
Set-Cookie响应头设置 - 浏览器后续请求会自动携带 Cookie
工作流程:
- 浏览器首次请求服务器
- 服务器返回响应,附带
Set-Cookie头 - 浏览器保存 Cookie
- 后续请求自动在
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=Value | Cookie 名称和值 |
Path | Cookie 生效的路径 |
Domain | Cookie 生效的域名 |
Max-Age | 过期时间(秒),不设置则为会话 Cookie |
Expires | 过期时间点 |
HttpOnly | 禁止 JavaScript 访问,防止 XSS |
Secure | 仅通过 HTTPS 传输 |
SameSite | 限制跨站请求携带(Strict/Lax/None) |
Session
什么是 Session?
- 存储在服务器端的会话数据
- 通过 Session ID 关联用户
- 比 Cookie 更安全,敏感数据不暴露给客户端
工作流程:
- 浏览器首次请求,服务器创建 Session,生成 Session ID
- 服务器将 Session ID 通过 Cookie 发送给浏览器
- 浏览器后续请求携带 Session ID
- 服务器根据 Session ID 查找对应的 Session 数据
服务器内存/数据库:
┌─────────────────────────────────┐
│ Session Store │
├──────────────┬──────────────────┤
│ Session ID │ Session Data │
├──────────────┼──────────────────┤
│ abc123 │ {user: "张三"} │
│ def456 │ {user: "李四"} │
└──────────────┴──────────────────┘Cookie vs Session 对比
| 特性 | Cookie | Session |
|---|---|---|
| 存储位置 | 浏览器端 | 服务器端 |
| 安全性 | 较低(可被查看/篡改) | 较高(数据在服务器) |
| 数据大小 | 限制约 4KB | 无明确限制 |
| 生命周期 | 可设置长期有效 | 通常会话结束或超时失效 |
| 服务器压力 | 无 | 需要存储空间 |
| 跨域支持 | 可通过 Domain 设置 | 通常不支持 |
使用场景
Cookie 适用:
- 记住用户名、偏好设置
- 跟踪用户行为(非敏感)
- 长期登录状态
Session 适用:
- 用户登录状态
- 购物车数据
- 敏感信息临时存储
常见安全问题
| 攻击类型 | 说明 | 防御措施 |
|---|---|---|
| XSS(跨站脚本) | 恶意脚本窃取 Cookie | 设置 HttpOnly |
| CSRF(跨站请求伪造) | 伪造用户请求 | 设置 SameSite、使用 CSRF Token |
| Session 固定攻击 | 强制用户使用攻击者的 Session ID | 登录后重新生成 Session ID |
| Session 劫持 | 窃取 Session ID | 使用 HTTPS、设置 Secure |