什么是 connect/expressjs 中的“签名”cookie?

What are "signed" cookies in connect/expressjs?

提问人:Merc 提问时间:8/10/2012 最后编辑:EJoshuaS - Stand with UkraineMerc 更新时间:5/4/2023 访问量:82904

问:

我试图弄清楚“签名 cookie”到底是什么。 网上没有太多东西,如果我试试这个:

app.use(express.cookieParser('A secret'));

但仍然......Cookie 在浏览器上仍然是 100% 正常的,我真的不知道这里的“签名”是什么(我有点希望在客户端上“看到”一些奇怪的东西,比如使用“A secret”作为盐加密的数据?

文档说(https://github.com/expressjs/cookie-parser):

解析 Cookie 标头,并使用由 Cookie 名称键控的对象进行填充。选择 您可以通过传递 一个字符串,它赋值 它可能被其他中间件使用。req.cookiessecretreq.secret

有人知道吗?

默克。

节点.js Express Cookie

评论

1赞 bluenote10 2/22/2021
应该注意的是,如果 cookie 值(即会话 id)的熵已经很高,并且与签名本身的熵相当(HMAC SHA256 为 256 位),则不必对 cookie 进行签名。这在这里那里都有很好的解释。

答:

178赞 staackuser2 8/10/2012 #1

Cookie 仍将可见,但它具有签名,因此它可以检测客户端是否修改了 Cookie。

它的工作原理是创建值(当前 cookie)的 HMAC,并对其进行 base64 编码。当 cookie 被读取时,它会重新计算签名并确保它与附加到它的签名匹配。

如果它不匹配,那么它将给出错误。

如果您还想隐藏 cookie 的内容,您应该对其进行加密(或将其存储在服务器端会话中)。我不确定是否已经有中间件。

编辑

要创建一个签名的 cookie,您将使用

res.cookie('name', 'value', {signed: true})

要访问已签名的 cookie,请使用以下对象:signedCookiesreq

req.signedCookies['name']

评论

1赞 Merc 8/10/2012
谢谢!但。。。我目前没有看到附加到 cookie 的签名。也就是说,在客户端中,cookie 是没有签名的。除了在其中包含秘密消息之外,我还需要做些什么来启用 cookie 签名吗?express.cookieParser()
0赞 Merc 8/10/2012
坚持。。。我正在设置cookie,但是...我怀疑这是在签字!cookieParser() 中间件已准备好解析已签名的 cookie,但我绝对没有正确设置......我必须手动签名吗...?res.cookie('somethingElseAgainAndAgain', 'signed? Maybe' );
6赞 Merc 8/10/2012
它是:。报告文档中缺少的“细节”...(res.cookie(name, value, { signed: true }))
9赞 staackuser2 7/6/2013
劫持会话是另一回事......即用户 B 冒充用户 A,签名 Cookie 只是验证 Cookie 内容是否被用户更改的一种方式,因此内容可以信任。
17赞 basarat 6/8/2014
值得一提的是,没有错误。只是未设置该键的 request.signedCookie 。所以更像是忽略了If it does not match, then it will give an error.
28赞 TJ Holowaychuk 8/11/2012 #2

是的,就像 emostar 提到的那样,它只是为了确保值没有被篡改。它被放置在不同的对象 (req.signedCookies) 中以区分两者,从而允许开发人员显示意图。如果它们与其他 cookie 一起存储在 req.cookies 中,那么有人可以简单地制作一个同名的未签名 cookie,从而破坏了它们的全部目的。

12赞 Anders Östman 6/11/2014 #3

我一直在寻找一个很好的答案...... 查看用于对签名 cookie 进行签名的源代码,让我对什么是签名 cookie 有了更好的理解。cookie-signaturecookie-parser

val当然是 cookie 的值,并且是您作为选项添加到的字符串secretcookie-parser

https://github.com/visionmedia/node-cookie-signature/blob/master/index.js#L16

评论

3赞 11/26/2014
这是一个保留的规范链接:github.com/tj/node-cookie-signature/blob/...
0赞 11/26/2014
阅读代码确实是一个更好的解释。谢谢!
3赞 Dinesh 4/14/2019 #4

我使用了 cookie-parser 1.4.4 版本。

我可以添加签名的 cookie 和在浏览器中加密的签名 cookie,如果我尝试使用 editThisCookie(chrome 插件)编辑签名的 cookie,那么 cookie 解析器会检测外部更改,然后将 false 设置为值。

response.cookie('userId',401,{signed: true})

浏览器中的响应头,显示为

Set-Cookie: empId=s%3A101.US2oSV4TSvfkvvEQ5fj1sXsjj8rNxx2ph4VdHNTuKX8; Path=/

获取签名的 Cookie

request.signedCookies

https://gist.github.com/dineshbalaji/607d166f0240f932a5cb02099b0ece4c