我们正在开发两个 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
。
domain.com
)这是 Safari 的预期行为还是我们的实现存在问题?
这是 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/
总而言之,潜在的解决方案包括:
example.com
上,然后在 one.example.com
和 two.example.com
之间共享。根据同源策略,不同子域都视为跨域。
您应该使用
postMessage
进行跨源通信。
似乎 Safari 浏览器的最新更新(防止跨站点跟踪)会在 Matomo 域与加载的网站不匹配时阻止生成任何 cookie。
这会破坏需要设置 cookie 的 Matomo iFrame 的使用(例如 logme 功能)
似乎没有任何方法可以通过标头修复此问题(例如使用 CSP 或 CORS 配置)。
我发现当前存在解决方法:
我不确定有多少用户正在使用需要设置 cookie 的 iFrame,但如果他们的任何用户使用 Safari,他们就会受到影响。