首页 > 解决方案 > SameSite=Lax 和 SameSite=Strict 接收 cookie 有什么区别?

问题描述

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

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

SameSite=Strict那么和 和有什么区别SameSite=Lax呢?

标签: cookieshttp-headersxsscross-sitesamesite

解决方案


Strict 和 Lax 是关于您的浏览器何时发送cookie。您在浏览器收到cookie 时进行了测试。

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

引用SameSite cookie 的解释

如果您将 SameSite 设置为 Strict,您的 cookie 将仅在第一方上下文中发送。在用户方面,只有当 cookie 的站点与浏览器 URL 栏中当前显示的站点匹配时,才会发送 cookie。因此,如果 promo_shown cookie 设置如下:

设置 Cookie:promo_shown=1;SameSite=严格

当用户在您的站点上时,cookie 将按预期随请求一起发送。但是,当通过链接进入您的站点时,例如从另一个站点或通过朋友的电子邮件,在最初的请求中不会发送 cookie。

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

这是MDN 上的摘要,包括第三个值 SameSite=None:

SameSite 属性接受三个值:

松懈

Cookies 允许与顶级导航一起发送,并将与第三方网站发起的 GET 请求一起发送。这是现代浏览器中的默认值。

严格的

Cookie 只会在第一方上下文中发送,不会与第三方网站发起的请求一起发送。

没有任何

Cookie 将在所有上下文中发送,即允许跨域发送。

None 曾经是默认值,但最近的浏览器版本使 Lax 成为默认值,以便对某些类别的跨站点请求伪造 (CSRF) 攻击具有相当强大的防御能力。

None 在最新的浏览器版本中需要 Secure 属性。

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


推荐阅读