我了解到 Safari 实施了跨站点 cookie 安全性,并且我们的服务器团队在设置 cookie 时添加了 "SameSite=None;Secure"。但即便如此,它仍然不起作用。
请提供建议或者提供实际找到解决方案的人们的链接。
Set-Cookie: my_cookie=XXXXX; path=/; secure; HttpOnly; SameSite=None
Set-Cookie: my_cookie=XXXXX; path=/; secure; HttpOnly; SameSite=None
受到此漏洞影响的是 MacOS 10.14 上的 Safari 版本和 iOS 12 上的所有浏览器,这意味着SameSite=None
被错误地视为SameSite=Strict
,例如最严格的设置。
我在SameSite cookie recipes中发布了一些指南,包括:
SameSite=None; Secure
和不支持此选项的浏览器。SameSite=None
。在Safari 14中也存在此问题。Safari不再默认发送第三方cookie。这是因为苹果引入了隐私设置:“防止跨站追踪”,默认开启。因此,如果您使用 SameSite = None; Secure 设置cookie,则仍然无法在跨域时发送。
/api/*
的请求代理到另一个服务器)。或者,如果你控制另一个服务器,你可以将其托管在你的站点的子域名或相邻域名下,这样Safari就会将其视为“同一站点”。 - undefinedSet-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
,并且对于生产环境需要将Secure
设置为(ssl)。你可以使用不同的值SameSite
,但Lax
适用于我。我尝试禁用 MAC OS 中的“防止跨站追踪”选项(即,设置 > Safari > 隐私与安全 > 防止跨站追踪 - 禁用),然后 iframe 开始工作。我知道这不是一个解决方法,但可能是短期内的快速解决方法。
自从开始在我们的网站上工作以来,我一直在努力理解cookie。但是最后我终于弄明白了。在我们的服务器上,我们使用Firebase会话在Express应用程序中初始化它们,就像这样:
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,
})
)
对于我们的iOS应用程序,cookie的设置并不重要,但是对于我们的网站,我们遇到了几个障碍。为了让它在桌面网站浏览器和安卓上正常工作,我们必须将cookie设置为安全和httpOnly。然而,在iOS移动浏览器上,cookie无法设置。问题是因为iOS上的移动浏览器只使用第一方cookie。我不得不为我们的API服务器添加一个CNAME,该服务器是我们网站的子域名,并将API调用定向到该CNAME。然后,在我们的API中必须指定cookie的域(必须明确指定子域允许在cookie中)。这解决了问题。
SameSite=None; Secure
。/api/*
请求代理到其他服务器),从而使API请求成为“同一站点”。如何实现这一点取决于您用于托管站点的解决方案。