Gernar
Frontend DeveloperБезопасность, аутентификация

Интервью-вопрос

Что такое JWT-токен

JWT это подписанный компактный токен с claims, который часто используют для аутентификации и передачи контекста доступа. Важно понимать, что подпись не шифрует payload, а место хранения токена влияет на XSS, CSRF и поведение logout.

Добавлен
Редакция

Подготовьте короткий ответ и пару деталей на случай уточняющих вопросов.

🐰0
🥚0

Мини-квиз

Проверка перед разбором

Несколько быстрых вопросов перед разбором. Так проще поймать места, которые только кажутся понятными.

Вопрос 1 из 50 правильно

Как лучше коротко объяснить JWT на интервью?

Вы хотите дать точный ответ без лишней магии про шифрование.

Варианты ответа

Разбор

Разобраться, а не зазубрить

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

Базовая идея

JWT это формат токена, который передает набор claims в компактной строке. Обычно строка выглядит как три части, разделенные точками:

header.payload.signature

header описывает тип токена и алгоритм защиты. payload содержит claims, например sub, role, exp, iss или aud. signature нужна, чтобы получатель мог проверить, что первые две части не изменили.

Главное для интервью такое: JWT не делает данные секретными сам по себе. Если это подписанный токен JWS, payload можно декодировать. Поэтому подпись отвечает за целостность, а не за скрытие данных.

Что сказать коротко

Хороший ответ может звучать так:

JWT это подписанный токен с JSON-claims. Он часто используется как access token: клиент отправляет его с запросом, сервер проверяет подпись, срок действия и права, а затем принимает решение о доступе. На клиенте payload можно декодировать для удобства интерфейса, но нельзя считать это полноценной проверкой безопасности.

Такой ответ показывает три важные вещи. Вы знаете структуру, не путаете подпись с шифрованием и понимаете границу ответственности фронтенда.

Как JWT участвует в запросах

Частый вариант для API выглядит так:

GET /api/profile HTTP/1.1
Host: example.com
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...

Сервер не должен просто декодировать payload и верить ему. Он проверяет подпись, срок действия exp, ожидаемый issuer, audience и права пользователя. Если проверка не прошла, фронтенд должен обработать 401 или 403, а не продолжать считать пользователя авторизованным.

На клиенте декодирование полезно для UX, например показать имя или скрыть кнопку до ответа сервера. Но это не защита. Пользователь контролирует браузер и может изменить клиентский код. Если UI показывает доступ по старому токену, запрос все равно может вернуться с 401 или 403. Поэтому состояние авторизации нужно синхронизировать с ответами API.

Как выбирать безопасную формулировку

Как не ошибиться в ответе

1Нужно только показать имя или роль в интерфейсе?
Можно декодировать payload на клиенте, но считать это только подсказкой для UI.
2Нужно разрешить доступ к данным или действию?
Проверка должна быть на сервере: подпись, срок жизни, issuer, audience и права.
3Есть риск XSS или приложение принимает HTML от пользователя?
Не полагайтесь на localStorage, усиливайте защиту от XSS и рассмотрите HttpOnly cookie.
4Токен лежит в cookie и автоматически уходит с запросами?
Продумайте CSRF-защиту: SameSite, CSRF token или другой серверный механизм.

Где основные риски для фронтенда

Что важно учитывать в браузере

Payloadвиден

Не храните секреты. Любой пользователь может декодировать claims и увидеть содержимое.

Signatureпроверка

Защищает от подмены, но только если сервер реально проверяет подпись и алгоритм.

localStorageXSS риск

Удобно для кода, но при XSS токен можно украсть через JavaScript.

HttpOnly cookieCSRF риск

Скрипт не прочитает токен, но cookie может уйти автоматически, поэтому нужна CSRF-защита.

expсрок жизни

Короткий access token уменьшает ущерб от утечки, но требует аккуратного refresh flow.

Самая частая практическая ловушка связана с хранением токена. Если положить access token в localStorage, с ним удобно работать из JavaScript, но при XSS вредоносный скрипт сможет его прочитать. Если хранить токен в HttpOnly cookie, JavaScript не сможет его украсть напрямую, но cookie может автоматически отправляться с запросами, поэтому нужен контроль CSRF.

Поэтому сильная позиция не звучит как всегда использовать localStorage или всегда использовать cookie. Лучше сказать, что выбор зависит от модели угроз, требований продукта и серверной схемы. Но в любом случае нужны HTTPS, короткий срок жизни access token, защита от XSS и понятная обработка истечения токена. Для SPA также важен один общий refresh flow, чтобы несколько параллельных запросов не запустили несколько обновлений токена и не перетерли состояние друг друга.

Пример плохого и безопасного вывода

Плохой пример, так делать не стоит:

const token = localStorage.getItem("accessToken");
const payload = JSON.parse(atob(token!.split(".")[1]));

if (payload.role === "admin") {
  showAdminPanel();
}

Здесь сразу несколько проблем. Код не проверяет подпись, не проверяет срок жизни, падает на пустом или некорректном токене и смешивает показ UI с реальным доступом. Пользователь может увидеть админский экран на мгновение, получить ошибку на действии или попасть в зависшее состояние, если API вернет 403. Даже если кнопку скрыли или показали правильно, сервер все равно должен проверить права на каждом защищенном запросе.

Более безопасная мысль для фронтенда такая: декодирование можно использовать как оптимизацию интерфейса, но запросы должны проходить через API, где проверяются подпись и claims. Парсинг токена должен быть защищен от ошибок, а UI должен иметь состояния loading, unauthorized и forbidden. Ошибки 401 и 403 нужно явно обрабатывать: обновить токен через единый refresh flow, показать форму входа или убрать недоступное действие без бесконечных повторов запроса.

Жизненный цикл токена в приложении

Безопаснее
  1. 1Получить access token с коротким сроком жизни
  2. 2Отправлять запросы только по HTTPS
  3. 3Проверять 401 и запускать один контролируемый refresh flow без гонок
  4. 4При logout удалить клиентское состояние и отозвать refresh token на сервере
Опасно
  1. 1Положить долгоживущий JWT в localStorage
  2. 2Считать decoded payload надежным источником прав
  3. 3Игнорировать истечение срока жизни, ошибки 401 и гонки refresh-запросов
  4. 4Делать logout только удалением токена в браузере

Если вас спрашивают про logout, важно не обещать магию. Удалить access token в браузере полезно, но это не всегда отзывает уже выданный JWT. Если токен украли до logout, он может работать до exp, если сервер не ведет список отозванных токенов или версию сессии.

Поэтому обычно делают короткий access token и более контролируемый refresh token. Refresh token можно хранить и отзывать на сервере, использовать rotation и обнаруживать повторное применение старого refresh token. Это сложнее, но уменьшает ущерб от утечки.

Практический вывод

На интервью не ограничивайтесь определением. Скажите, что JWT полезен, когда нужно передать подписанные claims между клиентом и сервером, но безопасность зависит от проверки на сервере и от жизненного цикла токенов.

Хорошая финальная фраза:

JWT удобен для stateless access token, но я не стал бы хранить в нем секреты или доверять одной проверке на клиенте. Я бы делал короткий срок жизни, проверял подпись и claims на сервере, аккуратно выбирал место хранения и отдельно продумывал refresh, logout и защиту от XSS/CSRF.

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

Где обычно ошибаются

Проверьте формулировки, которые звучат уверенно, но на интервью быстро выдают пробелы.

  1. 1

    Путать подпись и шифрование

    Подписанный JWT нельзя незаметно изменить, но его payload обычно можно прочитать. Если сказать, что JWT шифрует данные, вас легко поймают вопросом про base64url. Безопаснее сказать: подпись защищает целостность, а конфиденциальность требует JWE или другого шифрования.
  2. 2

    Класть секреты в payload

    В payload не должны попадать пароли, refresh token, ключи API и лишние персональные данные. Даже если токен передается по HTTPS, пользователь и любой скрипт с доступом к токену могут его декодировать. Храните только минимальные claims, которые сервер готов раскрыть клиенту.
  3. 3

    Доверять проверке на клиенте

    Фронтенд может декодировать JWT, чтобы показать состояние интерфейса, но не может быть источником авторизации. Пользователь может изменить код в браузере или подставить другой токен. Решение о доступе должен принимать сервер после проверки подписи, срока жизни и прав.
  4. 4

    Выбирать место хранения без модели угроз

    localStorage удобен, но усиливает ущерб от XSS. HttpOnly cookie защищает от чтения токена скриптом, но требует защиты от CSRF. На интервью лучше не говорить, что один вариант всегда правильный, а объяснить trade-off.
  5. 5

    Делать слишком долгий access token

    Долгий срок жизни упрощает код, но увеличивает окно атаки при утечке. Обычно access token живет недолго, а продление делается через refresh token с rotation и серверным контролем. Иначе logout и отзыв доступа будут ненадежными.

Follow-up

Что могут спросить дальше

Короткие ответы на вопросы, которыми проверяют понимание JWT, хранения токенов и рисков безопасности на фронтенде.

Живые ответы

Видео с похожим вопросом

Если найдем публичные интервью с таким вопросом, добавим их сюда. Их удобно смотреть после теории, чтобы свериться с живыми ответами.

Пока видео нет. Когда появятся подходящие публичные интервью, добавим их в этот блок, чтобы можно было сравнить разбор с тем, как отвечают реальные кандидаты.

Содержание