Безопасные практики инвалидации и работы с JWT в Node.js
Пройдите тест, узнайте какой профессии подходите
Быстрый ответ
Для экстренного аннулирования JWT, привяжите к токену уникальный идентификатор (jti). С каждым запросом проведите проверку в черном списке на сервере.
// Необходимые модули
const jwt = require('jsonwebtoken');
const redis = require('redis');
let blacklist = redis.createClient();
// Генерация токена
const token = jwt.sign({ user_id: user.id, jti: uuidv4() }, secret, { expiresIn: '1h' });
// Аннулирование токена
blacklist.set(token.jti, true);
// Установка времени до истечения срока действия токена
blacklist.expireat(token.jti, Math.floor(Date.now() / 1000) + 3600);
Проверка присутствия в черном списке:
// Функция проверки статуса токена
function isTokenRevoked(token) {
const { jti } = jwt.verify(token, secret);
return blacklist.get(jti) != null;
}
// Middleware для блокировки аннулированных токенов.
app.use((req, res, next) => {
const token = req.headers.authorization.split(' ')[1];
if (isTokenRevoked(token)) res.status(403).json({ message: 'Токен аннулирован' });
else next();
});
Здесь ключевую роль играет элемент jti
, позволяющий быстро идентифицировать токен в черном списке.
Принцип аннулирования JWT
JSON Web Токены (JWT) используются для аутентификации запросов и являются безсостоянийными по своей природе. Т.е., они не имеют встроенной функции деактивации.
Токены остаются активными до истечения срока их действия. Возникает вопрос: как аннулировать токен до истечения срока его действия? Рассмотрим несколько подходов.
Цикл жизни токена
Использование кратковременных токенов служит защитой от возможных угроз. Ограничивая срок действия токена, вы сокращаете потенциальную угрозу в случае его утечки.
Воспользуйтесь механизмом токенов доступа с возможностью обновления. Получите краткосрочные токены доступа вместе с более долгосрочными токенами обновления. С истечением срока действия токена доступа выполняется его обновление — это своего рода мини-рестарт авторизации.
Применение версионирования токенов также оказывается полезным. В структуру JWT можно вставить номер версии и увеличивать его после каждого выхода пользователя из системы, что на практике аннулирует предыдущий токен.
Системное аннулирование
В критических ситуациях вы можете столкнуться с необходимостью радикального пути — смените ключ шифрования токенов (секрет JWT). Таким образом, все существующие токены станут неактивными. Однако следует обращать внимание: это решение подобно полному отключению защиты, что не всегда может быть оправданно.
Токены обновления
Долгосрочные токены обновления тоже подвержены риску. Если они сохраняются в ненадежных местах, возможен несанкционированный доступ. Держите под контролем черный список токенов обновления и проверяйте их только при запросе на обновление.
Обновление на стороне сервера
Реализуйте обновление токенов на стороне сервера. Все операции с токенами происходят незаметно для клиента, что позволяет уменьшить риски и повысить уровень безопасности.