Что такое JSON Web Token?

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

Ответ

JSON Web Token (JWT) — это компактный, URL-безопасный способ представления утверждений (claims), которые должны быть переданы между двумя сторонами. В веб-разработке на Node.js JWT чаще всего используется как стандарт для токенов доступа в stateless-аутентификации.

Структура токена (Header.Payload.Signature):

  • Header: Содержит тип токена (typ: "JWT") и алгоритм подписи (alg, например, HS256 или RS256).
  • Payload: Содержит утверждения (claims) — данные о пользователе (например, userId, role) и служебную информацию (iss — издатель, exp — срок действия).
  • Signature: Создается путём кодирования header и payload по алгоритму Base64Url, их объединения и подписи с использованием секретного ключа (для HS256) или приватного ключа (для RS256). Подпись обеспечивает целостность токена.

Пример работы с JWT в Node.js (библиотека jsonwebtoken):

const jwt = require('jsonwebtoken');
const SECRET_KEY = process.env.JWT_SECRET; // Хранить в переменных окружения!

// 1. Создание (подписание) токена при успешном логине
function generateAccessToken(user) {
  return jwt.sign(
    { 
      userId: user.id, 
      role: user.role 
    }, // Payload
    SECRET_KEY,
    { expiresIn: '15m' } // Токен действует 15 минут
  );
}

// 2. Верификация и декодирование токена в middleware
function authenticateToken(req, res, next) {
  const authHeader = req.headers['authorization'];
  const token = authHeader && authHeader.split(' ')[1]; // Извлечь токен из 'Bearer <token>'

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

  jwt.verify(token, SECRET_KEY, (err, user) => {
    if (err) return res.sendStatus(403); // Токен невалиден или просрочен
    req.user = user; // Добавляем данные из payload в объект запроса
    next();
  });
}

Важные моменты:

  • JWT не зашифрован, а только закодирован и подписан. Не храните в payload конфиденциальные данные.
  • Для обеспечения безопасности используйте короткое время жизни Access Token и механизм Refresh Token.
  • Подпись HS256 использует один секретный ключ, RS256 — пару приватный/публичный ключ, что безопаснее для распределённых систем.