为服务器自己的域设置 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:10080http://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的主要内容,如果未能解决你的问题,请参考以下文章

为与 javascript 不同的域设置 cookie

子域的域设置 cookie

ProxyPassReverseCookieDomain动态变量

如何配置 .net 核心以将身份验证 cookie 发送到不同的域

如何解决 [从未设置 cookie 的域中提供以下静态资源]

从自己的(Linux)服务器和自己的域托管 ShinyApp