为服务器自己的域设置 cookie
Posted
技术标签:
【中文标题】为服务器自己的域设置 cookie【英文标题】:Setting cookie for the server's own domain 【发布时间】:2020-09-22 02:49:19 【问题描述】:我同时在客户端和服务器上工作。开发时,我的客户端在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,根据this answer,“出于安全原因,您不能使用托管在另一个域上的 servlet 或 javascript 修改一个域的 cookie”,我不想设置任何除了服务器运行的域之外的任何域的 cookie,所以我问为什么在别无选择的情况下指定任何内容?
在 Chromium devtools 中过滤“已阻止 cookie”没有显示任何内容,我将其解释为“一切正常,cookie 通过”。 我错了吗?
奇怪的是,它曾经在一两个星期前工作过,至少在 Chromium 中是这样(我非常确定这一点,因为我在导出上工作了几个小时)。现在它在我尝试过的四种浏览器中都不起作用。 有什么解释吗?
假设设置cookie时需要指定域,this comment是否正确?
无聊的细节
每个请求都以相同的方式设置 cookie 上述下载链接以外的请求均不使用cookies 显然需要 CORS 并且可以正常工作,并且每个请求都以相同的方式处理 不涉及其他服务器更新
我刚刚尝试过 cookie.setDomain("local.somedomain.com")
以及带有前导点的这个,但没有帮助。
我还尝试省略了Max-Age
(这也删除了Expires
,否则它会自动添加)但它也没有帮助(有人声称只有会话cookie在本地主机上有效)。
【问题讨论】:
afaik 如果您不需要设置域,cookie 将用于 local.somedomain.com。您在 Chrome 调试器的服务器响应中看到 cookie 是否正确,但在应用程序 -> Cookies -> local.somedomain.com 中没有?您是否有可能阻止某些内容的扩展程序? @Simon 正确,我可以在“网络”选项卡(或使用 curl)中看到上面的 cookie,但在应用程序/cookies 中缺少它。我尝试了四个浏览器,其中两个是新安装的,所以没有扩展。 当您使用--enable-file-cookies
启动 Chrome 时,您能否快速检查是否有任何变化?
所有 4 个浏览器都拒绝 cookie 的事实表明了更普遍的情况。您使用什么作为 HTTPS 的本地证书?您是否可能使用不受信任的 CA?
@Simon 我正在使用有效的 Let's Encrypt 证书,其获取方式与我们在生产中的方式相同。我虽然,为客户端使用http://localhost:3000
可能是罪魁祸首,但http://192.168.100.7:3000
也不起作用。我还尝试使用纯 HTTP 访问服务器,如 http://local.somedomain.com:10080
和 http://localhost:10080
以及其他组合,均无效。
【参考方案1】:
这种行为的可能原因(我能想到的):
-
浏览器设置拒绝所有第三方 cookie(如果 localhost 收到来自
local.somedomain.com
的 cookie,将被视为第三方)
浏览器扩展阻止了 cookie
local.somedomain.com
服务器响应不包括允许localhost
接收 cookie 所需的 CORS 标头。 (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
【讨论】:
FTR:我的解决方案是将请求标头credentials: window.location.hostname.match(/local(?:\.|host)/) ? 'include' : 'same-origin'
添加到我的 fetch 请求中,因此除非在本地提供,否则它是安全的。它有效....直到下一个有趣的变化。以上是关于为服务器自己的域设置 cookie的主要内容,如果未能解决你的问题,请参考以下文章
ProxyPassReverseCookieDomain动态变量
如何配置 .net 核心以将身份验证 cookie 发送到不同的域