了解如何设置第一方 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,并使用 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
文档。
适用于包含子网域的网站的第一方 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;