第一方饼干食谱

了解如何设置第一方 Cookie,以确保安全性、跨浏览器兼容性,并最大限度地降低在第三方 Cookie 被淘汰后发生损坏的可能性。

Milica Mihajlija
Milica Mihajlija

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 可防止 Cookie 在不安全的网络上被盗,因为它仅允许通过 HTTPS 连接发送 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 无法使用这些标头。

Max-Age 可限制 Cookie 的存续时间,因为浏览器会话可能会持续很长时间,建议您避免永久保留过时的 Cookie。它非常适合短期 Cookie,例如用户会话,甚至更短的 Cookie(例如用于提交表单的令牌)。Max-Age 是以秒为单位定义的,在前面的示例中,它被设为 7776000 秒,即 90 天。这是一个合理的默认值,您可以根据自己的使用场景进行更改。

SameSite=Lax 对 Cookie 进行限制,使其只能在同网站请求时发送。也就是说,请求与当前浏览上下文相匹配,即用户当前在访问的顶级网站(显示在其地址栏中)。SameSite=Lax 在现代浏览器中是默认值,但最好指定它,以便在可能具有不同默认值的浏览器之间保持兼容性。通过将 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;