Вопрос с собеседования · System design

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

MiddleБезопасность приложения
Ещё спрашивают так:
  • Какие проблемы у JWT?
  • Где хранить JWT в браузере?
  • Как отозвать JWT?
Коротко

JWT самодостаточен — сервер проверяет подпись без базы. Отсюда главный минус: его нельзя отозвать до истечения. Решение — короткий access-токен (минуты) и отзываемый refresh, хранимый на сервере.

  • Payload только подписан, не зашифрован — не класть персональные данные
  • Алгоритм фиксировать на сервере: атаки с alg: none и подменой RS256 на HS256
  • Хранение: httpOnly-cookie защищена от XSS, но нужна защита от CSRF; localStorage — наоборот

А ещё Для обычного веб-приложения сессия на сервере часто проще и не хуже

Подробно

Устройство. Заголовок, полезная нагрузка (claims) и подпись, каждая часть в base64url. Сервер проверяет подпись своим ключом и не ходит в базу — это хорошо масштабируется и удобно между сервисами (особенно с асимметричной подписью RS256/ES256: проверять может любой по открытому ключу).

Ловушки:

  • отзыв — выход пользователя, смена пароля, блокировка не отменяют уже выданный токен. Решения: короткий срок жизни access (5–15 минут) и refresh с сервером-хранилищем, который можно отозвать; чёрный список id токенов (jti) — но это снова поход в хранилище;
  • открытый payload — его прочитает любой; персональные и секретные данные не кладут;
  • алгоритм — проверять с явно заданным ожидаемым алгоритмом. Иначе атакующий ставит alg: none или подписывает HS256 открытым ключом, который библиотека примет за секрет;
  • размер — токен уходит с каждым запросом; не раздувать claims;
  • проверка полей — exp, nbf, iss, aud.

Где хранить в браузере — симметричный выбор:

  • httpOnly-cookie — скрипт не прочитает (защита от кражи через XSS), но браузер сам отправляет cookie — нужна защита от CSRF (SameSite, токен);
  • localStorage / память — CSRF не страшен, но любой XSS украдёт токен.

Что хотят услышать

  • Самодостаточность и проблема отзыва, схема access + refresh.
  • Открытый payload и атаки на алгоритм.
  • Компромисс хранения: cookie против localStorage.

Частые ошибки

  • «localStorage безопаснее cookie».
  • Долгоживущие access-токены без возможности отзыва.

Проверьте себя

Несколько верных вариантов. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✓Самодостаточный токен не отозвать до истечения — отсюда короткий access и refresh
  • ✗Хранить JWT в localStorage безопаснее, чем в httpOnly-cookie: так он недоступен для CSRF и XSS
  • ✓Payload лишь закодирован base64, не зашифрован — персональные данные туда не кладут
  • ✓Алгоритм подписи фиксируют на сервере, иначе возможна его подмена

Что спросят дальше

  • Как реализовать немедленный отзыв доступа при блокировке пользователя?
  • Когда обычная серверная сессия лучше JWT?

Разбор темы

Связанные вопросы

Партнёр платформы

Разбор собеседования с sotto

После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.

Разбор собеседования