跳转到内容
搜索文档

SameSite cookie 与 Cloudflare 的交互

最后更新 查看 MarkdownAgent 设置

Google Chrome 会强制执行 SameSite cookie 行为 ↗,以防止用于跟踪用户的营销 cookie,以及允许攻击者窃取或操纵 cookie 的跨站请求伪造(CSRF)。

SameSite cookie 属性有三种模式:

  • Strict:Cookie 由第一方(所访问的域名)创建。例如,访问 cloudflare.com 时由 Cloudflare 设置的第一方 cookie。
  • Lax:Cookie 仅发送到 apex 域名(例如 example.com)。例如,如果有人(blog.example.net)热链接了图片(img.example.com/bar.png),客户端不会向 img.example.com 发送 cookie,因为它既不是第一方上下文,也不是 apex 上下文。
  • None:Cookie 会随所有请求发送。

Cloudflare cookie 的 SameSite 设置包括:

Cloudflare cookie SameSite 设置 仅限 HTTPS Partitioned (CHIPS)
__cf_bm SameSite=None; Secure 是 否
cf_clearance SameSite=None; Secure 是 是
__cflb SameSite=Lax 否 否

目前,要在会话亲和性 cookie 上配置 SameSite 属性,必须使用 Cloudflare API(例如 Create Load Balancer 操作)。

要配置 SameSite cookie 属性的值,请在 HTTP 请求中的 session_affinity_attributes 对象内包含 samesite 与 secure JSON 属性。

这两个属性的可用值如下:

samesite 属性:

  • 有效值:Auto(默认)、Lax、None、Strict。

secure 属性:

  • 有效值:Auto(默认)、Always、Never。

samesite 属性的 Auto 值行为如下:

  • 若已启用 Always Use HTTPS(始终使用 HTTPS),会话亲和性 cookie 将使用 Lax SameSite 模式。
  • 若已禁用 Always Use HTTPS(始终使用 HTTPS),会话亲和性 cookie 将使用 None SameSite 模式。

secure 属性的 Auto 值行为如下:

  • 若已启用 Always Use HTTPS(始终使用 HTTPS),会话亲和性 cookie 会在 SameSite 属性中包含 Secure。
  • 若已禁用 Always Use HTTPS(始终使用 HTTPS),会话亲和性 cookie 不会在 SameSite 属性中包含 Secure。

如果在 API 请求中将 samesite 设为 None,则不能将 secure 设为 Never。

若您的会话亲和性 cookie 需要特定的 SameSite 配置,Cloudflare 建议为 samesite 与 secure 提供不同于 Auto 的值,而不是依赖默认行为。这样,SameSite cookie 属性的值不会因配置变更(即 Always Use HTTPS(始终使用 HTTPS))而改变。


当访客因 自定义规则 或 IP 访问规则 而解决所呈现的 质询 时,会在访客浏览器中设置 cf_clearance cookie。cf_clearance cookie 的默认有效期为 30 分钟,您可以通过 Challenge Passage(质询通行) 进行配置。

Cloudflare 在 cf_clearance cookie 中使用 SameSite=None,以便来自不同主机名的访客请求不会随后再次遇到质询或错误。使用 SameSite=None 时,必须同时设置 Secure 标志。

使用 Secure 标志要求通过 HTTPS 连接发送 cookie。如果您的网站任何部分使用 HTTP,cf_clearance cookie 会默认回退为 SameSite=Lax,可能导致网站无法正常工作。

要解决此问题,请将网站流量迁移到 HTTPS。Cloudflare 为此提供两个功能:


分区 cookie(CHIPS)与 cf_clearance

Cloudflare 会在 cf_clearance cookie(以及 Challenge 平台使用的内部 cf_chl_* cookie)上设置 Partitioned 属性,以符合 Cookies Having Independent Partitioned State (CHIPS) ↗ ↗。

在 CHIPS 下,在第三方上下文中设置的 cookie(例如在 iframe 内或来自跨站子资源)会存储在以顶级站点为键的分区中,而不是在所有嵌入该第三方的站点之间共享。在阻止第三方 cookie 的基于 Chromium 的浏览器上,这可保留跨站嵌入的 challenge 状态,否则会失效。在未实现 CHIPS 的浏览器上,Partitioned 属性会被忽略,行为保持不变。

Partitioned 属性不会应用于 __cf_bm。

对嵌入式 challenge 的影响

由于 cf_clearance 是分区的,在一个顶级上下文中获得的 clearance 不会在另一个顶级上下文中复用。直接浏览站点并通过 challenge 的访客,不会自动将该 clearance 带到嵌入该站点的其他站点,反之亦然。这是 CHIPS 下的预期行为。

Partitioned 需要 SameSite=None; Secure

Partitioned 属性仅对同时设置了 SameSite=None; Secure 的 cookie 生效。若您的站点并非全部流量通过 HTTPS 提供,cf_clearance cookie 会回退为 SameSite=Lax(请参阅 SameSite 与 cf_clearance cookie 的已知问题),且 Partitioned 属性不会生效。


相关资源

这篇文档对您有帮助吗?