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

时间:2012-08-10 08:28:07

标签: node.js cookies express connect

我试图找出实际上是什么“签名的cookie”。 网上没什么,如果我试试这个:

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

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

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

  

解析 Cookie 标头并填充req.cookies      使用由cookie名称键入的对象。可选      您可以通过传递启用签名的cookie支持      一个secret字符串,用于指定req.secret      它可能被其他中间件使用。

有人知道吗?

Merc的。

4 个答案:

答案 0 :(得分:106)

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

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

如果不匹配,则会出错。

如果你想隐藏cookie的内容,你应该加密它(或者只是将它存储在服务器端会话中)。我不确定那里是否有中间件。

修改

要创建已签名的Cookie,您可以使用

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

要访问已签名的Cookie,请使用signedCookies的{​​{1}}对象:

req

答案 1 :(得分:23)

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

答案 2 :(得分: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 :(得分:0)

我使用过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