浏览器不为显式域保存 cookie
Posted
技术标签:
【中文标题】浏览器不为显式域保存 cookie【英文标题】:Browser not saving cookie for explicit domain 【发布时间】:2018-12-29 22:14:13 【问题描述】:在服务器上我使用 express.js,在浏览器中我使用 fetch API。我使用默认域发送 cookie,浏览器将其正确设置并与后续请求一起发送。但是当我将域设置为父域时,cookie 没有设置。我的理解是it should。
假设我的代码从“my.example.com”端口 8080 提供服务。那么我的服务器代码将如下所示:
response.cookie("token",token,
encode:String,
domain:".example.com",
expires: new Date(Date.now()+86400000000),
secure:false
)
在客户端我的代码如下所示:
fetch("/login",
credentials: "include", // also tried "same-origin"
mode:"cors", // also tried omitting
headers:new Headers(
// authentication data is here
)
)
起初我以为它是父域,但如果我使用 any 域,cookie 似乎没有被保存。
所以以下内容都不会保存在客户端上:
domain:".example.com",
domain:".example.com:8080",
domain:"my.example.com",
domain:"my.example.com:8080",
但如果我省略“域”,那么它确实会被保存。
需要明确的是,当我在 Chrome 开发者工具中查看回复时,我看到 cookie 已收到 - 只是由于某种原因没有保存。
我需要能够为来自任何其他子域的任何子域设置此 cookie。根据我的阅读,a.example.com 应该没有问题将 cookie 设置为 .example.com 以便 b.example.com 可以使用它。
更新:我也尝试使用 XMLHttpRequest,并得到相同的行为!
更新 2:我也无法直接从带有父域的 javascript 设置 cookie,例如这行得通:
document.cookie=("token=<...>; Domain=my.example.com; Path=/")
但这确实不是:
document.cookie=("token=<...>; Domain=.example.com; Path=/")
从我所阅读的所有内容来看,这行应该有效,但它对我不起作用。我认为这里应该没有问题是正确的吗?如果是这样,我该如何解决为什么无法设置 cookie?我已经尝试过的事情:
my.example.com 指向 127.0.0.1。使它指向另一个非本地主机地址,没有解决问题。
my.example.com 实际上不是 .com 地址,也不是其他 5 个仅允许使用一个点的硬编码地址之一。使其指向 .com 地址,但未解决问题。
可能出于测试目的从控制台设置 cookie 不起作用。直接从服务器加载的 javascript 代码尝试了我的所有更改,但没有解决问题。
也许标题的顺序很重要。将路径移到域前
也许大小写很重要。将“路径”和“域”更改为全部小写。没有解决问题。
也许“路径”不需要在那里。删除它并不能解决问题。
删除了 cookie 元素之间的空格。没有效果。
也许有一个奇怪的字符混淆了需要编码的东西。选中,令牌中只有字母数字键。 Cookie 的长度总共只有 100 字节左右,远低于最大值,因为只有一个 cookie。
也许我的域名有些奇怪,浏览器不喜欢上述内容。于是我去了 www.example.com,打开控制台输入:
document.cookie="token=1; domain=.example.com; path=/"
它成功了!。但是,我对我的 .com 地址和 example.com 之间可能存在的差异感到困惑!我的域不是 www.myhostname.com 的形式,但我看不到任何说子域必须是“www”的内容。浏览器中是否有可能将某些域列入黑名单或以其他方式处理某些域? (它来自一个动态 DNS 托管站点,虽然我看不出这会产生什么影响,因为 IP 地址实际上永远不会改变并且具有很长的 TTL。)
-
我的服务器在端口 8080 上运行,而不是在端口 80 上运行。我将它切换为只运行端口 80,看看这是否会有所不同。它没有。
【问题讨论】:
【参考方案1】:哎哟。我浪费了很多时间来解决这个问题,结果发现浏览器是actively blocking me,因为我的子域在public suffix black hole list中。
【讨论】:
以上是关于浏览器不为显式域保存 cookie的主要内容,如果未能解决你的问题,请参考以下文章
为啥带有 unsigned long long 参数的 std::bitset 构造函数未标记为显式?