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 将使用
LaxSameSite 模式。 - 若已禁用 Always Use HTTPS(始终使用 HTTPS),会话亲和性 cookie 将使用
NoneSameSite 模式。
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 为此提供两个功能:
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。
由于 cf_clearance 是分区的,在一个顶级上下文中获得的 clearance 不会在另一个顶级上下文中复用。直接浏览站点并通过 challenge 的访客,不会自动将该 clearance 带到嵌入该站点的其他站点,反之亦然。这是 CHIPS 下的预期行为。
Partitioned 属性仅对同时设置了 SameSite=None; Secure 的 cookie 生效。若您的站点并非全部流量通过 HTTPS 提供,cf_clearance cookie 会回退为 SameSite=Lax(请参阅 SameSite 与 cf_clearance cookie 的已知问题),且 Partitioned 属性不会生效。