乐闻世界logo
搜索文章和话题

如何在 Safari 中的 iframe 中设置来自外部域的 cookie ?

4 个月前提问
3 个月前修改
浏览次数86

1个答案

1

在Safari浏览器中设置跨域的cookie可以比较棘手,特别是从Safari 12开始,苹果加强了对隐私的保护,特别是对于跨站点追踪。首先,需要确保你有权控制iframe内部的内容以及外部域。

默认情况下,Safari 使用了一个名为Intelligent Tracking Prevention (ITP)的隐私保护机制,该机制限制了跨站点追踪,包括通过第三方cookie进行的追踪。这意味着在Safari中,任何由第三方域设置的cookie默认情况下都会被阻止,除非用户与那个域有“意图的互动”。

设置跨域Cookie的步骤:

  1. 确保用户交互: 用户必须在外部域有"意图的互动",例如通过点击链接、按钮等。这可以通过让用户在iframe中进行点击操作来实现。

  2. 使用服务器设置HTTP响应头: 从Safari 13开始,需要在设置cookie的HTTP响应中包含SameSite=NoneSecure属性。SameSite=None指示浏览器这是一个第三方cookie,而Secure属性要求cookie只能在HTTPS连接中被设置和发送。

    示例:

    shell
    Set-Cookie: mycookie=value; SameSite=None; Secure
  3. 请求用户允许跨站跟踪: 从macOS Mojave和iOS 12开始,Safari 需要用户在Safari的偏好设置中明确地允许跨站点跟踪。如果用户没有允许,即使设置了SameSite=NoneSecure属性,cookie也不会被设置。

  4. 确认使用HTTPS: 由于Secure属性的原因,确保你的网站以及设置cookie的服务都是通过HTTPS提供的。

  5. 考虑使用客户端存储方案: 如果在Safari中设置cookie仍存在问题,可以考虑使用Web Storage API(localStorage或sessionStorage),尽管它们也有自己的限制和不支持跨域的问题。

示例场景:

假设你有一个域名为example.com的网站,你需要在嵌入到anotherdomain.com页面上的iframe中设置cookie。用户从anotherdomain.com/page-with-iframe访问页面,iframe的源是example.com/iframe-content

  1. 当用户到达anotherdomain.com/page-with-iframe页面时,你可以在页面上提供一个说明性的消息和一个按钮,告知用户您需要他们的操作以继续。

  2. 用户在iframe中点击一个按钮或链接,这意味着他们与example.com的内容进行了互动。

  3. example.com的服务器响应用户操作的请求,并在HTTP响应头中设置cookie,如下所示:

    shell
    Set-Cookie: sessionId=abc123; SameSite=None; Secure
  4. 一旦用户同意并进行了操作,cookie就会被设置。但请注意,用户必须允许Safari的跨站点追踪功能,并且你必须保证所有通信都通过HTTPS进行。

这是一个简化的例子,实际情况可能需要更复杂的用户界面和错误处理逻辑。此外,开发者应该密切关注苹果公司对Safari隐私政策的更新,因为这些政策可能会影响到跨域cookie的行为。

2024年6月29日 12:07 回复

你的答案