Samesite=当用户从不同域单击 link 时,302 重定向中不包含严格 cookie

Samesite=Strict cookies are not included in 302 redirects when user clicks link from a different domain

  1. 一位客户将 link 到他们网站上的我们的网页之一:customer.site/links.html
  2. 一个人点击那个 link 并被发送到我们的。site/webapp/handlerequest.aspx?someparam=somevalue
  3. someparam 的值在 SameSite=Strict 的 cookie 中设置,然后使用 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.siteour.site)。跨站点请求永远不会发送严格的 cookie。请求被重定向(在本例中,重定向到 our.site 上的另一个 URL)并不重要,只是用户单击跨站点 link 的事实意味着请求是跨站的。

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