nodejs中的签名cookie和未签名cookie的确切区别是什么?

时间:2019-02-03 15:33:46

标签: node.js cookies

大家好,我是Nodejs的初学者。我已经尝试过Express中的 cookie-parser 模块。他们正在使用{signed:true}设置签名的cookie。

首先请澄清一下。

1。为什么我应该使用签名的Cookie ?和

2. 已签名Cookie的使用是什么?。

我已经检查了解决方案,但是没有人说它有什么用?。

我已经在程序中分别尝试了这两种情况,并且在没有使用密钥和签名cookie的情况下也没有得到任何错误:

任何帮助将不胜感激谢谢...

节点代码:

  1. 使用带有密钥的签名Cookie

app.use(cookieparser("Youcansetanydataasasecret"));
const options={
    maxAge:1000*60*5,
    httpOnly:true,
    signed:true
};
app.get('/setcookie',(req,res)=>{
    res.cookie('cookieone','This is my first cookie',options);
    res.send(`Cookie has been set...`);
});
app.get('/readcookie',(req,res)=>{
    console.log(req.signedCookies['cookieone']);
    res.send(req.signedCookies['cookieone']);
});

  1. 不使用签名的cookie和秘密。

app.use(cookieparser());
const options={
    maxAge:1000*60*5,
    httpOnly:true,
};
app.get('/setcookie',(req,res)=>{
    res.cookie('cookietwo','cookie may different',options);
    res.send(`Cookie has been set...`);
});
app.get('/readcookie',(req,res)=>{
    console.log(req.cookies)
    res.send(req.cookies.cookietwo);
});

1 个答案:

答案 0 :(得分:1)

在服务器向客户端发送cookie之后,客户端可能会修改cookie,然后在将来的请求中将其发送回服务器。有时这是无害的,有时它是应用程序所必需的,但是有时由客户端发送的cookie与其原始服务器定义的值保持不变是很重要的。 (想象一下,其中包含用户名,银行帐号,货币金额或游戏得分的cookie。篡改这些cookie可能会破坏服务器安全性或允许某种盗窃或欺诈行为。)

如果服务器需要能够检测到客户端未更改cookie,则服务器可以将签名包括在cookie中,以及需要保护的实际cookie数据。签名是从cookie数据和仅服务器知道的秘密中派生的。这个秘密使修改数据的客户端很难产生正确的签名来处理修改后的数据。 Cookie解析器模块将具有这种签名的Cookie称为签名的Cookie

将签名的cookie发送回服务器时,服务器可以验证签名和cookie中的数据是否相互匹配。如果它们匹配,则服务器可以确信数据是真实的。如果它们不匹配,则服务器知道该cookie已被客户端修改,服务器可以拒绝该请求。

因此,如果要确保客户端未修改cookie中返回的数据,则可以使用签名的cookie。如果Cookie中的数据不是很有价值,并且您不在乎客户端是否修改了该数据,或者您是否已安排使用某种替代机制来验证Cookie的内容,则无需使用签名的Cookie。

请注意,仅对cookie进行签名并不能防御客户端可能试图欺骗服务器的所有方式。特别是,签名不能防御重放攻击。还请注意,对于服务器而言,根本不向客户端发送敏感数据是一个非常糟糕的主意。我给出的将银行帐号放入Cookie的示例只是为了说明这一概念。真正的Web应用程序不应该这样做。