SameSite Cookie 说明

Browser Support

  • Chrome: 51.
  • Edge: 16.
  • Firefox: 60.
  • Safari: 13.

Source

每个 Cookie 都包含一个键值对以及一些用于控制该 Cookie 的使用时间和位置的属性。

引入 SameSite 属性(在 RFC6265bis 中定义)后,您可以声明 Cookie 是否仅限于第一方或同网站上下文。了解此处“网站”的确切含义很有帮助。 网站是网域后缀与紧随其后的网域部分的组合。例如,www.web.dev 网域是 web.dev 网站的一部分。

关键术语:如果用户位于 www.web.dev 上,并请求来自 static.web.dev 的图片,则这是同网站请求。

公共后缀列表定义了哪些网页被视为位于同一网站上。它不仅取决于 .com 等顶级网域,还可能包括 github.io 等服务。这样一来,your-project.github.iomy-project.github.io 就可以作为单独的网站进行统计。

关键术语:如果用户位于 your-project.github.io 上,并从 my-project.github.io 请求图片,则该请求为跨网站请求。

使用 SameSite 属性声明 Cookie 用途

Cookie 的 SameSite 属性提供了三种不同的方式来控制此行为。您可以选择不指定该属性,也可以使用 StrictLax 将 Cookie 限制为仅用于同站点请求。

如果您将 SameSite 设置为 Strict,则您的 Cookie 只能在第一方上下文中发送;也就是说,只有当 Cookie 的网站与浏览器地址栏中显示的网站相符时,才能发送 Cookie。因此,如果 promo_shown Cookie 的设置如下:

Set-Cookie: promo_shown=1; SameSite=Strict

当用户访问您的网站时,系统会按预期随请求发送 Cookie。 不过,如果用户通过链接从其他网站进入您的网站,则不会在初始请求中发送该 Cookie。这对于始终位于初始导航后面的功能(例如更改密码或进行购买)相关的 Cookie 很有用,但对于 promo_shown 等 Cookie 来说,限制过于严格。如果读者通过链接进入网站,他们希望系统发送 Cookie,以便应用其偏好设置。

SameSite=Lax 允许浏览器在这些顶级导航中发送 Cookie。例如,如果其他网站引用了您网站的内容(在本例中,该网站使用了您的猫照片并提供了指向您文章的链接),如下所示:

<p>Look at this amazing cat!</p>
<img src="https://blog.example/blog/img/amazing-cat.png" />
<p>Read the <a href="https://blog.example/blog/cat.html">article</a>.</p>

将 Cookie 设置为 Lax,如下所示:

Set-Cookie: promo_shown=1; SameSite=Lax

当浏览器为他人的博客请求 amazing-cat.png 时,您的网站不会发送该 Cookie。不过,当读者点击您网站上指向 cat.html 的链接时,该请求会包含 Cookie。

我们建议您以这种方式使用 SameSite,将影响网站显示的 Cookie 设置为 Lax,并将与用户操作相关的 Cookie 设置为 Strict

您还可以将 SameSite 设置为 None,以表明您希望在所有上下文中发送 Cookie。如果您提供的服务可供其他网站使用,例如 widget、嵌入式内容、联属营销计划、广告或跨多个网站的登录,请使用 None 以确保您的意图明确。