HTTP、会话与 Cookie
Web 如何在无状态的 HTTP 之上维持状态(Cookie、会话),以及保护会话完整性与机密性的安全属性。
快速解答
HTTP 是无状态的,因此会话与 Cookie 补充了身份;使用 Secure、HttpOnly、SameSite 属性、短生命周期以及服务端会话验证来保护它们,以防止会话劫持和 CSRF。
定义
HTTP 是无状态协议;会话与 Cookie 承载身份/状态,使一系列请求可被视为一次已认证的对话,而这正是攻击者频繁瞄准的目标。
它是什么
HTTP 在请求之间没有记忆。会话提供连续性:服务器签发一个会话标识符(通常是 Cookie,RFC 6265),客户端在每次请求时出示它,使服务器将这一系列请求视为一次已认证的对话。
为什么重要
由于会话 Cookie 实际上就是用户对服务器的身份凭证,窃取或固定它便是通往账户接管的直接路径。锁定 Cookie 的属性决定了令牌是可被劫持的还是安全的。
它如何工作
- Cookie 属性:
Secure(仅通过 HTTPS,参见security:tls)、HttpOnly(脚本无法访问,削弱 XSS 窃取)、SameSite(缓解 CSRF),以及Path/Max-Age作用域限定。 - 服务端会话:在服务器上验证会话状态;在登出、空闲超时和权限变更时使其失效;绝不单独信任客户端的声明。
- 无状态 vs 服务端会话:JWT 是一种无状态的令牌替代方案(参见
security:oauth-saml-sso/guides:decode-jwt-safely),它转移了验证位置,但并未转移被窃取的风险。
检测
- 同一账户突现来自不同地理区域/地点的并发会话。
- 敏感端点上缺少
Secure/HttpOnly/SameSite的 Cookie。 - 会话标识符从异常的用户代理/IP 历史中被重放。
缓解
- 为会话 Cookie 设置
Secure、HttpOnly、SameSite=Lax/Strict以及短且轮换的生命周期。 - 将会话绑定到服务端存储;记录轮换/失效事件。
- 添加 CSRF 防御(令牌、SameSite、自定义头),而不是仅依赖 Cookie。
调查
在会话劫持或账户接管调查中,比较签发的会话与出示的会话、IP/地点历史,以及托管端点上的 Cookie 属性状态。对端点进行安全头审查是首要检查(guides:tool-headers-guide)。