Как вы реализуете проверку JWT-токена в Node.js приложении?

«Как вы реализуете проверку JWT-токена в Node.js приложении?» — вопрос из категории Безопасность, который задают на 26% собеседований Node.js Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В Node.js приложениях я обычно использую библиотеку jsonwebtoken для верификации JWT. Вот типичная реализация middleware для Express.js:

const jwt = require('jsonwebtoken');
const { JWT_SECRET } = process.env; // Секрет хранится в переменных окружения

// Middleware для проверки токена
const authenticateToken = (req, res, next) => {
  const authHeader = req.headers['authorization'];
  const token = authHeader && authHeader.split(' ')[1]; // Извлекаем токен из 'Bearer <token>'

  if (!token) {
    return res.status(401).json({ error: 'Access token is required' });
  }

  jwt.verify(token, JWT_SECRET, (err, decoded) => {
    if (err) {
      // Детализируем ошибку для клиента
      let errorMessage = 'Invalid token';
      if (err.name === 'TokenExpiredError') {
        errorMessage = 'Token has expired';
      } else if (err.name === 'JsonWebTokenError') {
        errorMessage = 'Malformed token';
      }
      return res.status(403).json({ error: errorMessage });
    }

    // Если токен валиден, добавляем данные из payload в объект запроса
    req.user = decoded; // Обычно здесь id, email, roles
    next(); // Передаём управление следующему обработчику
  });
};

// Использование в роуте
app.get('/api/profile', authenticateToken, (req, res) => {
  // req.user теперь доступен
  res.json({ profile: req.user });
});

Ключевые моменты реализации:

  • Секретный ключ (JWT_SECRET) никогда не хардкодится, а берётся из переменных окружения.
  • Алгоритм подписи явно указывается при создании токена (например, HS256).
  • Обработка ошибок детализирована: отдельно обрабатываются просроченные и невалидные токены.
  • Для повышения безопасности в production можно добавить проверку списка отозванных токенов (blacklist) или использовать более сложные стратегии с refresh-токенами.