即使在设置 SameSite=None 之后,Safari 也不发送 cookie;安全的

Posted

技术标签:

【中文标题】即使在设置 SameSite=None 之后,Safari 也不发送 cookie;安全的【英文标题】:Safari not sending cookie even after setting SameSite=None; Secure 【发布时间】:2020-02-19 20:52:55 【问题描述】:

我们的应用程序使用 cookie 来记住用户登录。我们进行的每个身份验证 API 调用,浏览器都会将服务器设置的 HTTPonly cookie 附加到 API 请求中并获得身份验证。在 Mojave 发布后,这种行为似乎在 safari 中被打破。

我了解了 safari 实施的跨站点 cookie 安全性,我们的服务器团队在设置 cookie 时添加了SameSite=None;Secure。即使在那之后,它仍然不起作用。

Set-Cookie: my_cookie=XXXXX; path=/; secure; HttpOnly; SameSite=None

请建议或提供实际找到解决方案的人的链接..

【问题讨论】:

【参考方案1】:

问题不在于 Safari 是否发送 cookie,而在于 Safari 不存储 cookie。这与 cookie 配置的特定组合有关,它适用于 localhost 的此设置

Set-Cookie: your=cookie; Domain=localhost; Path=/; Expires=Mon, 26 Dec 2022 12:53:02 GMT; HttpOnly; SameSite=Lax

还有这个用于产品的设置

set-cookie: your=cookie; Domain=something.com; Path=/; Expires=Thu, 22 Dec 2022 04:17:44 GMT; HttpOnly; Secure; SameSite=Lax

您需要在两者上都包含Domain,并为您的产品(ssl)环境包含Secure。您可以为 SameSite 使用不同的值,但 Lax 对我有用

【讨论】:

哇,我真的很感激我遇到了你的答案。你真的救了我的命。在过去的两天里,我一直在努力解决这个问题,我尝试了很多东西,但在找到你的答案之前似乎找不到任何解决方案。我很欣赏像你这样的人! :)【参考方案2】:

我尝试在 MAC OS 中禁用“防止跨站点跟踪”选项(即,设置 > Safari > 隐私和安全 > 防止跨站点跟踪 - 已禁用)并且 iframe 开始工作。我知道这不是解决办法,但可能是短期内的快速解决方法。

【讨论】:

请添加更多详细信息以扩展您的答案,例如工作代码或文档引用。【参考方案3】:

这也是 Safari 14 中的一个问题。默认情况下,Safari 不再发送第三方 cookie。这是因为他们引入了隐私偏好:默认情况下打开的“防止跨站点跟踪”。因此,如果您使用 SameSite=None; Secure 设置 cookie,它们仍然不会被设置并跨域发送。

【讨论】:

【参考方案4】:

对于用 Ruby 编码的应用程序(特别是 Rails、Sinatra 或 Rack 上的任何东西),RailsSameSiteCookie gem 很好地解决了这个问题和相关问题。这段代码读起来就像是 pseudocode in the Chromium discussion 的近似翻译,没有脆弱的正则表达式。

【讨论】:

【参考方案5】:

MacOS 10.14 上的 Safari 版本和 ios 12 上的所有浏览器都受到this bug 的影响,这意味着SameSite=None 被错误地视为SameSite=Strict,例如最严格的设置。

我在SameSite cookie recipes 中发布了一些指导:

使用两组 cookie 来说明支持 SameSite=None; Secure 和不支持的浏览器。 嗅探用户代理 for incompatible browsers 而不为这些请求提供 SameSite=None

【讨论】:

您好,Rowan,感谢您的回复,并为迟到的回复道歉。我已经要求我的服务器端团队试用上面 web.dev 链接中的指导。也许这是一个完全不合适的问题,不管怎样。由于数百万用户受到此更改的影响,如果苹果团队未来有计划解决此问题,有什么消息吗? 我不能代表 Apple / Safari 团队发言。我认为原始错误是进行这些讨论的最佳场所。 天哪。刚刚过去三天与一位从贝宝返回的客户度过了最糟糕的时间,因为 cookie 似乎丢失了(因此没有继续购买的会话)……而且他们使用的是比当前更旧的 Safari/webkit…… . 这个问题准确地描述了这个问题。 根据错误报告,他们似乎不打算向后移植修复程序,因为这是有意的。 Safari 的 cookie 策略是不同的,因此,当它接收到未知属性时,它的行为可能与其他浏览器不同。最终,苹果就是苹果。 那么什么 safari 版本有修复?

以上是关于即使在设置 SameSite=None 之后,Safari 也不发送 cookie;安全的的主要内容,如果未能解决你的问题,请参考以下文章

即使指定了 samesite=none,浏览器也会使用 samesite=lax

SameSite=None w/ IE11 中的安全中断 iFrame

ASP.Net 无法使用 SameSite=None 设置 cookie

Flask cookie 没有 SameSite 属性

无法为 spring boot 1.5.22 设置 cookie samesite=none

SameSite=None .htaccess 正则表达式问题