会话cookie设置为`SameSite=None; Secure;`无效。

14

我在 set-cookie 中添加了 SameSite=None; Secure;,但是Cookie没有被设置,导致我无法登录我的网站。

response.writeHead(200, {
  'Content-Type': 'application/json',
  'Set-Cookie': 'token=' + token + '; SameSite=None; Secure; Expires=' + time.toUTCString() + '; Path=/' + '; Domain=' + hostname,
  'csrf-token': csrfToken
});

我在开发者工具下的 Application>Storage>Cookies 中检查了 cookie 并查看了更多细节,它显示了一个警告信息:

这个 set-cookie 被阻止了,因为它没有通过安全连接发送

Chrome 阻止了 cookies,因为我在开发环境中发送 http 请求。但是,在 Firefox 浏览器上进行测试时可以正常登录。 我将单词 secure 放入 cookie 中并且它能够正常工作,但因为单词 secure 必须与 samesite = none 一起使用才能进行跨域访问,否则 cookie 将被阻止。 我的问题是,为什么当我使用 secure 时,只有 Chrome 浏览器会阻止 cookie,但在其他浏览器中它却是有效的。 如果我不使用 secure,我将无法测试支付网关,因为如果我不使用安全方式,则 Chrome 将阻止跨源请求...


“它没有通过安全连接发送”。“安全连接”在这里指https架构,并且使用http架构不接受cookie。 - Teemu
这是一个非常棒的问题,可以被标记为研究性问题,因为它对广泛应用产生了影响。问题似乎出在不同浏览器供应商的实现和发布细节上。在我们的 timeonsite tracker JS 团队中,我们正在努力解决这个问题,因为实时站点停留时间跟踪完全依赖于 cookie(无论是同站点还是跨站点)。 - webblover
2个回答

9
我的问题是为什么只有Chrome浏览器会阻止带有“secure”属性的cookie,而其他浏览器则不会。
我不确定其他浏览器是否也会这样做,但是根据IETF draft,Chrome实施了允许在安全连接上使用带有“secure”属性的cookie的策略。
虽然该草案已在Chrome中实施,但Firefox尚未实施,这就是为什么在Firefox中,如果您转到about:config > network.cookie.sameSite.noneRequiresSecure,默认值为false
如果您只需要在本地开发环境中执行此操作,则可以通过禁用来保留Chrome中cookie的旧行为。
  1. chrome://flags/#same-site-by-default-cookies
  2. chrome://flags/#cookies-without-same-site-must-be-secure
我必须支持遗留的http客户端,但如果我使https://起源安全,我就无法从http设置cookie,更重要的是我无法从http访问此cookie,我的目标是在http上具有SameSite=None,Secure,在http://起源不安全,有什么想法,而不是在谷歌办公室附近建立抗议活动?
考虑到这将在不久的将来成为标准,我怀疑您将无法为客户端应用程序实现此行为,唯一的方法是进行安全的HTTPS。
参考:
  1. https://web.dev/samesite-cookies-explained/#changes-to-the-default-behavior-without-samesite
  2. https://redmondmag.com/articles/2020/01/28/samesite-cookie-changes-break-apps.aspx

我遇到的问题是无法更新使用http的客户端,并且无法将其重定向。 "secure"属性使得在http来源上无法使用cookie,这是错误的,我认为它应该允许在不同的存储中设置单独的“非安全”cookie。 - zb'
我正在尝试使用header('Set-Cookie: cookie2=value2; SameSite=None; Secure', true);通过支付网关跨站发送cookie。但是一旦付款完成并且用户返回产品页面再次下订单时,Chrome会阻止购物车数据(会话)。我不明白出了什么问题。 - Dante
不确定您所说的会话被 Chrome 阻止是什么意思。您是否在使用开发者工具查看 cookie?您有一个我可以查看的网站吗? - Dipen Shah
Chrome的same-site-by-default-cookies或其他标志的支持已被删除,因此现在的解决方案是使用Firefox。https://piunikaweb.com/2021/06/14/google-chrome-flags-for-samesite-cookies-taken-away-after-update-v91/ - Bersan

5

某些cookie未能按预期工作,因为一些cookie滥用了sameSite属性。 Cookie SomeCookie被拒绝,因为它具有sameSite=none属性,但缺少secure属性。所以任何请求SameSite=None的cookie都必须标记为Secure

Set-Cookie: product=pen; SameSite=None

为了解决这个问题,你必须将Secure属性添加到你的SameSite=None cookies。
Set-Cookie: flavor=choco; SameSite=None; Secure

安全 Cookie 只会在使用加密的请求通过 HTTPS 协议发送到服务器时发送。

注意:不安全的网站 (http:) 无法使用 Secure 指令设置 Cookie。


如果我只想让我的 cookie 在未来的 Chromium 版本中像以前一样继续工作(无论是否安全,跨域),该怎么办? - zb'
我认为对于你的后续问题,官方答案是“让客户端停止使用HTTP”,他们真的不想继续支持非SSL连接。 - Coderer
谢谢你的备注。有没有办法在开发中使用http:<IP>:<PORT>来使其工作? - Shani Kehati
但是我的本地开发环境没有https,如果设置跨站点cookie需要SameSite=NoneSameSite=None需要Secure=true,这太荒谬了,我该怎么办? - Bersan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接