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

问题描述 投票:0回答:8

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

我读到了 safari 实现的跨站点 cookie 安全性,我们的服务器团队在设置 cookie 时添加了

SameSite=None;Secure
。即使之后,它仍然不起作用。

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

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

javascript cookies safari setcookie samesite
8个回答
39
投票

MacOS 10.14 上的 Safari 版本和 iOS 12 上的所有浏览器都会受到 此 bug 的影响,这意味着

SameSite=None
被错误地视为
SameSite=Strict
,例如最严格的设置。

我在 SameSite cookie Recipes 中发布了一些指南:

  • 使用两组 cookie 来区分支持
    SameSite=None; Secure
    和不支持的浏览器。
  • 嗅探用户代理是否存在不兼容的浏览器,并且不为这些请求提供服务
    SameSite=None

15
投票

Safari 不再发送跨站点 cookie。因此,即使 cookie 设置为 SameSite=None,它也不会与第三方 ajax 请求一起发送。

要允许发送跨站点 cookie,请转至

Safari > Preferences > Privacy
并取消选中
Prevent cross-site tracking


13
投票

这也是 Safari 14 中的一个问题。Safari 默认情况下不再发送第三方 cookie。这是因为他们引入了隐私首选项:默认情况下打开的“防止跨站点跟踪”。因此,如果您使用

SameSite=None; Secure
设置 cookie,它们仍然不会被设置并跨域发送。


11
投票

问题不在于 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
对我有用


2
投票

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


1
投票

自从第一次在我们的网站上开始工作以来,我一直在努力弄清楚 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 中允许子域)。这解决了它。


0
投票

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


0
投票

正如几个答案已经提到的,这似乎是 Safari 中引入的预期行为,其中它偏离了其他浏览器实现的网络规范。

默认启用的“防止跨站点跟踪”设置会导致所有跨站点 Cookie 被拒绝,无论其他浏览器是否接受其他浏览器是否接受。

解决方法:

如果您控制跨站点 API,则可以将其托管在您站点的子域或同级域上。看来,只要您的网站和 API 有一个共同的父域,Safari 就会将其视为“同一网站”并允许 cookie。我没有文档支持这一点,但我在 Safari 17 上进行了测试。
  • 让您站点的服务器代理跨站点 API(例如,代理
  • SameSite=None; Secure
  • 请求到其他服务器),从而使 API 请求“同一站点”。如何执行此操作取决于您用于托管网站的解决方案。
    
        
© www.soinside.com 2019 - 2024. All rights reserved.