nodejs中的会话机密是否与签名cookie相同?

时间:2018-02-24 23:13:11

标签: node.js express cookies

在表达你设置的会话有点像这样:

app.use(express.session({
  store: store({...}),
  secret: 'topsecret'
}));

在阅读secret的内容时, 我得到了这个:protects against session hijacking by checking the fingerprint

听起来非常像签名的Cookie:ensure that a value has not been tampered with. It's placed in a different object (req.signedCookies) to differentiate between the two

两者之间有区别吗?

我理解签名的cookie,使用cookie值+ secret创建hash并沿cookie中的值保存。通过这种方式,您可以了解Cookie值是否已被篡改。

1 个答案:

答案 0 :(得分:1)

你是对的,秘密用于签署cookie,使其无法被篡改。您可以查看关于快速会话序列化cookie的source code

function setcookie(res, name, val, secret, options) {
  var signed = 's:' + signature.sign(val, secret);
  var data = cookie.serialize(name, signed, options);

  debug('set-cookie %s', data);

  var prev = res.getHeader('set-cookie') || [];
  var header = Array.isArray(prev) ? prev.concat(data) : [prev, data];

  res.setHeader('set-cookie', header)
}

基本上是使用SHA-256对其进行签名,生成32字节的哈希值。

还有unsigncookie验证您的Cookie未被篡改。显然,它验证了上面用于签名的相同秘密:

function unsigncookie(val, secrets) {
  for (var i = 0; i < secrets.length; i++) {
    var result = signature.unsign(val, secrets[i]);

    if (result !== false) {
      return result;
    }
  }

  return false;
}