使用来自子域的请求发送 cookie

Stu*_*rtM 8 javascript cookies jquery setcookie cors

我们有以下配置: testing.parentdomain.com

当您访问该域并创建一个购物篮时,我们会创建一个存储该购物篮价值的 cookie。cookie 域设置为.testing.parentdomain.com,它是 Httponly 并且有一个路径/

我们有一个想要访问 cookie 的子域。subdomain.testing.parentdomain.com
此子域调用父域上的端点,例如:testing.parentdomain.com/basketData。此调用是返回 JSON 的 GET 请求。

问题
问题是子域在发出请求时似乎没有发送 cookie 值,因此我们没有得到预期的响应。

尝试
查看其他问题,我们尝试过 CORS 和凭证更改。
作为附加说明,我们将以下 JS 与 webpack/babel 捆绑在一起。
我们的请求来自 AJAX,如下所示:

  $.ajax({
    url: url,
    type: 'GET',
    xhrFields: {
      withCredentials: true
    },
    crossDomain: true
  })
Run Code Online (Sandbox Code Playgroud)

服务器为子域和允许凭据设置了 CORS。在响应中,我们可以看到这些被返回。
access-control-allow-credentials: true
access-control-allow-origin:从上面的子域

是否有任何原因未将 cookie 与请求一起发送到父域?我们已经注销了服务器端响应中的 cookie,但它们并不像我们预期的那样存在。

请求头

:authority: testing.parentdomain.com
:method: GET
:path: /basket/data/
:scheme: https
accept: /
accept-encoding: gzip, deflate, br
accept-language: en-GB,en;q=0.9, en-US;q=0.8
来源:https ://subdomain.testing.parentdomain.com
引用:https ://subdomain.testing.parentdomain.com/
sec-fetch-dest:空
sec-fetch-mode:cors
sec- fetch-site: same-site
user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36

响应头

access-control-allow-credentials: true
Access-Control-Allow-Methods: GET, PUT, POST, DELETE, HEAD, OPTIONS
access-control-allow-origin: https://subdomain.testing.parentdomain.com
cache-control :无缓存,无存储
内容长度:2238
内容类型:应用程序/json;字符集= UTF-8
日期:星期二,2020年11月3日20点39分36秒GMT
到期:-1
杂注:无缓存
服务器:Microsoft-IIS / 10.0
的Set-Cookie:AWSALB = N0bcThdgRFzrSfQVNIsffgsvY6T / y2Bp47RZJCueeSLOS7eEjo0AThiElXmww6fy2eynRyyt8gAB8di / Mqy1x + Ds8Ig1TumKkWnQiFvIkoELI / rEYYgyUxbEtUI4; 到期日 = 2020 年 11 月 10 日星期二 20:39:36 GMT;路径=/
设置 cookie:AWSALBCORS=N0bcThdgRFzrSfQVNIsffgsvY6T/y2Bp47RZJCueeSLOS7eEjo0AThiElXmww6fy2eynRyyt8gAB8di/Mqy1x+Ds8Ig1TumKkWnQiFvExE; 到期日 = 2020 年 11 月 10 日星期二 20:39:36 GMT;路径=/;SameSite=无;安全
状态:
200strict-transport-security:max-age=31536000;
变化:Origin
x-content-type-options: nosniff
x-frame-options: SAMEORIGIN
x-robots-tag: noindex
x-ua-compatible: IE=edge
x-xss-protection: 1; 模式=块

Twi*_*her 7

即使您从子域调用主域,这也被视为跨域请求。

来自RFC 6454 的引用,它限定了“起源”术语:

问:为什么要使用完全限定的主机名而不仅仅是“顶级
”域?

A:虽然DNS有层级委托,但
主机名之间的信任关系因部署而异。例如,在许多教育机构中,学生可以在
https://example.edu/~student/ 上托管内容,但这并不意味着
学生创作的文档应该属于同一来源(即,
具有相同的保护)域)作为用于管理托管在https://grades.example.edu/ 上的成绩的 Web 应用程序。

所以你所做的所有事情确实需要让它工作:

  • access-control-allow-credentials: true
  • access-control-allow-origin: subdomain.testing.parentdomain.com (不是通配符)
  • withCredentials: true 在请求中

SameSite=None,因为从一个子域到相同域的子域的另一个的请求被认为是“同位点”(饼干属性没有在这种情况下所需的)。

所以只需检查一切是否正确设置,它应该可以正常工作。


Dan*_*cci 5

在你的问题开始时你说:

cookie 域设置为.testing.parentdomain.com

但在记录的服务器响应中:

set-cookie: AWSALBCORS=N0bcThdgRFzrSfQVNIsffgsvY6T/y2Bp47RZJCueeSLOS7eEjo0AThiElXmww6fy2eynRyyt8gAB8di/Mqy1x+Ds8Ig1TumKkWnQiFvIkoELI/rEYYgyUxbEtUI4; Expires=Tue, 10 Nov 2020 20:39:36 GMT; Path=/; SameSite=None; Secure
Run Code Online (Sandbox Code Playgroud)

Domain=.testing.parentdomain.com;参数显然丢失了。

我不知道您使用哪种编程语言来设置 cookie,但我强烈建议您检查服务器响应中用于设置 cookie 的调用。