HTTP Cookie 与会话状态

Definition

HTTP Cookie 是应用层 HTTP 协议用于在无状态(Stateless)协议之上追踪和维护客户端与服务端交互状态(Session State)的技术机制。

它规定 / 它负责:

  • 在需要跨请求关联时,为无状态的 HTTP 交互增加客户端标识或状态传递能力。
  • 常见实现由服务端生成会话 ID,浏览器本地保存并在匹配后续请求中自动回传;具体状态可以保存在服务端,也可以以签名数据保存在客户端。

简单理解:

HTTP 协议天然“无记忆”,Cookie 是服务端发给浏览器的“用户身份凭证卡”,后续每次请求浏览器都自动出示。


为什么需要 Cookie(HTTP 无状态 vs 有状态需求)

  • HTTP 协议的无状态性 (Statelessness):HTTP 语义不要求服务器依赖先前请求来理解当前请求。应用仍然可以自行保存会话状态,只是这种状态不是 HTTP 协议自动维护的。
  • Web 应用的有状态需求 (Statefulness):现实应用(如购物车、用户登录状态、个性化偏好)要求服务器必须识别“谁在发起请求”。

Cookie 技术四大组成要素

在《自顶向下方法》介绍的 Session ID 模型中,Cookie 技术通常由以下部分共同支撑;这不是所有 Cookie 实现都必须具备的结构:

  1. HTTP 响应首部 (Server → Client)Set-Cookie: <value>(服务端通知浏览器保存 Cookie)。
  2. HTTP 请求首部 (Client → Server)Cookie: <value>(浏览器后续请求自动携带)。
  3. 客户端存储 (Client-side Storage):由浏览器在其本地端系统中管理和维护的 Cookie 文件。
  4. 服务端状态存储 (Server-side State, 可选):服务端将 Cookie ID 与用户具体会话数据绑定的存储;也可以改用客户端签名状态而不保存对应会话表。

工作流程 (Working Process)

flowchart TD
    Client["客户端浏览器 (Client)"] -- "(1) 首次请求 GET /index.html (无 Cookie)" --> Server["Web 服务器 (Server)"]

    Server -- "(2) 生成唯一 ID (如 1234)<br/>后台 DB 创建关联表项" --> DB[("服务端数据库")]

    Server -- "(3) HTTP 响应 Header:<br/>Set-Cookie: 1234" --> Client

    Client -- "(4) 浏览器将 (域名, 1234) 保存至本地 Cookie 文件" --> LocalStorage["本地 Cookie 存储"]

    Client -- "(5) 后续请求自动附带 Header:<br/>Cookie: 1234" --> Server

    Server -- "(6) 提取 Cookie 1234 查询 DB,识别用户状态" --> DB

隐私与安全局限

虽然 Cookie 解决了会话追踪问题,但也带来了安全与隐私争议:

  • 隐私跟踪 (Tracking):第三方 Cookie(Third-party Cookies)常被广告商和追踪公司用于跨站点记录用户的上网行为与画像。
  • 安全风险与防御首部
    • HttpOnly:禁止 JavaScript 读取 Cookie,可降低 XSS 窃取 Cookie 凭证的风险,但不能防御 XSS 本身。
    • Secure:强制仅在 HTTPS 加密通道传输 Cookie。
    • SameSite:限制跨站请求携带 Cookie,可降低 CSRF 风险,但不能替代完整的 CSRF 防护。

Summary

Cookie 在无状态的 HTTP 交互之上增加了可回传的客户端状态;常见的 Set-Cookie + 会话 ID 模式会配合服务端状态存储,但这不是 Cookie 的唯一实现方式。


Related Concepts(关联概念)