在Safari浏览器中设置跨域的cookie可以比较棘手,特别是从Safari 12开始,苹果加强了对隐私的保护,特别是对于跨站点追踪。首先,需要确保你有权控制iframe内部的内容以及外部域。
默认情况下,Safari 使用了一个名为Intelligent Tracking Prevention (ITP)的隐私保护机制,该机制限制了跨站点追踪,包括通过第三方cookie进行的追踪。这意味着在Safari中,任何由第三方域设置的cookie默认情况下都会被阻止,除非用户与那个域有“意图的互动”。
设置跨域Cookie的步骤:
-
确保用户交互: 用户必须在外部域有"意图的互动",例如通过点击链接、按钮等。这可以通过让用户在iframe中进行点击操作来实现。
-
使用服务器设置HTTP响应头: 从Safari 13开始,需要在设置cookie的HTTP响应中包含
SameSite=None
和Secure
属性。SameSite=None
指示浏览器这是一个第三方cookie,而Secure
属性要求cookie只能在HTTPS连接中被设置和发送。示例:
shellSet-Cookie: mycookie=value; SameSite=None; Secure
-
请求用户允许跨站跟踪: 从macOS Mojave和iOS 12开始,Safari 需要用户在Safari的偏好设置中明确地允许跨站点跟踪。如果用户没有允许,即使设置了
SameSite=None
和Secure
属性,cookie也不会被设置。 -
确认使用HTTPS: 由于
Secure
属性的原因,确保你的网站以及设置cookie的服务都是通过HTTPS提供的。 -
考虑使用客户端存储方案: 如果在Safari中设置cookie仍存在问题,可以考虑使用Web Storage API(localStorage或sessionStorage),尽管它们也有自己的限制和不支持跨域的问题。
示例场景:
假设你有一个域名为example.com
的网站,你需要在嵌入到anotherdomain.com
页面上的iframe中设置cookie。用户从anotherdomain.com/page-with-iframe
访问页面,iframe的源是example.com/iframe-content
。
-
当用户到达
anotherdomain.com/page-with-iframe
页面时,你可以在页面上提供一个说明性的消息和一个按钮,告知用户您需要他们的操作以继续。 -
用户在iframe中点击一个按钮或链接,这意味着他们与
example.com
的内容进行了互动。 -
example.com
的服务器响应用户操作的请求,并在HTTP响应头中设置cookie,如下所示:shellSet-Cookie: sessionId=abc123; SameSite=None; Secure
-
一旦用户同意并进行了操作,cookie就会被设置。但请注意,用户必须允许Safari的跨站点追踪功能,并且你必须保证所有通信都通过HTTPS进行。
这是一个简化的例子,实际情况可能需要更复杂的用户界面和错误处理逻辑。此外,开发者应该密切关注苹果公司对Safari隐私政策的更新,因为这些政策可能会影响到跨域cookie的行为。