我没有发现与nodejs有关的疑问。
我是nodejs的新手,并且正在使用JWT框架创建用户令牌和会话。我想知道如何防范会话攻击(从中窃取带有令牌的用户会话),以及如何真正保护访问免受需要身份验证的路由的攻击。</ p>
目前,我的带有身份验证和路由的JWT代码是:
JWT
const jwt = require('jsonwebtoken');
module.exports.sign = (userId, expiresInValue) => {
const userToken = jwt.sign({ userId }, process.env.SECRET, {
expiresIn: expiresInValue // EXPIRA EM 5 MINUTO
});
return userToken;
}
module.exports.tokenAuthentication = (req, res, next) => {
console.log(req.body.token)
if(!req.body.token){
res.status(401).send({
authStatus: false,
message: "NO TOKEN PROVIDED."
}).end();
} else {
jwt.verify(req.body.token, process.env.SECRET, (error, decoded) => {
if (error) {
res.status(200).send({
authStatus: false,
message: "FAILED TO AUTHENTICATE TOKEN."
}).end();
} else {
req.body.userId = decoded.userId;
req.body.userToken = req.body.token;
req.body.userTokenExp = "5 min";
next();
}
});
}
}
路线示例
const jwtLibrary = require('../../librarys/others/JWT');
module.exports = (app) => {
app.route('/home/v1/').post(jwtLibrary.tokenAuthentication, (req, res) => {
app.controllers.home.controller.renderHomePage(req, res);
});
}
路由器控制器示例
module.exports.renderHomePage = (req, res) => {
res.render('home/view', {
JWT: {
userId: req.body.userId,
userToken: req.body.userToken,
userTokenExp: req.body.userTokenExp
}
});
}
答案 0 :(得分:0)
如果您向用户发布了JWT令牌,然后又被另一个用户盗用,则无法识别谁使用了该令牌(没有数据库)。为此,我建议您的JWT令牌使用简短的TTL(time to live)
。
另一方面,因为从安全角度来看,使JWT令牌无效是一个重要问题,所以您应该使用数据库来跟踪令牌。就个人而言,我使用Redis
(一个内存缓存数据库)来存储JWT令牌,因为它快速且适合于此目的。在这种结构中,您需要为每个请求查询Redis,以了解令牌是否有效。
-基本上,您只需要从数据库中删除令牌即可。
我使用此软件包https://www.npmjs.com/package/redis-jwt
您需要使用与身份验证令牌相比具有更大TTL的刷新令牌。使用此刷新令牌,可以在身份验证令牌过期后发出新的身份验证令牌。将刷新令牌保存在普通数据库(MongoDB,SQL,Postgre或其他数据库)中。另外,请知道刷新令牌与安全性无关。它们不会给系统带来更多安全性。它们仅用于发布新的身份验证令牌。