Safari LocalStorage 未在同一域托管的 IFrame 之间共享

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

我们正在开发两个 Web 应用程序,它们托管在同一域的两个不同子域上:

  • https://subDomainA.domain.com
  • https://subDomainB.domain.com

两个 Web 应用程序都显示托管在第三个子域上的 iFrame

  • https://subDomainC.domain.com

我们使用

postMessage
在顶部窗口和 IFrame 窗口之间进行通信。

subDomainA上显示的iFrame中,我们正在设置一个AuthToken:

localStorage.setItem("AuthToken", "JWTAuthToken")

当我们导航到 subDomainB 并尝试在 iFrame 中运行以下代码时:

localStorage.getItem("AuthToken")

结果是

null

  • 这只发生在 Safari 浏览器中。
    • 所有其他浏览器共享这些IFrame中的LocalStorage
  • 我们位于同一个域,即相同的“eTLD+1”(
    domain.com
    )
  • 用 cookies 做同样的事情有效!。只是不使用 LocalStorage
  • 直接在浏览器中打开 subDomainC 并设置数据也会将它们保留在 IFrame 中。

这是 Safari 的预期行为还是我们的实现存在问题?

javascript iframe safari local-storage
3个回答
9
投票

这是 Safari 中的预期行为。 Safari 的智能跟踪预防 (ITP) 根据顶部框架对浏览器存储进行分区。 WebKit 的文档是这样解释的:

分区是一种允许第三方使用存储和有状态 Web 功能的技术,但将这些功能与第一方网站隔离。假设 adtech.example 是 news.example 和 blog.example 下的第三方,并且 adtech.example 使用 LocalStorage。通过分区 LocalStorage,adtech.example 将在 news.example 和 blog.example 下获得唯一的存储实例,从而消除了通过 LocalStorage 进行跨站点跟踪的可能性。

参考资料:

https://webkit.org/tracking-prevention/#partitioned-third-party-localstorage

Safari 和 Safari 移动设备上的 Iframe localStorage

用稍微简单一点的英语,https://github.com/zendesk/cross-storage说:

Safari 7+(OSX、iOS)注意事项

Safari 7+ 默认禁用所有跨域本地存储访问。这是“阻止 cookie 和其他网站数据”隐私设置设置为“

From third parties and advertisers
”的结果。任何跨存储客户端代码都不会崩溃,但是,它只能访问沙盒中的、隔离的本地存储实例。因此,之前由其他来源设置的任何数据都将不可访问。如果可以的话,人们可以回退到对这些用户代理使用根 cookie,或者从服务器端存储请求数据。

这可能有用: https://webkit.org/blog/8124/introducing-storage-access-api/

总而言之,潜在的解决方案包括:

  1. 改用根域 cookie。
  2. 使用服务器端存储。
  3. 如果您的所有域都位于同一服务器上,但有不同的 Docker 映像或其他内容,您可以反向代理所有网站,以便它们显示为一个域。
  4. 将要共享的 iframe 托管在
    example.com
    上,然后在
    one.example.com
    two.example.com
    之间共享。
  5. 使用存储访问 API

0
投票

根据同源策略,不同子域都视为跨域。

您应该使用

postMessage
进行跨源通信。


0
投票

似乎 Safari 浏览器的最新更新(防止跨站点跟踪)会在 Matomo 域与加载的网站不匹配时阻止生成任何 cookie。

这会破坏需要设置 cookie 的 Matomo iFrame 的使用(例如 logme 功能)

似乎没有任何方法可以通过标头修复此问题(例如使用 CSP 或 CORS 配置)。

我发现当前存在解决方法:

  1. 禁用隐私设置中的“防止跨站点跟踪”设置
  2. 将访问者重定向到 iFrame 外部的页面以设置 cookie - 此后,只要 CORS 配置正确并且浏览器没有完全阻止 iFrame 加载,iFrame 就可以加载。

我不确定有多少用户正在使用需要设置 cookie 的 iFrame,但如果他们的任何用户使用 Safari,他们就会受到影响。

© www.soinside.com 2019 - 2024. All rights reserved.