Как защитить от сессионных атак с использованием JWT? - PullRequest
0 голосов
/ 30 ноября 2018

Я не нашел сомнений, связанных с 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
        }
    });
}

1 Ответ

0 голосов
/ 30 ноября 2018

Если вы выдали пользователю токен JWT, а затем он был украден другим пользователем, невозможно определить, кто использует этот токен (без базы данных).Для этого я предлагаю, чтобы ваши токены JWT имели короткие TTL(time to live).

С другой стороны, поскольку аннулирование токенов JWT является важной проблемой с точки зрения безопасности, вы должны использовать базу данных для отслеживания токенов.Лично я использую Redis (mem-cache db) для хранения токенов JWT, потому что это быстро и подходит для этой цели.В этой структуре вам нужно запрашивать Redis для каждого запроса, чтобы понять, является ли токен действительным.

Итак, вы сохранили токены.Как вы их аннулируете?

- В принципе, вам просто нужно удалить токены из базы данных.

Есть ли обработка пакетов, которая?

Я использую этот пакет https://www.npmjs.com/package/redis-jwt

В цикле аутентификации вам необходимо выдать новый токен до истечения срока его действия.Что делать, если пользователь не делал никаких запросов до истечения срока действия своего токена аутентификации?

Вам необходимо использовать токены обновления, которые имеют больший TTL по сравнению с токенами аутентификации.С этим токеном обновления вы можете выдать новый токен аутентификации после истечения срока действия токена аутентификации.Сохраните токены обновления в своей обычной базе данных (MongoDB, SQL, Postgre или что-то еще).Также знайте, что токены обновления не имеют ничего общего с безопасностью.Они больше не обеспечивают безопасность системы.Они используются только для выдачи нового токена авторизации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...