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 实现都必须具备的结构:
- HTTP 响应首部 (Server → Client):
Set-Cookie: <value>(服务端通知浏览器保存 Cookie)。 - HTTP 请求首部 (Client → Server):
Cookie: <value>(浏览器后续请求自动携带)。 - 客户端存储 (Client-side Storage):由浏览器在其本地端系统中管理和维护的 Cookie 文件。
- 服务端状态存储 (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 的唯一实现方式。