【问题标题】:How to protect against session attacks using JWT?如何使用 JWT 防御会话攻击?
【发布时间】:2019-05-02 04:06:14
【问题描述】:

没有找到nodejs相关的疑惑。

我是 nodejs 的新手,我正在使用 JWT 框架来创建用户令牌和会话。我想知道如何防止会话攻击(使用令牌窃取用户会话)以及如何真正保护来自需要身份验证的路由的访问。

目前我的带有身份验证和路由的 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
        }
    });
}

【问题讨论】:

  • 那么保护路由的问题在哪里?

标签: node.js express jwt


【解决方案1】:

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

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

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

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

有包处理吗?

我用这个包https://www.npmjs.com/package/redis-jwt

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-22
    • 2015-10-02
    • 2016-10-10
    • 2011-01-02
    • 1970-01-01
    • 2020-10-03
    • 1970-01-01
    • 2018-03-22
    相关资源
    最近更新 更多