无法在 Safari 13 中跨 .test 子域共享 cookie

Posted

技术标签:

【中文标题】无法在 Safari 13 中跨 .test 子域共享 cookie【英文标题】:Sharing cookies across .test sub-domains in Safari 13 not possible 【发布时间】:2020-09-13 08:34:39 【问题描述】:

我有一个 https://example.test 和 https://m.example.test 的 apache 自我证书

浏览https://m.example.test 时,cookie 使用 php 'session.cookie_domain' 设置为基本域 '.example.test'。这在 Chrome、Firefox 或 Safari 最高版本 12 中有效。 但是,它不再适用于 Safari 13(ios 13 或 Catalina)。

更奇怪的是,在我的生产机器上,我的 Safari 13 上的 cookie 仍然设置为基域为https://example.COM & https://m.example.COM

COM 和 TEST 服务器的 apache 服务器配置相同。在将我的 iOS 设备更新到 iOS 13 或在 Catalina 之后的 MacOS 中之后,它只是停止在我的开发“.test”服务器上工作。 Chrome、Firefox 仍然可以使用。即使是连接到我的开发机器(通过代理)的旧 iOS 设备仍将 cookie 存储到基本域“.example.test”。所以看起来它是 Safari 13 特有的,并且只在“.test”域中。

我使用 Apple 的最新建议(最长 825 天等)为我的 .TEST 服务器创建了新证书,但没有任何区别。看起来自签名证书可能发生了一些变化。或者“.test”(非公共)域可能存在新规则?它是 Safari 特有的,“.test”非公共域或证书。或者我什至没有想到的其他事情。

知道如何配置 Apache/Macosx/certificates 以便我仍然可以在开发 .test 域中使用 Safari 13 跨子域共享 cookie?谢谢。

【问题讨论】:

我也看到.test tld 的子域和 cookie 存在这个问题。 很高兴我不是唯一遇到这个问题的人。这让我困扰了好几个星期…… 我已通过 Apple 的反馈助手将其提交给 Safari 团队:feedbackassistant.apple.com/feedback/8297270 【参考方案1】:

.test tld 的通配符子域和 cookie 也有同样的问题。它在 Chrome 中工作,但 Safari 13 没有设置 cookie。

我的解决方法是改用.local。这也适用于 Safari。

(像@gueorgui建议的那样单独指定每个子域并不能按预期工作,因为浏览器将为每个子域设置单独的cookie)

【讨论】:

【参考方案2】:

这不是证书的问题,但 Safari 解析 .test TLD 的方式似乎有所不同。

我们通过为我们需要的每个子域显式设置 cookie 来解决这个问题。在我们的 Rails 应用程序的开发环境中,我们像这样设置会话存储:

config.session_store(
  :active_record_store,
  key: 'our_app_session',
  domain: ['ourapp.test', 'api.ourapp.test', 'help.ourapp.test']
)

如果您能找到在后端执行相同操作的方法,您应该能够为不同的.test 子域使用相同的 cookie。

【讨论】:

以上是关于无法在 Safari 13 中跨 .test 子域共享 cookie的主要内容,如果未能解决你的问题,请参考以下文章

Express 中跨子域的会话

为啥 Chrome 和 Safari 看不到某些子域的 cookie?

curl: (6) 访问子域时无法解析主机

JS常用的7中跨域方式总结

在 iOS9 中跨应用程序共享 cookie

如何在 Ubuntu 上为 Apache2 配置子域?