第3章 · Session-Cookie认证
有状态的经典会话机制:Session 工作原理、Cookie 机制、交互流程与安全防护。
3.1 Session 工作原理
Session(会话)是服务器端为每个用户维护的临时数据存储。用户登录后,服务器创建一个唯一的 Session ID,并将用户数据(角色、ID等)保存在内存/缓存中。后续请求携带该 ID,服务器据此恢复上下文。
核心特征:无状态协议(HTTP)通过 Session 获得“有状态”能力。Session 数据存储在服务端,客户端仅持有标识符。
服务器通过 Session ID 查找对应的数据区,完成用户身份识别。常用存储介质:内存、Redis、数据库。
3.2 Cookie 机制
Cookie 是浏览器存储的小型文本(≤4KB),由服务器通过 Set-Cookie 响应头设置,之后每次请求自动附加在 Cookie 头中。属性包括:
| 属性 | 说明 | 安全建议 |
|---|---|---|
Domain | 指定可接收 Cookie 的域名 | 尽量精确,避免泛域名 |
Path | 限定路径范围 | 默认 / |
Expires / Max-Age | 持久化时间 | Session Cookie 不设置则关闭浏览器失效 |
Secure | 仅通过 HTTPS 传输 | 生产环境必须开启 |
HttpOnly | 禁止 JavaScript 访问 | 防止 XSS 窃取,务必开启 |
SameSite | 控制跨站请求行为 | Lax 或 Strict 可防 CSRF |
3.3 Session 与 Cookie 交互流程
典型交互分为三个阶段:
- 登录认证:用户提交凭证,服务器验证成功后创建 Session,并将 Session ID 通过 Set-Cookie 下发。
- 会话保持:浏览器自动携带 Cookie,服务器解析 Session ID,加载用户数据。
- 注销/过期:服务器销毁 Session,或 Cookie 过期,会话结束。
3.4 Session 劫持与防护
攻击者通过窃取 Session ID 冒充用户。常见攻击向量:XSS、网络嗅探、中间人攻击、Session 固定。
| 攻击类型 | 描述 | 防护措施 |
|---|---|---|
| XSS 窃取 Cookie | 恶意脚本读取 document.cookie | HttpOnly 标志;输入过滤/CSP |
| 网络嗅探 | 明文传输截获 Cookie | 全站 HTTPS + Secure 标志 |
| Session 固定 | 强制用户使用攻击者指定的 Session ID | 登录后重新生成 Session ID |
| CSRF 利用 | 跨站请求携带 Cookie | SameSite 属性 + CSRF Token |
| 暴力破解 Session ID | 猜测有效 Session ID | 使用足够随机且长(≥128位)的 ID |
纵深防御建议:① 始终使用 HTTPS;② Session ID 长度≥128位,使用密码学安全随机数;③ 登录/权限变更后重置 Session;④ 设置合理的过期时间;⑤ 结合多因素认证。