第一方饼干食谱

了解如何设置第一方 Cookie,以确保安全性、跨浏览器兼容性,并在第三方 Cookie 逐步淘汰后最大限度地降低出现中断的可能性。

Milica Mihajlija
Milica Mihajlija

Cookie 可以是第一方 Cookie,也可以是第三方 Cookie,具体取决于用户当前所在的环境(即用户当时访问的是哪个网站)。如果 Cookie 的可注册网域和架构与当前的顶级网页(即浏览器的地址栏中显示的内容)一致,系统就会认为该 Cookie 与该网页来自同一网站,通常称为第一方 Cookie。

来自当前网站以外网域的 Cookie 通常称为第三方 Cookie

如果您要设置的 Cookie 不会在多个网站中使用(例如,用于管理您网站上的会话,且从未在跨网站 iframe 中使用),则该 Cookie 始终在第一方环境中使用。

默认情况下,Cookie 可以跨网站共享、可通过 JavaScript 访问以及通过 HTTP 连接发送,但这会带来一些隐私和安全风险。虽然我们一直在通过 Privacy Sandbox源绑定 Cookie 等其他方案改进默认行为,但您现在也可以通过为 Cookie 设置其他属性来实现很多功能。

以下配置是最佳实践,可确保大多数第一方 Cookie 的安全性和跨浏览器兼容性。这将为您提供一个安全的基础,您可以根据需要调整,以便仅在必要时授予权限。本文还介绍了适用于某些特定用例的食谱变体。

食谱

Set-Cookie:
__Host-cookie-name=cookie-value;
Secure;
Path=/;
HttpOnly;
Max-Age=7776000;
SameSite=Lax;

Host 是一个可选前缀,它会使某些属性成为必需属性,而禁止其他属性

  • 必须提供 Secure
  • 必须省略 Domain
  • Path 必须为 /

添加 Host 后,您可以依靠浏览器检查这些属性的设置是否符合 __Host 规则,如果不符合,则拒绝 Cookie。

Secure 仅允许通过 HTTPS 连接发送 Cookie,因此可防止 Cookie 在不安全的网络上被盗。如果您尚未将网站完全迁移到 HTTPS,请优先将其迁移。

Domain 属性指定哪些主机可以接收 Cookie。如果省略此属性,则会将 Cookie 限制为当前文档主机(不包括子网域):系统会在对 example.com 的每个请求中发送 example.com 的 Cookie,但不会在对 images.example.com 的请求中发送。如果您在不同的子网域上运行不同的应用,这样可以降低因遭入侵的网域而允许访问其他网域的风险。

Path 表示请求的网址中必须存在的路径,否则浏览器不会发送 Cookie 标头。设置 Path=/ 意味着 Cookie 会发送到该网域上的所有网址路径。不使用 DomainPath=/ 的组合会使 Cookie 尽可能紧密地绑定到来源,因此其行为与其他客户端存储(例如 LocalStorage)类似,不会因 example.com/a 可能收到与 example.com/b 不同的值而产生混淆。

HttpOnly 属性可通过限制 JavaScript 访问权限,为您的网站提供一定程度的恶意第三方脚本防护。它允许仅在请求标头中发送 Cookie,并使用 document.cookie 使 JavaScript 无法使用这些 Cookie。

Max-Age 会限制 Cookie 的生命周期,因为浏览器会话可能会持续很长时间,而您不希望过期 Cookie 一直存在。它非常适用于短期 Cookie(如用户会话),或更短的 Cookie(如用于表单提交的令牌)。Max-Age 以秒为单位进行定义,在上面的示例中,它设为 7776000 秒,即 90 天。这是一个合理的默认值,您可以根据自己的使用场景进行更改。

SameSite=Lax 限制 Cookie 仅在同网站请求中发送。也就是说,请求与当前浏览上下文匹配,即用户当前访问的顶级网站(显示在其位置栏中)。SameSite=Lax 是现代浏览器中的默认值,但最好指定此值,以便在可能具有不同默认值的浏览器之间实现兼容性。将 Cookie 明确标记为仅限同一网站,即表示您将 Cookie 限制在您的第一方环境中,且在第三方 Cookie 停用时,您无需对该 Cookie 进行任何更改。

如需详细了解不同的 Cookie 属性,请参阅 MDN 上的 Set-Cookie 文档

如果您的网站包含子网域,并且您希望将所有子网域视为一个会话,则 Host 前缀可能过于严格。例如,news.site 可以有主题的子网域,例如 finance.news.sitesport.news.site,并且您希望在所有这些子网域中都将用户会话视为一次会话。在这种情况下,请使用 __Secure 前缀(而非 __Host)并指定 Domain

食谱

Set-Cookie:
__Secure-cookie-name=cookie-value;
Secure;
Domain=news.site;
Path=/;
HttpOnly;
Max-Age=7776000;
SameSite=Lax;

Secure 是一个可选前缀,与 Host 相比,它声明的要求更少:它只要求使用 Secure 属性设置 Cookie。

虽然系统不会在跨网站子请求(例如在第三方网站上加载嵌入的图片或 iframe)中发送 SameSite=Lax Cookie,但会在用户导航到来源网站时发送这些 Cookie(例如,在从其他网站点击链接时)。

您可以使用 SameSite=Strict 进一步限制 Cookie 访问权限,并禁止将 Cookie 随从第三方网站发起的请求一起发送。如果您有与始终位于初始导航后面的功能相关的 Cookie(例如更改密码或进行购买),此设置非常有用。

食谱

Set-Cookie:
__Host-cookie-name=cookie-value;
Secure;
Path=/;
HttpOnly;
Max-Age=7776000;
SameSite=Strict;