如何使用JWT防范会话攻击?

时间:2018-11-30 01:51:07

标签: node.js express jwt

我没有发现与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
        }
    });
}

1 个答案:

答案 0 :(得分:0)

如果您向用户发布了JWT令牌,然后又被另一个用户盗用,则无法识别谁使用了该令牌(没有数据库)。为此,我建议您的JWT令牌使用简短的TTL(time to live)

另一方面,因为从安全角度来看,使JWT令牌无效是一个重要问题,所以您应该使用数据库来跟踪令牌。就个人而言,我使用Redis(一个内存缓存数据库)来存储JWT令牌,因为它快速且适合于此目的。在这种结构中,您需要为每个请求查询Redis,以了解令牌是否有效。

因此,您存储了令牌。您将如何使它们无效?

-基本上,您只需要从数据库中删除令牌即可。

有处理包裹的包裹吗?

我使用此软件包https://www.npmjs.com/package/redis-jwt

在身份验证周期中,您需要在令牌过期之前发出一个新令牌。如果用户直到他/他的身份验证令牌过期才提出任何请求,该怎么办?

您需要使用与身份验证令牌相比具有更大TTL的刷新令牌。使用此刷新令牌,可以在身份验证令牌过期后发出新的身份验证令牌。将刷新令牌保存在普通数据库(MongoDB,SQL,Postgre或其他数据库)中。另外,请知道刷新令牌与安全性无关。它们不会给系统带来更多安全性。它们仅用于发布新的身份验证令牌。