从子域发送带有请求的Cookie

时间:2020-10-06 11:37:49

标签: jquery cookies cors setcookie

我们有以下配置: 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
  })

服务器已为子域和allow-crendtials设置了CORS。在响应中,我们可以看到这些已返回。
access-control-allow-credentials:true
access-control-allow-origin:上方的子域

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

请求标头

:权威:testing.parentdomain.com
:method:GET
:path:/ basket / data /
:方案:https
接受: /
accept-encoding:gzip,deflate,br
接受语言: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:相同站点
用户代理:Mozilla / 5.0(Macintosh; Intel Mac OS X 10_15_7)AppleWebKit / 537.36(KHTML,例如Gecko)Chrome / 86.0.4240.111 Safari / 537.36

响应标题

access-control-allow-credentials:true
访问控制允许方法:GET,PUT,POST,DELETE,HEAD,OPTIONS
access-control-allow-origin:https://subdomain.testing.parentdomain.com
缓存控制:无缓存,无存储
内容长度:2238
内容类型:application / json; charset = utf-8
日期:星期二,2020年11月3日20:39:36 GMT
到期:-1
语法:无缓存
伺服器:Microsoft-IIS / 10.0
set-cookie:AWSALB = N0bcThdgRFzrSfQVNIsffgsvY6T / y2Bp47RZJCueeSLOS7eEjo0AThiElXmww6fy2eynRyyt8gAB8di / Mqy1x + Ds8Ig1TumKkWnQiFyIELIy Expires = Tue,10 Nov 2020 20:39:36 GMT;路径= /
set-cookie:AWSALBCORS = N0bcThdgRFzrSfQVNIsffgsvY6T / y2Bp47RZJCueeSLOS7eEjo0AThiElXmww6fy2eynRyyt8gAB8di / Mqy1x + Ds8Ig1TumKkWNQiFYELY Expires = Tue,10 Nov 2020 20:39:36 GMT;路径= /; SameSite = None;安全
状态:200
严格运输安全性:max-age = 31536000;
不同:来源
x-content-type-options:nosniff
x-frame-options:SAMEORIGIN
x-robots-tag:noindex
x-ua兼容:IE = edge
x-xss-保护:1;模式=阻止

2 个答案:

答案 0 :(得分:2)

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

引用RFC 6454的行文,该行文限定“来源”一词:

问:为什么要使用标准主机名而不是仅使用“ top-
级”域?

A:尽管DNS具有分层委派,但信任
主机名之间的关系因部署而异。例如,在 许多教育机构,学生可以在以下位置托管内容
https://example.edu/~student/,但这并不意味着文档
由学生创作的作品应属于同一血统(即
驻留在与用于保护的Web应用程序相同的保护域中 成绩由https://grades.example.edu/托管。

因此,确实需要您所做的所有事情才能使其正常工作:

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

在声明Cookie时,您只缺少两件事:SecureSameSite=None

对于跨站点请求,必须要求SameSite=None属性,除非也设置了Secure,否则该属性将不起作用。

显然,Secure属性意味着testing.parentdomain.com是通过HTTPS提供的。

答案 1 :(得分:2)

在您开始提问时,您说过:

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

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

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