2012-08-10 50 views
73

我想弄清楚“签名饼干”实际上是什么。 没有多少上了网,如果我试试这个:connect/expressjs中的“签名”cookie是什么?

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

但仍...饼干仍然在浏览器上100%正常的,我真的不知道什么是“签名”是这里(?我是那种希望能“看到”一些古怪的客户端上,像使用“秘密”盐加密的数据)

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

解析Cookie标题和填充req.cookies 与由cookie名称键入的对象。可选 您可以启用通过传递 一个secret字符串,它赋予req.secret所以 也可以通过其他中间件被用来签署cookie支持。

有谁知道?

Merc。

回答

79

cookie将仍然是可见的,但它有一个签名,因此它可以检测,如果客户端修改该Cookie。

它通过创建值(电流的cookie)的HMAC,并且base64编码它。当cookie被读取时,它会重新计算签名并确保它与附加的签名匹配。

如果不匹配,则会报错。

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

编辑

而要创建签名的cookie,你会用

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

并访问一个签名的cookie使用的reqsignedCookies对象:

req.signedCookies['name'] 
+0

谢谢串!但是......我目前没有看到附加到cookie上的签名。也就是说,在客户端,cookie在那里没有签名。除了在'express.cookieParser()'中包含秘密消息之外,我还需要做些什么来启用cookie签名? – Merc 2012-08-10 08:42:36

+0

挂上......我正在用'res.cookie('somethingElseAgainAndAgain','signed?Maybe')设置cookie,“但是......我怀疑这是签名! cookieParser()中间件已经准备好解析已签名的cookie,但我绝对没有做正确的设置......我必须手动签名......? – Merc 2012-08-10 08:50:32

+0

这将是所有需要的,也许你的cookie是来自你添加秘密之前?尝试删除cookie以查看是否将其启动。 – staackuser2 2012-08-10 08:51:11

16

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

8

我一直在寻找一个好的答案,这个... 相当广泛,望着cookie-signature的源代码,所使用的cookie-parser签署签署饼干给了我更好地了解什么是签饼干是。

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

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

+2

这里是一个保存的规范链接:https://github.com/tj/node-cookie-signature/blob/60f3be29232145e445aada51d520d370b0a52161/index.js#L16 – 2014-11-25 18:55:20

+0

阅读代码确实是一个更好的解释。谢谢! – 2014-11-25 18:56:24