第一方 Cookie 使用指南

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

Cookie 相对于用户的上下文可以是第一方或第三方;具体取决于用户当时所在的网站。如果 Cookie 的可注册域名和方案与当前的顶层页面(即浏览器地址栏中显示的内容)相匹配,则该 Cookie 将被视为与该页面来自同一站点,并且通常被称为第一方 Cookie。

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

如果您设置的 Cookie 未跨站点使用,例如,它用于管理您网站上的会话,并且从不在跨站点 iframe 中使用,则该 Cookie 始终在第一方上下文中使用。

默认情况下,Cookie 可以在站点之间共享,可以通过 JavaScript 访问,并通过 HTTP 连接发送,这会带来一些隐私和安全风险。虽然正在通过 Privacy Sandbox 和其他提案(例如 origin-bound cookies)来改进默认行为,但您现在可以通过在 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 指示请求 URL 中必须存在的路径,浏览器才会发送 Cookie 标头。设置 Path=/ 意味着 Cookie 将发送到该域名上的所有 URL 路径。没有 DomainPath=/ 的组合使 Cookie 尽可能紧密地绑定到来源,因此它的行为类似于其他客户端存储(例如 LocalStorage)—不会混淆 example.com/a 可能收到与 example.com/b 不同的值。

HttpOnly 属性通过限制 JavaScript 访问,为您的网站增加了一些针对恶意第三方脚本的保护。它允许 Cookie 仅在请求标头中发送,并使 JavaScript 无法使用 document.cookie 访问它们。

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 的要求更少:它仅要求 Cookie 设置有 Secure 属性。

虽然 SameSite=Lax Cookie 不会在跨站点子请求(例如,在第三方站点上加载嵌入式图像或 iframe 时)上发送,但当用户导航到来源站点时(例如,当跟踪来自不同站点的链接时),它们会被发送。

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

使用指南

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