Set-Cookie 从服务器到不同域中的 XHR 客户端,将域设置为客户端的域,应该可以吗?

Set-Cookie from a server to an XHR client in a different domain, setting the domain to the client's domain, should it work?

tl;dr,域 A 中的 XHR 客户端正在向域 B 中的服务器发送请求,服务器以 [​​=11=] 和 Domain=A 响应(客户端的域,XHR 的 Origin),所有 CORS header 设置正确,它应该工作吗?

众所周知,不能将 cookie 设置到另一个域。 ( How to set a cookie for another domain

但是在以下情况下:


演员:

客户端 在域 A 中,基于 Web 的客户端

Server 在域 B 中,设置 CORS headers 允许 A 作为源,包括 Access-Control-Allow-Credentials设置为 true

通信流1(基线):

  1. 客户端正在向服务器发出一个简单的 GET 请求
  2. 服务器用 cookie 响应,并将域 属性 设置为服务器的 (域=B)
  3. 客户端正在发送另一个 HXR 请求并且有 withCredentials=true
  4. cookie 已毫无问题地发回服务器

Note: the cookie sent in step #1 is not showing in document.cookies, even if it was not set as httpOnly (since it doesn't belong to the client's domain). Also attempts to get it from the xhr via looking at the "Set-Cookie" header, you'll be blocked, by design: https://fetch.spec.whatwg.org/#forbidden-response-header-name it will even won't show in Chrome dev tools under the network tab! but it will still be sent)

通信流程2(我的问题):

  1. 客户端正在向服务器发出一个简单的 GET 请求
  2. 服务器用 cookie 响应,但将域 属性 设置为客户端的 (域=A)
  3. 客户端正在发送 HXR 请求并且 withCredentials=true
  4. Cookie 没有发回,似乎也没有存储在任何地方

为什么我有点惊讶?由于 XHR 来源是 A 并且它请求将 cookie 设置为域 A 的内容(如果我查看 Postman,我清楚地看到 Set-Cookie header 与 Domain 一起发送,与请求的 Origin 相同),我有最宽松的 CORS 设置,不让我这样做的背后原因是什么? (我以为它会失败,但还是让我想知道)


问题

  1. spec/RFC 中最好的地方在哪里,它阐明了这对 XHR 也不起作用,其中 cookie Domain 等于 Origin

  2. 如果理论上浏览器 确实 允许服务器存储 cookie 当且仅当 Origin与 cookie Domain 相同,并且 CORS 来源允许该来源。

  3. 还有其他方法吗?也许它有效,但我的 POC 设置不正确?

附录:推理

我正在寻找一种使用 Cookie to header token method 之类的东西来获得跨源 CSRF 的方法,但是由于跨源问题,这似乎是不可能的。我想到的唯一解决方法是从服务器将 CSRF 令牌作为 header 发送,然后客户端可以将其保存为以后可以访问的 cookie,还有其他方法吗?这被认为是安全的吗?

资源只能为其主机的可注册域设置 cookie。如果 Facebook 使用 Google 字体,并且 Google 可以使用它来覆盖 Facebook cookie,那将是非常灾难性的。

至于在哪里定义,https://www.rfc-editor.org/rfc/rfc6265#section-5.3 的第 5 步和第 6 步处理这个问题。 (在解释响应中的 Set-Cookie header 时,Fetch 在很大程度上遵循此 RFC。)