我在客户端和服务器上工作。开发时,我的客户端在http://localhost:3000/
上运行,而我的服务器在https://local.somedomain.com
上运行。服务器发送一个类似 cookie
set-cookie: a=aB5Th....;Path=/;Expires=Sun, 02-Aug-2020 11:26:36 GMT;Max-Age=5184000
下载链接需要此 cookie
,如下所示https://local.somedomain.com/api/v2/ExportSomething.xlsx
但是,它不存在。由于服务器未指定域,因此可能有意义。OTOH,根据这个答案,"出于安全原因,你不能使用托管在另一个域上的 servlet 或 JavaScript 修改一个域的 cookie",并且我不想为任何域设置任何 cookie,除了运行服务器的域,所以我问为什么在别无选择的情况下指定任何东西?
在 Chromium devtools 中过滤"已阻止 cookie"什么也没显示,我会将其解释为"一切都很好,cookie 通过了"。我错了吗?
奇怪的是,它曾经在一两周前工作过,至少在 Chromium 中是这样(我非常确定这一点,因为我在出口上工作了几个小时(。现在它不适用于我尝试过的四种浏览器。有什么解释吗?
假设在设置 cookie 时有必要指定域,此注释是否正确?
无聊的细节
- 每个请求都以相同的方式设置 Cookie
- 上述下载链接旁边的任何请求都没有使用 cookie
- CORS显然是需要的并且有效,每个请求都以相同的方式处理
- 不涉及其他服务器
更新
我刚刚尝试了cookie.setDomain("local.somedomain.com")
,也用一个前导点尝试了这个,但它没有帮助。
我还尝试省略Max-Age
(这也删除了自动添加的Expires
(,但它也没有帮助(有人声称只有会话 cookie 才能在本地主机上工作(。
这种行为的可能原因(我能想到(:
- 浏览器设置拒绝所有第三方 cookie(如果本地主机收到来自
local.somedomain.com
的 cookie,这将被视为第三方( - 浏览器扩展程序阻止了 Cookie
local.somedomain.com
服务器响应不包括允许localhost
接收 Cookie 所需的 CORS 标头。(访问控制允许源必须存在且未设置为"*",访问控制允许凭据必须存在且为"true"(- 谷歌在惹你
最后一点实际上不是开玩笑,很可能是这里的原因。Google一直在调整Chromium中cookie的"SameSite"规则,记录如下:https://www.chromium.org/updates/same-site
关于SO的相关案例:关于Chrome的SameSite更改的混淆