Nodejs环境下localhost无法设置cookie

Nodejs环境下localhost无法设置cookie

使用自己写的proxyserver时候遇到的问题,很基础,记一笔。

res.cookie('rememberme', 'yes', {domain:"localhost"});

其实就是response里有

Set-Cookie:rememberme=yes; Domain=localhost; Path=/; HttpOnly 这么个头的时候,由于localhost不是有效域名,会被chrome和ie无视掉。 解决办法是把domain去掉,或者本地配置一个域名。

置于为什么chrome和ie会有这样的行为还请高人指点 =人=。


4 回复

Node.js 环境下 localhost 无法设置 Cookie

在使用 Node.js 编写代理服务器时,可能会遇到一个问题,就是在 localhost 上设置 Cookie 时,浏览器(如 Chrome 和 IE)会忽略这些 Cookie。这是因为 localhost 不是一个有效的域名。

问题描述

当你尝试在 localhost 上设置 Cookie 时,比如这样:

res.cookie('rememberme', 'yes', { domain: "localhost" });

浏览器会在响应头中看到类似以下的 Set-Cookie 字段:

Set-Cookie: rememberme=yes; Domain=localhost; Path=/; HttpOnly

但是由于 localhost 并不是一个有效的域名,浏览器会忽略这些 Cookie。

解决方案

  1. 移除 domain 属性: 如果不需要跨子域共享 Cookie,可以简单地移除 domain 属性。这样 Cookie 将只在当前域(即 localhost)下生效。

    res.cookie('rememberme', 'yes');
    
  2. 使用本地域名: 可以在本地配置一个域名,例如 local.example.com。这样你可以在设置 Cookie 时指定这个域名,而不是 localhost

    首先,编辑你的本地 hosts 文件,添加以下条目:

    127.0.0.1 local.example.com
    

    然后在 Node.js 代码中设置 Cookie:

    res.cookie('rememberme', 'yes', { domain: "local.example.com", path: "/", httpOnly: true });
    

为什么浏览器会忽略 localhost 域名下的 Cookie?

浏览器之所以会忽略 localhost 域名下的 Cookie,是因为 localhost 通常用于开发环境,而大多数现代浏览器出于安全考虑,不建议在 localhost 上使用跨域 Cookie。这样做可以防止开发者无意中在生产环境中泄露敏感信息。

示例代码

以下是一个完整的示例代码,展示了如何在 Node.js 中设置 Cookie:

const express = require('express');
const app = express();

app.get('/set-cookie', (req, res) => {
    // 移除 domain 属性
    res.cookie('rememberme', 'yes');

    // 或者使用本地域名
    // res.cookie('rememberme', 'yes', { domain: "local.example.com", path: "/", httpOnly: true });

    res.send('Cookie has been set.');
});

app.listen(3000, () => {
    console.log('Server is running on port 3000');
});

在这个示例中,当访问 /set-cookie 路径时,服务器将设置一个名为 rememberme 的 Cookie,并将其发送给客户端。如果你希望在本地域名上测试,记得修改 hosts 文件并相应地调整代码中的域名设置。


实验发现localhost的时候有expires也会失效。结论是本地调试还是加个host靠谱

实验又发现,貌似是被Edit This Cookie坑了,点下flag and delete all清除之后,同名的cookie就再也加不上去了。把插件disable掉之后没有问题。

在Node.js环境中,如果你尝试通过localhost来设置Cookie,可能会遇到问题,因为现代浏览器(如Chrome和IE)不接受以localhost作为域名的Cookie。为了解决这个问题,你可以选择以下两种方法之一:

  1. 移除domain选项: 如果你不指定domain,那么Cookie将默认在当前域名下工作。对于localhost来说,这意味着它将在所有localhost相关的地址上生效。

    示例代码:

    res.cookie('rememberme', 'yes');
    
  2. 配置本地域名: 你可以在你的hosts文件中配置一个自定义的本地域名,并在设置Cookie时使用这个自定义域名。

    假设你在hosts文件中添加了以下条目:

    127.0.0.1   mylocaldomain.com
    

    那么你可以在设置Cookie时使用这个域名:

    res.cookie('rememberme', 'yes', { domain: 'mylocaldomain.com' });
    

    确保在浏览器中访问http://mylocaldomain.com而不是http://localhost

解释

浏览器对Cookie的行为是基于安全性的考虑。localhost不是一个有效的域名,因此浏览器会忽略带有localhost域的Cookie。通过移除domain选项或配置本地域名,可以避免这个问题。

回到顶部