Безопасные практики инвалидации и работы с JWT в Node.js

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Для экстренного аннулирования JWT, привяжите к токену уникальный идентификатор (jti). С каждым запросом проведите проверку в черном списке на сервере.

JS
Скопировать код
// Необходимые модули
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);

Проверка присутствия в черном списке:

JS
Скопировать код
// Функция проверки статуса токена
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, позволяющий быстро идентифицировать токен в черном списке.

Кинга Идем в IT: пошаговый план для смены профессии

Принцип аннулирования JWT

JSON Web Токены (JWT) используются для аутентификации запросов и являются безсостоянийными по своей природе. Т.е., они не имеют встроенной функции деактивации.

Токены остаются активными до истечения срока их действия. Возникает вопрос: как аннулировать токен до истечения срока его действия? Рассмотрим несколько подходов.

Цикл жизни токена

Использование кратковременных токенов служит защитой от возможных угроз. Ограничивая срок действия токена, вы сокращаете потенциальную угрозу в случае его утечки.

Воспользуйтесь механизмом токенов доступа с возможностью обновления. Получите краткосрочные токены доступа вместе с более долгосрочными токенами обновления. С истечением срока действия токена доступа выполняется его обновление — это своего рода мини-рестарт авторизации.

Применение версионирования токенов также оказывается полезным. В структуру JWT можно вставить номер версии и увеличивать его после каждого выхода пользователя из системы, что на практике аннулирует предыдущий токен.

Системное аннулирование

В критических ситуациях вы можете столкнуться с необходимостью радикального пути — смените ключ шифрования токенов (секрет JWT). Таким образом, все существующие токены станут неактивными. Однако следует обращать внимание: это решение подобно полному отключению защиты, что не всегда может быть оправданно.

Токены обновления

Долгосрочные токены обновления тоже подвержены риску. Если они сохраняются в ненадежных местах, возможен несанкционированный доступ. Держите под контролем черный список токенов обновления и проверяйте их только при запросе на обновление.

Обновление на стороне сервера

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