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

时间:2020-09-16 14:46:07

标签: javascript iframe safari local-storage

设置

我们正在研究两个托管在两个不同域上的Web应用程序:

两个网络应用程序都显示一个 IFrame 。该IFrame具有以下网址:

注意:我们正在使用postMessage在顶部窗口和IFrame窗口之间进行通信。

问题

在网络应用程序 subDomainA 上托管的IFrame中,我们正在设置AuthToken:

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

然后,我们导航到 subDomainB 。该Web应用程序包含完全相同的IFrame。

当我们现在尝试运行以下代码时:

localStorage.getItem("AuthToken")

结果为null

期望

我们期望结果为JWTAuthToken,因为IFrame位于同一域中,因此应共享一个公共LocalStorage。

观察

  • 这仅在Safari浏览器中发生。
    • 所有其他浏览器共享这些iframe中的LocalStorage
  • 我们位于同一个域,即相同的“ eTLD + 1”(domain.com
  • 对Cookie进行完全相同的操作可行!。只是不使用LocalStorage
  • 预先使用requestStorageAccess不会改变行为
  • 直接在浏览器中打开 subDomainC 并设置数据,这些数据也会保留在IFrame中。
  • 我们找不到与此相关的任何文档,也没有其他人描述相同的问题

这是Safari的故意行为,还是我们的实现存在问题?

非常感谢您的帮助!

2 个答案:

答案 0 :(得分:3)

这是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

Iframe localStorage on Safari and Safari mobile

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 :(得分:0)

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

您应使用postMessage进行跨域通信。