Каковы преимущества и недостатки использования JWT для аутентификации?

«Каковы преимущества и недостатки использования JWT для аутентификации?» — вопрос из категории Безопасность, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Преимущества:

  • Stateless (бессостояние): Серверу не нужно хранить сессию. Токен содержит все необходимые данные (claims), что упрощает масштабирование.
  • Портативность: Токен может использоваться на разных доменах и сервисах (микросервисы, мобильные приложения).
  • Самодостаточность: Полезная нагрузка (payload) может содержать данные пользователя, уменьшая запросы к БД.
  • Безопасность: Подписывается цифровой подписью (HMAC, RSA), обеспечивая целостность.

Недостатки и риски:

  • Невозможность отзыва: Токен действителен до истечения срока (exp). Для досрочного отзыва требуется сложная инфраструктура (blacklist).
  • Размер: Токены больше, чем session IDs, что увеличивает нагрузку при каждом запросе.
  • Хранение на клиенте: Уязвим к XSS-атакам при хранении в localStorage. Рекомендуется использовать httpOnly cookies.
  • Сложность отладки: Закодированный 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.