跳转到内容
搜索文档

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 cookieSameSite 设置包括:

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 对象内包含 samesitesecure JSON 属性。

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

samesite 属性:

  • 有效值:Auto(默认)、LaxNoneStrict

secure 属性:

  • 有效值:Auto(默认)、AlwaysNever

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 建议为 samesitesecure 提供不同于 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 属性不会生效。


相关资源

这篇文档对您有帮助吗?