我们的应用程序使用 cookie 来记住用户登录。我们进行的每次身份验证 API 调用,浏览器都会将服务器设置的 HTTPonly cookie 附加到 API 请求并获得身份验证。 Mojave 发布后,这种行为似乎在 Safari 中被打破了。
我读到了 safari 实现的跨站点 cookie 安全性,我们的服务器团队在设置 cookie 时添加了
SameSite=None;Secure
。即使之后,它仍然不起作用。
Set-Cookie: my_cookie=XXXXX; path=/; secure; HttpOnly; SameSite=None
请提供建议或提供实际找到解决方案的人的链接..
MacOS 10.14 上的 Safari 版本和 iOS 12 上的所有浏览器都会受到 此 bug 的影响,这意味着
SameSite=None
被错误地视为 SameSite=Strict
,例如最严格的设置。
我在 SameSite cookie Recipes 中发布了一些指南:
SameSite=None; Secure
和不支持的浏览器。SameSite=None
。这也是 Safari 14 中的一个问题。Safari 默认情况下不再发送第三方 cookie。这是因为他们引入了隐私首选项:默认情况下打开的“防止跨站点跟踪”。因此,如果您使用
SameSite=None; Secure
设置 cookie,它们仍然不会被设置并跨域发送。
问题不在于 Safari 发送或不发送 cookie,而在于 Safari 不存储 cookie。这与 cookie 配置的特定组合有关,它正在与本地主机的此设置一起使用
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
对我有用
我尝试在 MAC OS 中禁用“防止跨站点跟踪”选项(即设置 > Safari > 隐私和安全 > 防止跨站点跟踪 - 禁用),iframe 开始工作。我知道这不是解决办法,但可能是短时间内的快速解决方法。
自从第一次在我们的网站上开始工作以来,我一直在努力弄清楚 cookie。我终于弄清楚了。在我们的服务器上,我们在 Express 应用程序中使用 Firebase 会话,它们的初始化如下:
app.use(
session({
name: "myCookie",
store: new FirestoreStore({ dataset: firestore }),
secret: process.env.SESSION_SECRET as string,
resave: false,
proxy: true,
cookie: {
maxAge: 1000 * 60 * 60 * 24 * 365 * 10,
httpOnly: true,
secure: process.env.PROD == "true",
sameSite: 'lax',
domain: "mydomain.com"
},
saveUninitialized: false,
})
)
cookie 的设置对于我们的 iOS 应用程序来说并不重要,但对于我们的网站来说,我们遇到了一些障碍。为了让它在桌面网站浏览器和 Android 上运行,我们必须将 cookie 设置为 secure 和 httpOnly。但是,对于 iOS 移动浏览器,无法设置 cookie。问题是因为 iOS 上的移动浏览器仅使用第一方 cookie。我必须为我们的 API 服务器添加一个 CNAME,该服务器是我们网站的子域,并直接 API 调用该 CNAME。然后,在我们的 API 中必须指定 cookie 的域(您必须明确执行此操作才能在 cookie 中允许子域)。这解决了它。
对于用 Ruby 编码的应用程序(特别是 Rails、Sinatra 或 Rack 上的任何东西),RailsSameSiteCookie gem 很好地解决了这个问题和相关问题。该代码读起来就像是 Chromium 讨论中的伪代码 的近似翻译,没有脆弱的正则表达式。
正如几个答案已经提到的,这似乎是 Safari 中引入的预期行为,其中它偏离了其他浏览器实现的网络规范。
默认启用的“防止跨站点跟踪”设置会导致所有跨站点 Cookie 被拒绝,无论其他浏览器是否接受其他浏览器是否接受。
解决方法:如果您控制跨站点 API,则可以将其托管在您站点的子域或同级域上。看来,只要您的网站和 API 有一个共同的父域,Safari 就会将其视为“同一网站”并允许 cookie。我没有文档支持这一点,但我在 Safari 17 上进行了测试。
SameSite=None; Secure