首页 > 解决方案 > 为服务器自己的域设置 cookie

问题描述

我在客户端和服务器上工作。开发时,我的客户端在运行,http://localhost:3000/而我的服务器运行在https://local.somedomain.com. 服务器发送一个像

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”没有显示任何内容,我将其解释为“一切正常,cookies 通过”。我错了吗?

奇怪的是它曾经在一两个星期前工作过,至少在 Chromium 中(我非常确定这一点,因为我在导出上工作了几个小时)。现在它在我尝试过的四种浏览器中都不起作用。有什么解释吗?

假设在设置 cookie 时需要指定域,这个注释是否正确?

无聊的细节

更新

我刚刚尝试过cookie.setDomain("local.somedomain.com"),这也是一个前导点,但没有帮助。

我还尝试省略Max-Age(它也删除Expires了自动添加的),但它也没有帮助(有人声称只有会话 cookie 在 localhost 上有效)。

标签: javaservletscookiescors

解决方案


这种行为的可能原因(我能想到的):

  1. 浏览器设置拒绝所有第三方 cookie(如果 localhost 从 接收 cookie local.somedomain.com,则将被视为第三方)
  2. 浏览器扩展阻止了 cookie
  3. local.somedomain.com服务器响应不包括允许localhost接收 cookie所需的CORS 标头。(Access-Control-Allow-Origin 必须存在且未设置为“*”,Access-Control-Allow-Credentials 必须存在且“true”)
  4. 谷歌在惹你生气

最后一点实际上不是开玩笑,而且很可能是这里的原因。谷歌一直在调整 Chromium 中 cookie 的“SameSite”规则,记录在这里:https ://www.chromium.org/updates/same-site

关于 SO 的一个相关案例:Confusion about SameSite changes with Chrome


推荐阅读