139

我试图弄清楚“签名cookie”实际上是什么。网上没有多少,如果我试试这个:

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

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

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

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

有人知道吗?

默克。

4

4 回答 4

161

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

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

如果不匹配,则会报错。

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

编辑

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

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

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

req.signedCookies['name']
于 2012-08-10T08:40:26.493 回答
28

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

于 2012-08-10T16:24:39.513 回答
12

我一直在寻找一个很好的答案......并且查看cookie-signature用于cookie-parser签署签名cookie的源代码让我更好地理解了签名cookie是什么。

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

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

于 2014-06-11T13:08:51.003 回答
2

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

于 2019-04-14T03:28:32.820 回答