connect / express.js中的“签名” cookie是什么?


114

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

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

但仍然... Cookies在浏览器上仍然100%正常,而且我真的不知道这里的“签名”(我有点希望“看到”客户端上的一些奇怪之处,例如使用加密的数据作为盐的“秘密”?)

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

解析Cookie标头,并填充req.cookies 以Cookie名称为键的对象。(可选)您可以通过传递一个secret字符串来启用签名cookie支持,该字符串会分配给req.secret它,以便其他中间件可以使用它。

有人知道吗

Merc。

Answers:


135

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

它通过创建具有值(当前cookie)的HMAC并通过base64对其进行编码来工作。当读取cookie时,它将重新计算签名,并确保它与附加的签名匹配。

如果不匹配,则将给出错误。

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

编辑

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

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

要访问已签名的cookie,请使用的signedCookies对象req

req.signedCookies['name']

谢谢!但是...目前我看不到签名附加到cookie。也就是说,在客户端中,cookie在那里没有签名。除了在其中包含秘密消息之外,我还需要做些其他事情来启用Cookie签名express.cookieParser()吗?
Merc

等等...我正在设置cookie,res.cookie('somethingElseAgainAndAgain', 'signed? Maybe' );但是...我怀疑是在签名!cookieParser()中间件已准备就绪,可以分析已签名的cookie,但是我绝对没有正确地进行设置...我是否必须手动对其进行签名...?
Merc

6
是:(res.cookie(name, value, { signed: true }))。从文档中报告缺少的“详细信息” ...
Merc 2012年

6
劫持一个会话是不同的……用户B以用户A的身份进行签名。签名的cookie只是一种验证cookie内容未被用户更改的方法,因此内容可以被信任。
staackuser2 2013年

9
值得一提的If it does not match, then it will give an error.不是错误。只是未设置该键的request.signedCookie 。因此更像是被忽略了
-basarat

25

像emostar一样的Yup提到,这只是确保未篡改某个值。它放置在另一个对象(req.signedCookies)中以区分两者,从而使开发人员能够显示意图。如果将它们与其他cookie一起存储在req.cookie中,则有人可以简单地制作一个未签名的同名cookie,从而破坏了它们的全部目的。


11

我一直在广泛地寻找这个问题的好答案...并查看cookie-signature用来cookie-parser签名的cookie 的源代码,使我对签名的cookie有了更好的了解。

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

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


3
这里有一个保存规范链接:github.com/tj/node-cookie-signature/blob/...

阅读代码确实是一个更好的解释。谢谢!

0

我使用cookie-parser 1.4.4版本。

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

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

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

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

获取签名的cookie

request.signedCookies

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.