了解如何设置第一方 Cookie,以确保安全性、跨浏览器兼容性,并最大限度地降低在第三方 Cookie 逐步淘汰后出现问题的几率。
Cookie 可以是第一方 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 会发送到该网域上的所有网址路径。不使用 Domain
和 Path=/
的组合会使 Cookie 尽可能紧密地绑定到来源,因此其行为与其他客户端存储(例如 LocalStorage
)类似,不会因 example.com/a
可能收到与 example.com/b
不同的值而产生混淆。
HttpOnly
属性可通过限制 JavaScript 访问权限,为您的网站提供一定程度的恶意第三方脚本防护。它允许仅在请求标头中发送 Cookie,并使 JavaScript 无法使用 document.cookie
访问这些 Cookie。
Max-Age
会限制 Cookie 的生命周期,因为浏览器会话可能会持续很长时间,而您不希望过期 Cookie 一直存在。适用于短期 Cookie,例如用户会话,甚至更短的 Cookie,例如表单提交令牌。Max-Age
以秒为单位进行定义,在上面的示例中,它设为 7776000 秒,即 90 天。这是一个合理的默认值,您可以根据自己的使用场景进行更改。
SameSite=Lax
会限制 Cookie 仅在同站点请求中发送。也就是说,请求与当前浏览上下文匹配,即用户当前访问的顶级网站(显示在其位置栏中)。SameSite=Lax
是现代浏览器中的默认值,但最好指定此值,以便在可能具有不同默认值的浏览器之间实现兼容性。通过明确将 Cookie 标记为仅限同一网站,您将其限制在第一方环境中,这样一来,在第三方 Cookie 被弃用后,您就不必对该 Cookie 进行更改。
如需详细了解不同的 Cookie 属性,请参阅 MDN 上的 Set-Cookie
文档。
适用于包含子网域的网站的第一方 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。
限制对从第三方网站发起的请求的第一方 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;