Gernar
Frontend DeveloperБезопасность

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

Что такое аутентификация

Аутентификация подтверждает, кто пользователь. Для frontend-разработчика важно не путать ее с авторизацией и понимать риски токенов, cookies, XSS, CSRF и истечения сессии.

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

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

🐰0
🥚0

Мини-квиз

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

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

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

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

Вы хотите дать короткий ответ без лишней теории.

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

Разбор

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

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

Базовая идея

Аутентификация нужна, чтобы система поняла, кто делает запрос. Это может быть человек, сервис, устройство или другое приложение. В обычном веб-приложении пользователь доказывает личность через пароль, одноразовый код, passkey, корпоративный SSO или внешний identity provider.

На интервью удобно отвечать в два шага. Сначала дайте определение. Потом сразу отделите его от авторизации. Если сказать только, что это вход в систему, ответ будет слишком бытовым. Лучше добавить, что после входа еще нужно отдельно проверить права на конкретное действие.

Что важно сказать как frontend-разработчику

Frontend не должен быть источником истины для безопасности. Он показывает состояние входа, скрывает недоступные элементы, отправляет запросы с cookie или token и обрабатывает ошибки. Но решение, можно ли читать эти данные или можно ли удалить этот объект, принимает сервер.

Хорошая короткая формулировка:

Аутентификация подтверждает личность пользователя, например через пароль, MFA или провайдера. После нее приложение получает сессию или токен, а авторизация уже определяет доступы. На фронтенде я слежу, чтобы credentials передавались безопасно, не доверяю только UI-проверкам и корректно обрабатываю истечение сессии.

Типичный flow в приложении

Безопаснее
  1. 1Отправить credentials только по HTTPS
  2. 2Получить сессию или токен по контракту backend
  3. 3Запрашивать профиль через защищенный endpoint
  4. 4Обрабатывать 401 и истечение сессии
  5. 5При logout очищать клиентское состояние
Опасно
  1. 1Считать пользователя вошедшим только по флагу в localStorage
  2. 2Хранить долгоживущий token без плана отзыва
  3. 3Декодировать JWT на клиенте и доверять ролям из него
  4. 4Игнорировать 401 и показывать устаревший UI
  5. 5Запускать несколько login-запросов двойным кликом без блокировки формы
  6. 6Оставлять пользовательские данные после выхода

Этот flow важен, потому что ошибки в аутентификации часто проявляются не при первом входе, а позже. Например, пользователь оставил вкладку открытой на ночь, access token истек, приложение продолжает показывать приватные данные из кеша и все запросы падают с 401. Если вы упоминаете такие сценарии, ответ звучит практичнее.

Пример frontend-кода

Пример ниже не показывает всю production-схему. Он показывает важную мысль: после логина фронтенд не должен сам назначать роль или считать JWT окончательной проверкой прав. Он отправляет данные на сервер, затем запрашивает профиль и обрабатывает отказ.

async function login(email: string, password: string, signal?: AbortSignal) {
  const response = await fetch("/api/login", {
    method: "POST",
    headers: { "Content-Type": "application/json" },
    credentials: "include",
    signal,
    body: JSON.stringify({ email, password }),
  });

  if (!response.ok) {
    throw new Error("Не удалось войти");
  }

  const profileResponse = await fetch("/api/me", {
    credentials: "include",
    signal,
  });

  if (profileResponse.status === 401) {
    throw new Error("Сессия не активна");
  }

  if (!profileResponse.ok) {
    throw new Error("Не удалось получить профиль");
  }

  return profileResponse.json();
}

Здесь credentials: "include" нужен, если backend использует cookie-сессию или cookie с токеном. Если проект использует bearer token, контракт будет другим. В любом случае проверка личности и прав остается на backend, а frontend должен корректно реагировать на статусы и не хранить лишние секреты.

В React такой вызов обычно оборачивают в состояние формы: отключают кнопку на время запроса, показывают ошибку рядом с полями и отменяют устаревший запрос через AbortController при уходе со страницы. Иначе возможны лишние login-запросы, race condition между старым и новым ответом или обновление состояния уже размонтированного компонента.

JWT, cookies и сессии без мифов

JWT - это формат токена, а не автоматическая безопасность. Его можно подписать, ограничить по времени, проверить по issuer и audience, но при утечке он все равно может дать доступ до истечения срока. Поэтому важно говорить про короткий срок жизни, refresh-механику, logout и отзыв, если он нужен продукту.

Cookie-сессия тоже не идеальна сама по себе. httpOnly cookie защищает от чтения токена через JavaScript, но браузер будет отправлять cookie автоматически. Поэтому нужно учитывать CSRF, SameSite, Secure и доменную модель. Сильный ответ не спорит cookie против JWT абстрактно, а объясняет условия выбора.

OAuth и OpenID Connect

Если вас спрашивают про вход через Google, GitHub или корпоративный SSO, не стоит говорить, что OAuth равен аутентификации. OAuth 2.0 в первую очередь описывает делегирование доступа к ресурсам. OpenID Connect добавляет слой identity поверх OAuth 2.0 и дает стандартный способ получить информацию о пользователе.

Практический ответ может быть таким: для login через провайдера обычно используют OpenID Connect. OAuth помогает выдать доступ, а OIDC позволяет приложению понять, кто пользователь. Это коротко и показывает, что вы не смешиваете протоколы.

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

На интервью вам не нужно проектировать всю identity platform. Достаточно показать границы ответственности. Backend проверяет credentials, выдает сессию или токены, проверяет доступ на API. Frontend отправляет запросы по контракту, не хранит секреты без необходимости, защищается от типичных browser-угроз и держит понятный UX при ошибках.

Если хотите усилить ответ, добавьте пример риска. Например: если хранить долгоживущий access token в localStorage, XSS может его украсть. Если полагаться только на скрытие кнопки, пользователь сможет дернуть API напрямую. Поэтому разделяйте UX-ограничения на клиенте и настоящие проверки на сервере.

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

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

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

  1. 1

    Путать вход и права

    Аутентификация подтверждает личность, а авторизация проверяет доступ. Если сказать, что логин сам по себе дает права, вас легко поймать примером с обычным пользователем и админской страницей. Лучше разделить эти шаги и добавить, что сервер проверяет оба аспекта.
  2. 2

    Доверять только frontend-проверкам

    Скрытая кнопка не защищает API. Пользователь может отправить запрос вручную, поэтому backend должен проверять сессию и права на каждом защищенном endpoint. Фронтенд отвечает за UX, но не является источником безопасности.
  3. 3

    Хранить токен без оценки угроз

    localStorage удобен, но доступен JavaScript-коду страницы, поэтому XSS может украсть токен. httpOnly cookie снижает риск кражи через JS, но требует думать о CSRF и настройках SameSite. На интервью лучше говорить не про идеальное место, а про угрозы и trade-off.
  4. 4

    Считать JWT сессией без ограничений

    JWT часто сложно отозвать до истечения срока жизни, если нет server-side списка отзыва или короткого access token с refresh-механизмом. Долгоживущий токен повышает ущерб при утечке. Безопаснее упомянуть короткий срок жизни, подпись, проверку issuer и audience.
  5. 5

    Не обрабатывать истечение сессии

    Если приложение игнорирует 401, пользователь видит сломанный интерфейс, бесконечные спиннеры или устаревшие данные. Нужен понятный сценарий: остановить повтор, попробовать refresh один раз, очистить состояние и показать путь к повторному входу.
  6. 6

    Забывать про состояние формы входа

    Двойной клик по кнопке входа может отправить два запроса и создать гонку. Один запрос уже упал, другой еще идет, а UI показывает неверную ошибку или прежний профиль. Безопаснее блокировать submit на время запроса, показывать loading, выводить понятную ошибку и не обновлять состояние после ухода со страницы.

Follow-up

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

Короткие ответы на вопросы, которыми проверяют понимание аутентификации, токенов и границ frontend-ответственности.

Живые ответы

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

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

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

Содержание