Работали ли вы с JSON Web Tokens (JWT) в Node.js?

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

Ответ

Да, JWT — стандартный подход для аутентификации в моих Node.js приложениях. Использую библиотеку jsonwebtoken вместе с bcrypt для хеширования паролей.

Полный flow аутентификации:

const jwt = require('jsonwebtoken');
const bcrypt = require('bcrypt');

// 1. Регистрация пользователя
async function register(email, password) {
  const hashedPassword = await bcrypt.hash(password, 10);
  const user = await User.create({ email, password: hashedPassword });
  return user;
}

// 2. Логин и выдача токенов
async function login(email, password) {
  const user = await User.findOne({ email });
  if (!user) throw new Error('User not found');

  const isValid = await bcrypt.compare(password, user.password);
  if (!isValid) throw new Error('Invalid password');

  // Access token (короткоживущий)
  const accessToken = jwt.sign(
    { userId: user.id, role: user.role },
    process.env.JWT_ACCESS_SECRET,
    { expiresIn: '15m' }
  );

  // Refresh token (долгоживущий, хранится в БД)
  const refreshToken = jwt.sign(
    { userId: user.id },
    process.env.JWT_REFRESH_SECRET,
    { expiresIn: '7d' }
  );

  await RefreshToken.create({ token: refreshToken, userId: user.id });

  return { accessToken, refreshToken };
}

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

  if (!token) return res.sendStatus(401);

  jwt.verify(token, process.env.JWT_ACCESS_SECRET, (err, user) => {
    if (err) return res.sendStatus(403);
    req.user = user;
    next();
  });
}

Безопасность, которую я реализовывал:

  • Хранение секретов в environment variables
  • Использование разных секретов для access и refresh токенов
  • Регулярная ротация refresh токенов и blacklist
  • Добавление custom claims для ролевой модели
  • Валидация issuer и audience в продакшене

Для микросервисной архитектуры использовал JWT для межсервисной аутентификации, подписывая токены центральным auth-сервисом.