SameSite=Lax 和 SameSite=Strict 在接收 cookie 方面有什么区别?

What is difference between SameSite=Lax and SameSite=Strict in receiving cookies?

一些资源说,与 SameSite=Strict 不同,SameSite=Lax 在我们使用直接和顶级链接加载另一个站点时有效...但正如我测试的那样,当我从 <a href="mysite.com">,浏览器将其视为直接在地址栏中键入 mysite.com,因此它会接收所有 cookie,甚至是 SameSite=Strict 个。

<form action="mysite.com", method="get"><form ... method="post>" 也是如此,<form> 请求使所有 cookie 完全加载。

那么SameSite=StrictSameSite=Lax有什么区别呢?

严格和宽松是关于您的浏览器何时发送 cookie。您在浏览器 收到 cookie 时进行了测试。

浏览器使用 SameSite 设置来决定何时发送 cookie 返回其来源。

引用自SameSite cookies explained

If you set SameSite to Strict, your cookie will only be sent in a first-party context. In user terms, the cookie will only be sent if the site for the cookie matches the site currently shown in the browser's URL bar. So, if the promo_shown cookie is set as follows:

Set-Cookie: promo_shown=1; SameSite=Strict

When the user is on your site, then the cookie will be sent with the request as expected. However when following a link into your site, say from another site or via an email from a friend, on that initial request the cookie will not be sent.

相比之下,SameSite=Lax 允许浏览器发送用于顶级导航的 cookie,例如上文所述:跟随另一个站点上的 link 或单击某个站点中的 link电子邮件。

这里是一个summary on MDN,包括第三个值,SameSite=None:

The SameSite attribute accepts three values:

Lax

Cookies are allowed to be sent with top-level navigations and will be sent along with GET request initiated by third party website. This is the default value in modern browsers.

Strict

Cookies will only be sent in a first-party context and not be sent along with requests initiated by third party websites.

None

Cookies will be sent in all contexts, i.e sending cross-origin is allowed.

None used to be the default value, but recent browser versions made Lax the default value to have reasonably robust defense against some classes of cross-site request forgery (CSRF) attacks.

None requires the Secure attribute in latest browser versions.

如果示例中的 HTML 表单在另一个站点上,而不是在 mysite.com 上,如果它们具有 SameSite=Strict,cookie 将不会被发送回 mysite.com。如果 SameSite=Lax,并且表单有 method="get",浏览器将发送 cookie,但如果 method="post",则不会。

实际上,当 SameSite 设置为 Strict 时,在电子邮件中跟随 link 时会发送 cookie,但仅当电子邮件客户端是独立应用程序时才会发送,而不是 browser-based。如果您在 gmail 等网络应用程序中阅读电子邮件并单击 link,则这是一个 cross-domain 请求并被浏览器阻止。

当 SameSite 为 Strict 时,cookie 在以下时间发送:

  • 来自同一站点的 link 人
  • 直接在地址栏中输入地址
  • 关注来自 non-browser 应用程序(电子邮件客户端、Word 文档...)的 link

当SameSite设置为Lax时,在以上各场景下发送,加上

  • 当您关注来自不同域的 top-level link 并且它具有 'safe' 方法(GET、HEAD、OPTIONS)时。这是一个更改地址栏中 URL 的 link,因此 IMG 标记、IFRAME 等中的请求不会导致发送 cookie。