cookie 域上的点前缀阻止 CORS 请求

Posted

技术标签:

【中文标题】cookie 域上的点前缀阻止 CORS 请求【英文标题】:Dot prefix on cookie domain preventing CORS request 【发布时间】:2018-05-28 23:52:29 【问题描述】:

当我在身份验证后从服务器发送响应时,我正在使用此标头在客户端浏览器中设置身份验证令牌 cookie:

Set-Cookie:mysite_auth=encodedJwtHere.JustPretend; SameSite=lax; domain=subdomain.mydomain.com; HTTPOnly; Max-Age=600; Secure; path=/

但是,当我在 Chrome 中打开 EditThisCookie 时,我可以看到域被自动设置为 .subdomain.mydomain.com

根据我的理解,这应该不是问题。当我在浏览器中请求 https://subdomain.mydomain.com 时,正在发送 cookie。

当我尝试发出 CORS 请求时,我的问题发生了。我正在开发一个 javascript 应用程序并在 localhost 上提供它。当我对https://subdomain.mydomain.com 进行 AJAX 调用时,cookie 没有发送。

我在响应中设置了所有正确的标头:

Access-Control-Allow-Credentials:true Access-Control-Allow-Headers:Content-Type, * Access-Control-Allow-Origin:*

我的请求中有 withCredentials:true 配置。

如果我在浏览器中打开 https://subdomain.mydomain.com,然后使用 EditThisCookie,我会删除前缀点,即 I.E。我将.subdomain.mydomain.com 更改为subdomain.mydomain.com,突然我的来自本地主机的AJAX 调用工作了。 cookie 随请求一起发送。

所以我的问题是,首先,为什么在有前缀点的情况下不发送 cookie,有没有办法解决这个问题,而无需每次刷新我的 cookie 时手动编辑域?

【问题讨论】:

其实点似乎与它无关。如果我打开 EditThisCookie 并简单地单击保存按钮,那么 cookie 会在所有后续请求中发送。在我手动更新 cookie 之前,有一些东西阻止 cookie 在 CORS 请求中发送。 【参考方案1】:

如果您要发送凭据,则无法回复 Access-Control-Allow-Origin:* - 您必须回复与 Origin 请求标头完全一致的值,例如Access-Control-Allow-Origin: value-of-Origin-Header.

在您的情况下,大概是Access-Control-Allow-Origin: https://subdomain.mydomain.com。不过最好不要对其进行硬编码 - 只需镜像 Origin 值即可。

【讨论】:

以上是关于cookie 域上的点前缀阻止 CORS 请求的主要内容,如果未能解决你的问题,请参考以下文章

即使存在标头,CORS 也会失败

即使存在标头,CORS 也会失败

CORS 政策已被阻止我的子域

在不安全的域上允许 cookie

我的请求是跨源请求吗?(heroku 上的 Django rest api,CORS 没有阻止我的请求)

Spring boot + spring security - 如何阻止应用层上的CORS请求?