我们正在研究两个托管在两个不同域上的Web应用程序:
两个网络应用程序都显示一个 IFrame 。该IFrame具有以下网址:
注意:我们正在使用postMessage
在顶部窗口和IFrame窗口之间进行通信。
在网络应用程序 subDomainA 上托管的IFrame中,我们正在设置AuthToken:
localStorage.setItem("AuthToken", "JWTAuthToken")
然后,我们导航到 subDomainB 。该Web应用程序包含完全相同的IFrame。
当我们现在尝试运行以下代码时:
localStorage.getItem("AuthToken")
结果为null
。
我们期望结果为JWTAuthToken
,因为IFrame位于同一域中,因此应共享一个公共LocalStorage。
domain.com
)requestStorageAccess
不会改变行为这是Safari的故意行为,还是我们的实现存在问题?
非常感谢您的帮助!
答案 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
进行跨域通信。