cookies - Samesite=当用户点击来自不同域的链接时,302 重定向中不包含严格的 cookie
问题描述
- 客户将链接到他们网站上的一个网页:customer.site/links.html
- 一个人单击该链接并被发送到 our.site/webapp/handlerequest.aspx?someparam=somevalue
- 的值
someparam
在 cookie 中设置SameSite=Strict
,然后使用 302 重定向到同一域上的另一个页面:
Request URL: https://our.site/webapp/handlerequest.aspx?someparam=somevalue
Request Method: GET
Status Code: 302
Remote Address: ...
Referrer Policy: strict-origin-when-cross-origin
cache-control: private
content-length: ...
content-type: text/html; charset=utf-8
date: ...
location: /webapp/someotheraction
server: Microsoft-IIS/10.0
set-cookie: someparam=somevalue; expires=Thu, 17-Mar-2022 14:41:13 GMT; path=/; secure; HttpOnly; SameSite=Strict
strict-transport-security: max-age=31536000
x-frame-options: SAMEORIGIN
浏览器在 302 重定向到 /webapp/someotheraction 时不包含此 cookie。
这只有在我们专门更改代码以将此 cookie 设置为SameSite=Strict
.
这发生在 Chrome、Firefox、Edge 和 IE(旧 IE)中
这是故意的吗?为什么?既然我们要从域上的一个请求转到同一个域中的另一个请求,难道不SameSite=Strict
应该包括 cookie 吗?这与默认的引荐来源政策有什么关系strict-origin-when-cross-origin
吗?https://www.w3.org/TR/referrer-policy/没有提及 cookie
解决方案
这是一个跨站点请求,因为初始导航是跨站点的(从customer.site
到our.site
)。严格的 cookie 永远不会在跨站点请求上发送。请求被重定向(在这种情况下,重定向到 上的另一个 URL our.site
)并不重要,只是用户单击跨站点链接这一事实意味着请求是跨站点的。
至于为什么会这样,那是因为负责启动导航的来源对于防止跨站请求伪造(CSRF)很重要。想象一下,如果https://evil.site
有一个https://bank.site/transfer-funds
重定向到的链接https://bank.site/transact
。我们不希望 Strict cookie/transact
在重定向后发送到端点,即使它是由同一个站点重定向到的,因为发起源是跨站点的。
推荐阅读
- smartsheet-api - Smartsheet - 获取行创建者的 ID
- r - 如何生成热图
- python - IsADirectoryError: [Errno 21] Is a directory: '/' while copying files from one folder to another existing folder Python
- python - AttributeError:模块“seaborn”没有属性“histplot”
- nginx - NGINX 控制器 Kubernetes:需要更改入口内的主机标头
- vue.js - axios - 无法对数组进行响应
- php - 致命错误:不能将字符串偏移量用作数组
- oracle - 在 Oracle 中将小时变量添加到日期变量
- javascript - 函数调用相互影响
- c++ - A pthread with SCHED_RR and higher real time priority failed to preempt a kthread in kernel module with lower priority