如果API位于不同的子域,Safari 13+会阻止第三方Cookie



我有Web应用程序和API应用程序。

这些应用程序托管在不同的域上。

例如。

WebApp:app.product.com

API:API.product.com

响应API调用,在set-Cookie头中设置Cookie:

api.product.com/SetCookie->响应标头Set Cookie:Cookie_name=Cookie_value;路径=/;保护HttpOnly;SameSite=无

然后我再次向API发出请求,我需要将此cookie附加到请求头。

在大多数流行的浏览器上一切都很好,但在Safari(13.1+版本(上,这个cookie没有设置(甚至在开发工具中也看不到(。

Cookie在响应中可见cookie 响应

但它没有存储在浏览器cookie中在此处输入图像描述

我试图将cookie的域属性设置为"product.com",但并没有解决问题。

在这种情况下,有什么方法可以设置跨域cookie吗?也许可以通过更改设置cookie属性。

或者托管来自同一域的所有应用程序将解决问题?

如果可能的话,从同一域托管将解决这个问题,因为iframe cookie将不再是"第三方",因此限制将被取消。

在Safari中,第三方框架必须请求访问Storage API,然后才能访问cookie。

所有的浏览器都对cookie和iframe进行了许多更改。

改变的基础是现在有了"SameSite"cookie策略,其中Only cookies set as SameSite=None; Secure will be available in third-party contexts, provided they are being accessed from secure connections.

Firefox对存储使用分区方法,因此框架将正常运行,除非您将应用程序作为新窗口打开,否则cookie存储可能会跟随,也可能不会跟随,这取决于新窗口是如何创建的。

Cookie状态是一个极好的资源,可以跟踪第三方Cookie在不同浏览器中的工作方式,以及您应该更改哪些内容才能使其工作。

从13.1版本开始,Safari完全阻止第三方cookiehttps://webkit.org/blog/10218/full-third-party-cookie-blocking-and-more/

是否按下了"存储"选项卡右上角的重新加载按钮?我使用Safari 14.1.1并构建一个类似的环境来进行相同的测试。但得到了不同的结果,即使Safari从未作为第一方访问过api.example.net。我仍然可以在上面写cookie。我的工作:

  1. 访问app.example.net
  2. 打开devtool并转到"网络"面板
  3. 执行fetch('https://api.example.net/x.php', {method: 'POST', credentials: 'include'});
  4. x.php将返回标头Set-Cookie: test=test; expires=Mon, 06-Sep-2021 09:42:18 GMT; Max-Age=5184000; secure; HttpOnly; SameSite=None中的设置cookie
  5. 再次执行,我可以看到这个cookie是与第二个请求一起发送的
  6. 我还在另一个页面上使用iframe来嵌入api.example.net。所以它不会是第一方。我可以看到该域的存储数据。就像@smyq提供的截图一样。然后按下重新加载按钮。cookie出现在devtool中

但我没想到会有这种行为。我认为这违反了Safari的默认cookie策略。Safari现在正在屏蔽所有第三方cookie。

PS。如果我在一个非常不同的域名上这样做,而不仅仅是一个不同的子域。cookie将被ITP的跟踪阻止阻止。我启用了ITP调试模式来获取信息。

最新更新