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 декодер — он работает полностью в браузере и не отправляет ваши данные на сервер.