cookies - SameSite=Lax 和 SameSite=Strict 接收 cookie 有什么区别?
问题描述
一些资源说,当我们使用直接和顶级链接加载另一个站点时,它可以工作......但是正如我测试的那样,当我从 中打开一个站点时SameSite=Strict
,浏览器会将其视为直接在地址栏中输入,因此它会接收所有 cookie,甚至那些。SameSite=Lax
<a href="mysite.com">
mysite.com
SameSite=Strict
<form action="mysite.com", method="get">
or也一样<form ... method="post>"
,<form>
请求使所有 cookie 完全加载。
SameSite=Strict
那么和 和有什么区别SameSite=Lax
呢?
解决方案
Strict 和 Lax 是关于您的浏览器何时发送cookie。您在浏览器收到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",则不会。
推荐阅读
- prometheus - 创建加载所有 cpu 的 promql 查询
- asynchronous - 为什么在 Result 上使用 match 语句会出现“预期类型 Future”错误?
- java - 自定义 Undertow 可执行战争 webapp 需要很长时间才能在 Java 8 上启动(在 Java 7 上快速启动)
- reactjs - 替换函数内的 redux 钩子
- node.js - Heroku 部署问题使用 node , mongo 和 express
- python - 用户名和密码 python 无论我在其中更改什么,我都会不断收到此语法错误
- amazon-web-services - AWS Quicksight:将周显示为数字,按月而非年分组
- r - 两个组的正则表达式,一个是可选的
- angular - 如果我们在 angular slickgrid 中重新绑定列定义,复选框将被删除
- node.js - 在同一页面上登录并注册NodeJS