为服务器自己的域设置 cookie
Setting cookie for the server's own domain
我在客户端和服务器端工作。开发时,我的客户端在 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 才能下载 link 看起来像
https://local.somedomain.com/api/v2/ExportSomething.xlsx
然而,它不存在。由于服务器未指定域,因此它可能有意义。 OTOH,根据 this answer、"You can't modify the cookies of one domain using a servlet or JavaScript hosted on another domain, for security reasons",我 不想 为服务器运行的域之外的任何域设置任何 cookie,所以我'我问 为什么在别无选择的情况下指定任何内容?
在 Chromium devtools 中过滤 "Has blocked cookies" 没有显示任何内容,我将其解释为 "everything is fine, cookies came through"。 我错了吗?
奇怪的是它曾经在一两周前工作,至少在 Chromium 中是这样(我非常确定这一点,因为我在导出上工作了几个小时)。现在它可以在我尝试过的四种浏览器中的 none 中使用。 有什么解释吗?
假设设置cookie时需要指定域,this comment是否正确?
无聊的细节
- 每个请求都以相同的方式设置 cookie
- 除上述下载外没有请求link使用cookie
- CORS 显然是必需的并且有效,每个请求都以相同的方式处理
- 没有涉及其他服务器
更新
我刚试过 cookie.setDomain("local.somedomain.com")
,还有一个前导点,但没有帮助。
我也试过省略 Max-Age
(这也删除了 Expires
,否则会自动添加),但它也没有帮助(有人声称只有会话 cookie 在本地主机上工作)。
这种行为的可能原因(我能想到的):
- 浏览器设置拒绝所有 third-party cookie(如果 localhost 从
local.somedomain.com
收到 cookie,将被视为 third-party)
- 浏览器扩展正在阻止 cookie
local.somedomain.com
服务器响应不包含允许 localhost
接收 cookie 所需的 CORS headers。 (Access-Control-Allow-Origin 必须存在且不设置为“*”,Access-Control-Allow-Credentials 必须存在且 'true')
- Google在逗你
最后一点实际上不是开玩笑,很可能是这里的原因。 Google 一直在调整 Chromium 中 cookie 的 "SameSite" 规则,记录在此处:https://www.chromium.org/updates/same-site
关于 SO 的一个相关案例:Confusion regarding SameSite changes with Chrome
我在客户端和服务器端工作。开发时,我的客户端在 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 才能下载 link 看起来像
https://local.somedomain.com/api/v2/ExportSomething.xlsx
然而,它不存在。由于服务器未指定域,因此它可能有意义。 OTOH,根据 this answer、"You can't modify the cookies of one domain using a servlet or JavaScript hosted on another domain, for security reasons",我 不想 为服务器运行的域之外的任何域设置任何 cookie,所以我'我问 为什么在别无选择的情况下指定任何内容?
在 Chromium devtools 中过滤 "Has blocked cookies" 没有显示任何内容,我将其解释为 "everything is fine, cookies came through"。 我错了吗?
奇怪的是它曾经在一两周前工作,至少在 Chromium 中是这样(我非常确定这一点,因为我在导出上工作了几个小时)。现在它可以在我尝试过的四种浏览器中的 none 中使用。 有什么解释吗?
假设设置cookie时需要指定域,this comment是否正确?
无聊的细节
- 每个请求都以相同的方式设置 cookie
- 除上述下载外没有请求link使用cookie
- CORS 显然是必需的并且有效,每个请求都以相同的方式处理
- 没有涉及其他服务器
更新
我刚试过 cookie.setDomain("local.somedomain.com")
,还有一个前导点,但没有帮助。
我也试过省略 Max-Age
(这也删除了 Expires
,否则会自动添加),但它也没有帮助(有人声称只有会话 cookie 在本地主机上工作)。
这种行为的可能原因(我能想到的):
- 浏览器设置拒绝所有 third-party cookie(如果 localhost 从
local.somedomain.com
收到 cookie,将被视为 third-party) - 浏览器扩展正在阻止 cookie
local.somedomain.com
服务器响应不包含允许localhost
接收 cookie 所需的 CORS headers。 (Access-Control-Allow-Origin 必须存在且不设置为“*”,Access-Control-Allow-Credentials 必须存在且 'true')- Google在逗你
最后一点实际上不是开玩笑,很可能是这里的原因。 Google 一直在调整 Chromium 中 cookie 的 "SameSite" 规则,记录在此处:https://www.chromium.org/updates/same-site
关于 SO 的一个相关案例:Confusion regarding SameSite changes with Chrome