Gernar
Frontend DeveloperБезопасность и авторизация

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

Что такое OAuth 2.0

OAuth 2.0 позволяет приложению получить ограниченный доступ к ресурсам пользователя без его пароля. Для frontend-разработчика главный риск в том, как выбрать flow, обработать redirect и не допустить утечку токенов.

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

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

🐰0
🥚0

Мини-квиз

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

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

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

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

Вы отвечаете на базовый вопрос и хотите сразу отделить OAuth 2.0 от логина и паролей.

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

Разбор

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

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

Базовая идея

OAuth 2.0 нужен, когда одно приложение хочет действовать с ограниченными правами от имени пользователя или получить доступ к его данным в другом сервисе. На интервью важно сказать это просто. Приложение не просит пароль от Google, GitHub или другого сервиса. Оно перенаправляет пользователя к серверу авторизации, получает разрешение и потом работает с токеном.

Например, пользователь нажимает кнопку подключить Google Calendar. Ваше приложение просит доступ только к календарю, получает access token со scope для календаря и отправляет этот токен в API Google. Если токен украден, злоумышленник не получает пароль пользователя. Но он может делать все, что разрешено этим токеном. Поэтому scopes, срок жизни и хранение токена важны для фронтенда.

Роли и что они делают

В ответе достаточно назвать роли простыми словами. Resource owner это пользователь, который владеет данными. Client это приложение, которое просит доступ. Authorization server показывает экран согласия, проверяет пользователя и выдает токены. Resource server это API, которое принимает access token и отдает защищенные данные.

Не говорите так, будто токен выдает сам frontend. Frontend только запускает flow, обрабатывает redirect и отправляет запросы по контракту. Проверять токен, scopes, audience и подпись должен соответствующий сервер или провайдер. Иначе приложение начнет доверять данным, которые не должно проверять само.

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

Хороший короткий ответ можно построить так:

OAuth 2.0 это протокол авторизации для делегированного доступа. Пользователь разрешает приложению доступ к конкретным ресурсам, а приложение получает access token с ограниченными правами. В браузерных приложениях важно не хранить секреты на фронтенде, использовать Authorization Code Flow с PKCE и защищать redirect через state.

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

Как не перепутать сценарии

1Нужно дать приложению ограниченный доступ к API пользователя?
Объясняйте OAuth 2.0 как делегирование доступа через scopes и access token.
2Нужно именно понять, кто вошел в приложение?
Говорите про OpenID Connect и ID token, а не про чистый OAuth 2.0.
3Клиент работает в браузере без своего backend?
Называйте его public client и выбирайте Authorization Code Flow с PKCE.
4Есть backend или BFF, который может хранить секреты?
Можно держать токены серверно и выдавать браузеру защищенную сессионную cookie.

Безопасный flow для SPA

В современном frontend-ответе важно упомянуть Authorization Code Flow с PKCE. Без PKCE перехваченный authorization code можно обменять на токен. PKCE добавляет одноразовую проверку. Приложение заранее создает code_verifier, отправляет производный code_challenge, а при обмене кода доказывает, что именно оно начало flow.

Упрощенно flow выглядит так:

1. SPA генерирует state и code_verifier.
2. SPA отправляет пользователя на authorization server с code_challenge.
3. Пользователь подтверждает доступ.
4. Authorization server возвращает authorization code на redirect_uri.
5. SPA проверяет state и обменивает code плюс code_verifier на tokens.
6. SPA вызывает API с access token или работает через BFF.

Практический вывод: нельзя просто взять самый короткий flow. Нужно понимать, где токен появляется, кто может увидеть URL, кто хранит секреты и что произойдет при XSS.

Безопаснее для SPA
  1. 1Сгенерировать state, code_verifier и code_challenge
  2. 2Отправить пользователя на сервер авторизации
  3. 3Получить authorization code на redirect_uri
  4. 4Проверить state и обменять code вместе с code_verifier
  5. 5Хранить токены с учетом риска XSS или вынести их в BFF
Опасный упрощенный путь
  1. 1Попросить токен сразу через Implicit Flow
  2. 2Принять access token из URL без строгой проверки state
  3. 3Сохранить токен в localStorage без оценки XSS-риска
  4. 4Считать client_secret во фронтенде секретом
  5. 5Не обрабатывать истечение токена и отзыв доступа

OAuth 2.0 и логин пользователя

Частая ловушка: фраза OAuth 2.0 нужен для аутентификации. В быту так иногда говорят, потому что пользователь нажимает кнопку входа через GitHub. Но в строгом ответе OAuth 2.0 дает приложению право доступа к ресурсу. Он не доказывает личность пользователя для вашего приложения.

Если вам нужно сказать, кто пользователь, нужен OpenID Connect. Он добавляет ID token и стандартный способ получить claims о пользователе. Это полезная деталь в ответе, потому что она показывает, что вы не смешиваете access token для API и данные для логина.

Что важно во frontend-коде

Плохой пример для SPA: положить токен в URL или считать, что env-переменная скрывает секрет клиента.

// Плохо: это попадет в клиентский bundle и не будет секретом.
const clientSecret = import.meta.env.VITE_OAUTH_CLIENT_SECRET;

Переменные с префиксом для клиентской сборки попадают в код, который пользователь может скачать и прочитать. Если провайдер требует client_secret, обмен должен происходить на сервере. Для чистой SPA используйте публичного клиента и PKCE, а не имитацию секрета.

Еще один практический момент: после возврата на redirect_uri не продолжайте flow, пока не проверили state. Иначе можно принять ответ, который не относится к текущей попытке авторизации.

В React-странице redirect не запускайте обмен кода на каждом рендере. authorization code обычно одноразовый, поэтому дубль запроса может дать invalid_grant и перевести уже вошедшего пользователя в ошибку. Безопаснее держать состояние loading, блокировать повторный старт, обрабатывать error, игнорировать результат после unmount и убирать code из URL через replace-навигацию.

Хранение токенов и срок жизни

В ответе не стоит давать универсальное правило хранить токены в localStorage или хранить только в cookie. Лучше сказать, что выбор зависит от архитектуры и модели угроз.

Если токен доступен JavaScript, XSS может его прочитать. Если доступ к API сделан через httpOnly cookie, JavaScript не прочитает токен напрямую, но нужно защищаться от CSRF, правильно настроить SameSite и CORS. В BFF-подходе токены остаются на сервере, а браузер работает с сессией. Это часто проще контролировать в продукте, где безопасность важнее простоты чистой SPA.

Access token обычно делают короткоживущим. Refresh token, если он попадает в браузер, требует еще более строгой защиты: rotation, ограничение срока, обработка повторного использования и возможность отзыва.

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

На интервью отвечайте не только определением. Сначала скажите, что OAuth 2.0 делегирует доступ через токены и scopes. Затем назовите роли и объясните, почему пароль не передается приложению. После этого добавьте frontend-нюанс: SPA не хранит секреты, для нее подходит Authorization Code Flow с PKCE, а токены нужно защищать от утечки.

Если вопрос уходит во вход через провайдера, спокойно поправьте формулировку: для логина обычно используют OpenID Connect. Такая поправка звучит сильнее, чем спор о терминах, потому что сразу показывает практическую границу протокола.

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

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

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

  1. 1

    Путать авторизацию и аутентификацию

    OAuth 2.0 отвечает на вопрос, может ли клиент получить доступ к ресурсу с нужными правами. Он не обязан подтверждать личность пользователя для вашего приложения. Для сценария входа говорите про OpenID Connect и ID token.
  2. 2

    Называть SPA конфиденциальным клиентом

    Браузерный код доступен пользователю, поэтому client_secret нельзя безопасно спрятать в bundle или env-переменной. Если в ответе звучит, что секрет можно хранить во фронтенде, сразу появляется риск утечки. Корректнее сказать, что SPA это public client и ей нужен PKCE или серверный слой.
  3. 3

    Хранить токены без модели угроз

    localStorage удобен, но доступен JavaScript-коду страницы, значит XSS может украсть токен. Cookie с httpOnly защищает от чтения из JS, но требует защиты от CSRF и аккуратных настроек SameSite. Сильный ответ не выбирает хранилище вслепую, а объясняет риск.
  4. 4

    Забывать про state и redirect_uri

    Если не проверять state, можно принять ответ не на тот запрос авторизации. Если разрешить слишком широкий redirect_uri, токен или код могут уйти не туда. Безопаснее генерировать state на каждый запрос и регистрировать точные redirect-адреса.
  5. 5

    Дважды обменивать authorization code в UI

    authorization code обычно одноразовый. Если React-компонент запускает обмен в useEffect без защиты от повторного старта, можно отправить лишний запрос, получить invalid_grant и показать пользователю ошибку после успешного входа. Безопаснее хранить флаг обработки, отключать кнопку повторного входа, показывать loading и после успеха убирать code из URL через replace-навигацию.
  6. 6

    Считать access token вечным пропуском

    Access token должен быть ограничен по scopes и времени жизни. Иначе утечка превращается в долгий доступ к API. В ответе стоит упомянуть короткий срок жизни, refresh-механику, отзыв доступа и обработку 401 на фронтенде.

Follow-up

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

Короткие ответы на вопросы, которыми проверяют понимание OAuth-flow, токенов и рисков во frontend-приложении.

Живые ответы

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

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

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

Содержание