Ответ
Преимущества:
- Stateless (бессостояние): Серверу не нужно хранить сессию. Токен содержит все необходимые данные (claims), что упрощает масштабирование.
- Портативность: Токен может использоваться на разных доменах и сервисах (микросервисы, мобильные приложения).
- Самодостаточность: Полезная нагрузка (payload) может содержать данные пользователя, уменьшая запросы к БД.
- Безопасность: Подписывается цифровой подписью (HMAC, RSA), обеспечивая целостность.
Недостатки и риски:
- Невозможность отзыва: Токен действителен до истечения срока (exp). Для досрочного отзыва требуется сложная инфраструктура (blacklist).
- Размер: Токены больше, чем session IDs, что увеличивает нагрузку при каждом запросе.
- Хранение на клиенте: Уязвим к XSS-атакам при хранении в
localStorage. Рекомендуется использоватьhttpOnlycookies. - Сложность отладки: Закодированный payload нечитаем без декодера.
Структура JWT (Header.Payload.Signature):
// Header
{
"alg": "HS256",
"typ": "JWT"
}
// Payload (Claims)
{
"sub": "1234567890",
"name": "John Doe",
"iat": 1516239022,
"exp": 1516242622
}
Практическое правило: Не храните в JWT конфиденциальные данные и используйте короткое время жизни (access tokens) в паре с refresh tokens.