第一方饼干食谱

了解如何设置第一方 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 的 Cookie 将针对 example.com 的每个请求发送,但不会针对向 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.site ��� sport.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;