首页 > 解决方案 > Samesite=当用户点击来自不同域的链接时,302 重定向中不包含严格的 cookie

问题描述

  1. 客户将链接到他们网站上的一个网页:customer.site/links.html
  2. 一个人单击该链接并被发送到 our.site/webapp/handlerequest.aspx?someparam=somevalue
  3. 的值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

标签: cookieshttp-status-code-302samesite

解决方案


这是一个跨站点请求,因为初始导航是跨站点的(从customer.siteour.site)。严格的 cookie 永远不会在跨站点请求上发送。请求被重定向(在这种情况下,重定向到 上的另一个 URL our.site)并不重要,只是用户单击跨站点链接这一事实意味着请求是跨站点的。

至于为什么会这样,那是因为负责启动导航的来源对于防止跨站请求伪造(CSRF)很重要。想象一下,如果https://evil.site有一个https://bank.site/transfer-funds重定向到的链接https://bank.site/transact。我们不希望 Strict cookie/transact在重定向后发送到端点,即使它是由同一个站点重定向到的,因为发起源是跨站点的。


推荐阅读