【问题标题】:CORS, withCredentials and third party cookiesCORS、withCredentials 和第三方 cookie
【发布时间】:2014-11-09 14:39:27
【问题描述】:

我正在尝试做一个 CORS GET 来发送 cookie。我已经在服务器中设置了所有标题(access-control-allow-originaccess-control-allow-credentialsaccess-control-allow-headers),并在 jquery ajax 请求中使用了withCredentials: truecrossDomain: true。当我告诉我的浏览器允许第三方 cookie 时,一切正常。有没有办法在不强迫访问者允许第三方 cookie 的情况下做到这一点?我什至尝试过重定向用户并重定向回来,但 CORS 会拒绝发送 cookie。 :/

我尝试过通过 ajax 以及 iframe 执行 CORS 请求。

【问题讨论】:

  • “允许第三方cookies”是什么意思? CORS 仍然强制执行 cookie 的同源策略,因此它只能从服务器的源发送 cookie。您可以将厨师从一个来源发送到另一个来源。
  • 我有一个来自域 A.com 的页面,我正在尝试在 A.com 的页面上从 B.com 执行 GET/POST。这两个域都是受信任的。这有意义吗?
  • A.com 只能从 A.com 读取/写入 cookie。 B.com 只能从 B.com 读取/写入 cookie。 withCredentials 不会让 A.com 上的 Javascript 从 B.com 读取 cookie,它只表明从 A.com 到 B.com 的请求应该包含 B.com 的 cookie。因此,即使使用 CORS,cookie 的同源策略仍然有效。
  • 就是这样,如果我禁止第三方 cookie,发送到 B.com 的请求不包括 B.com 的 cookie
  • 在这种情况下,查看用于发出请求的代码以及捕获请求和响应标头(来自浏览器的调试器)会很有用。

标签: cookies cross-domain cors same-origin-policy


【解决方案1】:

我认为这是不可能的。请参阅我的(旧但相关的)blog post。 唯一的防弹方法是使用第一方 cookie(即在顶层窗口中打开窗口,如单独的选项卡,或重定向当前窗口)。

在某些情况下,这不是必需的。浏览器对第三方 cookie 的概念略有不同,默认行为也不同。 This post 对这些细节有很好的概述。因此,在某些情况下,您可以采取一些技巧来启用(或至少检测)页面上 cookie 的使用。

其他解决方法包括将一台服务器置于另一台服务器的子域下(子域通常不被视为第 3 方),或更改流程以便通过 cookie 以外的其他方式对用户进行身份验证。

【讨论】:

    猜你喜欢
    • 2011-03-22
    • 2015-03-30
    • 2020-10-13
    • 2010-10-11
    • 1970-01-01
    • 2012-04-25
    • 2011-06-23
    • 1970-01-01
    • 2012-06-28
    相关资源
    最近更新 更多