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

ggr*_*nig 9 javascript safari iframe local-storage

我们正在研究托管在同一域的两个不同子域上的两个 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)
  • 用 cookie 做完全相同的事情. 只是不使用 LocalStorage
  • 直接在浏览器中打开subDomainC并设置数据也会为 IFrame 保留它们。

这是 Safari 的固有行为还是我们的实现有问题?

Eli*_*lin 12

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

\n

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

\n

参考:

\n

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

\n

Safari 和 Safari 移动设备上的 Iframe localStorage

\n

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

\n

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

\n

Safari 7+ 默认情况下禁用所有跨域本地存储访问。这是“阻止 cookie 和其他网站数据”隐私设置被设置为“ ”的结果From third parties and advertisers。任何跨存储客户端代码都不会崩溃,但是,它只能访问沙盒中的、隔离的本地存储实例。因此,之前由其他来源设置的任何数据都将不可访问。如果可以的话,人们可以回退到对这些用户代理使用根cookie,或者从服务器端存储请求数据。

\n

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

\n
\n

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

\n
    \n
  1. 请改用根域 cookie。
  2. \n
  3. 使用服务器端存储,并通过 JSON 请求您需要的数据。
  4. \n
  5. 如果您的所有域都位于同一服务器上,但有不同的 Docker 映像或其他内容,您可以对所有网站进行反向代理和/或别名,以便它们显示为一个域。
  6. \n
  7. 将您想要共享的 iframe 托管在example.com(不是www!),然后在one.example.com和之间共享two.example.com
  8. \n
  9. 使用存储访问 API
  10. \n
\n