在 Express 中设置客户端可访问的 Cookie

Posted

技术标签:

【中文标题】在 Express 中设置客户端可访问的 Cookie【英文标题】:Set Client-Side Accessible Cookie In Express 【发布时间】:2012-06-13 13:35:22 【问题描述】:

我正在开发一个使用 Express 和 SocketIO 的 Node 应用程序。我想在我的 Express 控制器中设置一个 cookie,然后可以从我的客户端 javascript 代码访问它。我尝试的一切似乎都不起作用:

res.setHeader('Set-Cookie','test=value');
res.cookie('rememberme', 'yes',  maxAge: 900000 );

这里有什么我遗漏的吗?提前致谢!

【问题讨论】:

可能有助于显示客户端代码。 我只是进入 Chrome 检查器并查看 cookie。不过什么都没看到…… 【参考方案1】:

想通了!默认情况下,Express 将选项 httpOnly 设置为 true。这意味着客户端 Javascript 无法访问您的 cookie。为了正确设置客户端可访问的 cookie,只需使用如下所示的 sn-p:

res.cookie('rememberme', 'yes',  maxAge: 900000, httpOnly: false);

我还注意到,如果您调用此命令然后调用 res.redirect,则不会设置 cookie。该命令需要在某些时候跟随 res.render 才能工作。不知道为什么会这样。

【讨论】:

这是一个很好的信息。您是否知道如何在 express 框架中访问服务器端的客户端 cookie? @user644745 您可以通过查看 res.cookies 对象来读取 Express 中的 cookie。例如,名为session_id 的cookie 将存在于res.cookies.session_id。 expressjs.com/api.html#req.cookies 之所以需要调用 res.render 或 res.send 是因为设置cookie不会发起响应。发送和渲染。这个 cookie 方法只是给响应对象添加了一个 cookie。 请注意,将会话 cookie 的 httpOnly 标志设置为 false 是危险的。当设置为 false 时,入侵网站的恶意行为者(例如,通过简单的 XSS 脚本注入攻击)将能够读取和复制该会话,并使用它从另一台计算机以目标用户身份登录。确保只将该标志与不包含任何敏感数据的 cookie 一起使用。 @frontendbeauty 你的意思是req.cookies 不是res.cookies【参考方案2】:

实际上,我在几个小时内都遇到了同样的问题。

这是我的代码:

res.cookie("mycookie", "1234567890",  secure:true, maxAge:120000, httpOnly: true );

我可以在响应标头中看到 Set-Cookie 指令,但在 Chrome 中我找不到 cookie,并且我无法通过 req.cookies['mycookie'] 找到 cookie。

这个问题的根本原因是我没有使用HTTPS连接。 (Express 4.x with cookie-parser 中间件)

根据本文档:Simple Steps to Secure Your Express Node App

如果我设置选项 secure=true,那么浏览器将不会在任何 HTTP 请求中发送我的 cookie,而是在 HTTPS 安全连接中发送。然后在我删除了 secure:true 选项后,我得到了我的 cookie 工作。

【讨论】:

【参考方案3】:

所以我们可以使用http访问:

res.cookie("mycookie", "1234567890",  secure:false, maxAge:120000, httpOnly: true );?

【讨论】:

以上是关于在 Express 中设置客户端可访问的 Cookie的主要内容,如果未能解决你的问题,请参考以下文章

访问前端代码中express.js中设置的标头

在 Express 中设置默认响应标头

无法使用 NodeJS 中的 request 和 express 模块在浏览器中设置 cookie

如何使用 express 框架在节点 js 中设置 cookie?

如何在 express 中设置单个会话 maxAge?

如何在资产目录中设置可访问性标签? Xcode 11