Что такое JWT токен: структура, claims и примеры использования

Подробное руководство по JSON Web Token (JWT): структура токена, стандартные claims, алгоритмы подписи, примеры использования в аутентификации и авторизации.

🔐 Инструмент: Используйте наш JWT декодер и генератор для анализа и создания токенов онлайн.

JSON Web Token (JWT) — это открытый стандарт RFC 7519, определяющий компактный и самодостаточный способ безопасной передачи информации между сторонами в виде JSON-объекта. JWT широко используется для аутентификации и авторизации в современных веб-приложениях, API и микросервисных архитектурах.

Структура JWT токена

JWT состоит из трёх частей, разделённых точками: Header.Payload.Signature. Каждая часть закодирована в Base64URL — модифицированной версии Base64, безопасной для использования в URL.

Header (Заголовок)

Заголовок содержит метаданные о токене: тип токена и алгоритм подписи.

{
  "alg": "HS256",
  "typ": "JWT"
}

Распространённые алгоритмы:

  • HS256 — HMAC с SHA-256, симметричный алгоритм (один секретный ключ)
  • RS256 — RSA с SHA-256, асимметричный (приватный и публичный ключи)
  • ES256 — ECDSA с SHA-256, асимметричный на эллиптических кривых

Payload (Полезная нагрузка)

Payload содержит claims (утверждения) — данные о пользователе и дополнительную информацию.

{
  "sub": "1234567890",
  "name": "John Doe",
  "email": "john@example.com",
  "role": "admin",
  "iat": 1516239022,
  "exp": 1516242622
}

Signature (Подпись)

Подпись создаётся путём кодирования Header и Payload, а затем подписания секретным ключом:

HMACSHA256(
  base64UrlEncode(header) + "." + base64UrlEncode(payload),
  secret
)

Подпись гарантирует, что токен не был изменён после создания.

Стандартные Claims (Registered Claims)

Спецификация JWT определяет набор стандартных claims:

Claim Название Описание
iss Issuer Издатель токена (URL или идентификатор сервиса)
sub Subject Субъект токена (обычно ID пользователя)
aud Audience Аудитория — для кого предназначен токен
exp Expiration Время истечения (Unix timestamp)
nbf Not Before Время, до которого токен недействителен
iat Issued At Время создания токена
jti JWT ID Уникальный идентификатор токена

Примеры использования JWT

Аутентификация в API

Наиболее распространённый сценарий — передача токена в заголовке Authorization. Сервер проверяет подпись и извлекает данные пользователя из Payload без обращения к базе данных.

Single Sign-On (SSO)

JWT позволяет реализовать единую точку входа для нескольких приложений. После аутентификации в Identity Provider пользователь получает токен, который принимается всеми связанными сервисами.

Микросервисная архитектура

В распределённых системах JWT обеспечивает stateless-аутентификацию между сервисами без необходимости централизованного хранилища сессий.

Безопасность JWT

Что нужно помнить

  • Payload не зашифрован — данные лишь закодированы в Base64, любой может их прочитать. Не храните в JWT пароли, номера карт и другие секретные данные.
  • Используйте HTTPS — токен передаётся в открытом виде, без TLS его можно перехватить.
  • Устанавливайте короткий срок действия — рекомендуется exp от 15 минут до нескольких часов.
  • Храните токены безопасно — на клиенте используйте httpOnly cookies вместо localStorage.
  • Используйте сильные ключи — для HS256 минимум 256 бит (32 символа).

Отзыв токенов

JWT по своей природе stateless — сервер не хранит информацию о выданных токенах. Для отзыва используют чёрные списки токенов в Redis, короткий срок жизни access-токена + refresh-токен для обновления, или версионирование токенов через claim с номером версии.

JWT vs Session

Критерий JWT Сессии
Хранение состояния Stateless (на клиенте) Stateful (на сервере)
Масштабирование Легко (нет общего состояния) Сложнее (нужен shared storage)
Отзыв доступа Сложнее Просто удалить сессию
Размер Больше (содержит данные) Меньше (только ID)
Кросс-доменность Легко Требует настройки

Пример декодирования на JavaScript

function decodeJwt(token) {
  const parts = token.split('.');
  if (parts.length !== 3) {
    throw new Error('Invalid JWT format');
  }
  
  // Decode header and payload
  const header = JSON.parse(atob(parts[0]));
  const payload = JSON.parse(atob(parts[1]));
  
  return { header, payload, signature: parts[2] };
}

// Использование
const token = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...';
const { header, payload } = decodeJwt(token);

console.log('Algorithm:', header.alg);
console.log('User ID:', payload.sub);
console.log('Expires:', new Date(payload.exp * 1000));

Заключение

JWT — мощный инструмент для аутентификации в современных приложениях. Он обеспечивает stateless-архитектуру, легко масштабируется и хорошо подходит для API и микросервисов. Однако важно понимать его ограничения: данные в Payload не зашифрованы, а отзыв токена требует дополнительной логики.

Для анализа и создания JWT токенов используйте наш онлайн JWT декодер — он работает полностью в браузере и не отправляет ваши данные на сервер.

Связанные инструменты: Base64 кодированиеГенератор хэшейUUID генератор