安全 Cookie 配置

尽可能限制对 Cookie 的访问。

问题

Cookie 通常包含会话标识符或其他敏感信息。因此,未经授权访问 Cookie 会导致一系列问题,包括 隐私问题、(跨站脚本 (XSS))攻击、跨站请求伪造(CSRF)攻击等。

解决方案

为最大程度地减小您网站上 Cookie 漏洞的范围,请尽可能限制对 Cookie 的访问。这可以通过明智地使用 Set-Cookie 标头的以下指令来完成:

名称

Cookie 名称应加上 __Secure-__Host- 前缀,以防止 Cookie 被不安全来源覆盖。

  • 对于仅在特定域(不包括子域)上需要且 Path 设置为 / 的所有 Cookie,请使用 __Host-
  • 对于从安全源(HTTPS)发送的所有其他 Cookie,请使用 __Secure-
安全

所有 Cookie 都必须设置 Secure 指令,表明它们只能通过 HTTPS 发送。HTTP 严格传输安全 (HSTS) 也可用于防止通过 HTTP 传输,但理想情况下 Secure 也应设置在 Cookie 上。

HttpOnly

不需要 JavaScript 访问的 Cookie 应设置 HttpOnly 指令以阻止访问,例如通过 Document.cookie。对于会话标识符,尤其重要的是不要让 JavaScript 访问,以帮助防止 CSRF 等攻击。

ExpiresMax-Age

Cookie 应在其不再需要时立即过期。特别是会话标识符应尽快过期。

  • Expires:为给定 Cookie 设置绝对过期日期。
  • Max-Age:为给定 Cookie 设置相对过期日期。

    注意: ExpiresMax-Age 可用时间更长;然而,Max-Age 更不容易出错,并且在两者都设置时具有优先权。其背后的原理是,当您设置 Expires 日期和时间时,它们是相对于设置 Cookie 的客户端而言的。如果服务器设置的时间不同,可能会导致错误。

仅当 Cookie 需要被其他域访问时,才应设置 Domain;应将其设置为尽可能受限的域。

路径

Cookie 应设置为尽可能受限的 Path

SameSite

使用 SameSite 禁止通过跨域请求(例如来自 <img> 元素的请求)发送 Cookie。您应该使用以下两个值之一:

  • SameSite=Strict:仅在同站上下文中(导航和其他请求)发送 Cookie。在跨站请求(例如,嵌入来自其他网站的图片或其他资源)和跨站导航(例如,当从另一个网页点击链接时)中会省略 Cookie。这是一个非常严格的设置,但它提供了强大的 CSRF 保护,所以如果可能,请使用此值。
  • SameSite=Lax:在同站请求以及导航您的网站时发送 Cookie。如果 Strict 太严格,应使用此选项。

以上两个值在保护用户已认证的场景免受 点击劫持 攻击方面都很有用。

注意: 理论上,SameSite=Strict 的实际用途比它看起来要大。它经常会破坏导航——例如,用户点击一个他们已登录的网站的链接(即,设置了有效的会话 Cookie),但由于浏览器故意省略了会话 Cookie,他们会显示为未登录。最好的折衷方法是仅在 CSRF 是一个问题的令牌上使用 SameSite=Strict,或者在所有地方都使用 SameSite=Strict,但当有迹象表明用户已登录但所需的 Cookie 未发送时,重新加载页面并在 JavaScript 中进行 Cookie 检查。

示例

设置一个仅在当前主机上可访问,并在用户关闭浏览器时过期的会话标识符 Cookie。

http
Set-Cookie: MOZSESSIONID=980e5da39d4b472b9f504cac9; Path=/; Secure; HttpOnly

使用 __Secure- 前缀为所有 example.org 站点设置会话标识符,有效期设置为 30 天。此 Cookie 不会跨域发送,但在从另一个站点导航到任何站点时会发送。

http
Set-Cookie: __Secure-MOZSESSIONID=7307d70a86bd4ab5a00499762; Max-Age=2592000; Domain=example.org; Path=/; Secure; HttpOnly; SameSite=Lax

在用户接受服务条款时,为当前主机设置一个长期有效的 Cookie,并且可以被 JavaScript 访问。此 Cookie 在从另一个站点导航到您的网站时发送,例如通过点击链接。

http
Set-Cookie: __Host-ACCEPTEDTOS=true; Expires=Fri, 31 Dec 9999 23:59:59 GMT; Path=/; Secure; SameSite=Lax

为安全(HTTPS)站点使用会话标识符。它不会从跨域请求发送,也不会在从另一个站点导航到您的站点时发送。当与其他反 CSRF 措施结合使用时,这为您的站点提供了针对 CSRF 攻击的非常强大的防御。

http
Set-Cookie: __Host-BMOSESSIONID=YnVnemlsbGE=; Max-Age=2592000; Path=/; Secure; HttpOnly; SameSite=Strict

另见