在 connect/Expressjs 中,什么是“已签名”cookie?

我在想“签名饼干”到底是什么。 网上的东西不多,如果我试试这个:

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

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

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

解析 饼干标头并填充 req.cookies 使用由 cookie 名称键入的对象。可选 您可以通过传递 一个 secret字符串,它将 req.secret赋值为 它可能被其他中间件使用。

有人知道吗?

默克。

74578 次浏览

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

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

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

如果您也想隐藏 cookie 的内容,那么应该对它进行加密(或者只是将它存储在服务器端会话中)。我不确定是否已经有中间件来处理这个问题。

剪辑

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

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

要访问签名 cookie,请使用 reqsignedCookies对象:

req.signedCookies['name']

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

我一直在寻找这个问题的答案。 看看 cookie-signature的源代码,它被 cookie-parser用来签署签名 cookie,这让我更好地理解了什么是签名 cookie。

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

Https://github.com/visionmedia/node-cookie-signature/blob/master/index.js#l16

我使用的是 cookie 解析器1.4.4版本。

我可以添加签名 Cookie 和签名 Cookie 在浏览器中加密,如果我尝试编辑签名 Cookie 使用 edit ThisCookie (chrome 插件) ,然后 Cookie 解析器检测外部变化,然后设置为值 false。

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

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

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

签名饼干

request.signedCookies

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