我试图找出实际上是什么“签名的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的。
答案 0 :(得分:106)
Cookie仍然可见,但它有一个签名,因此可以检测客户端是否修改了cookie。
它的工作原理是创建值的HMAC(当前cookie),并对其进行base64编码。当cookie被读取时,它会重新计算签名并确保它与附加的签名相匹配。
如果不匹配,则会出错。
如果你想隐藏cookie的内容,你应该加密它(或者只是将它存储在服务器端会话中)。我不确定那里是否有中间件。
修改强>
要创建已签名的Cookie,您可以使用
res.cookie('name', 'value', {signed: true})
要访问已签名的Cookie,请使用signedCookies
的{{1}}对象:
req
答案 1 :(得分:23)
Yup就像emostar提到的那样,只是为了确保价值没有被篡改。它放在一个不同的对象(req.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