浏览器不为显式域保存 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的主要内容,如果未能解决你的问题,请参考以下文章

本地主机上具有显式域的 Cookie

本地主机上具有显式域的 Cookie

为啥带有 unsigned long long 参数的 std::bitset 构造函数未标记为显式?

请帮助将 Tsql“隐式连接”转换为显式连接

如何在 ASP.NET 响应中将 Transfer-Encoding 设置为显式或隐式分块?

jmeter ---处理Cookie与Session