Интервью-вопрос
Что такое OAuth 2.0
OAuth 2.0 позволяет приложению получить ограниченный доступ к ресурсам пользователя без его пароля. Для frontend-разработчика главный риск в том, как выбрать flow, обработать redirect и не допустить утечку токенов.
- Добавлен
- Редакция
Подготовьте короткий ответ и пару деталей на случай уточняющих вопросов.
Мини-квиз
Проверка перед разбором
Несколько быстрых вопросов перед разбором. Так проще поймать места, которые только кажутся понятными.
Вопрос 1 из 60 правильно
Разбор
Разобраться, а не зазубрить
Дальше разбираем суть, типичные уточнения и места, где легко сказать лишнее или перепутать термины.
Базовая идея
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, потому что нужен факт аутентификации и данные о пользователе.
Как не перепутать сценарии
Объясняйте OAuth 2.0 как делегирование доступа через scopes и access token.Говорите про OpenID Connect и ID token, а не про чистый OAuth 2.0.Называйте его public client и выбирайте Authorization Code Flow с PKCE.Можно держать токены серверно и выдавать браузеру защищенную сессионную 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.
- 1Сгенерировать state, code_verifier и code_challenge
- 2Отправить пользователя на сервер авторизации
- 3Получить authorization code на redirect_uri
- 4Проверить state и обменять code вместе с code_verifier
- 5Хранить токены с учетом риска XSS или вынести их в BFF
- 1Попросить токен сразу через Implicit Flow
- 2Принять access token из URL без строгой проверки state
- 3Сохранить токен в localStorage без оценки XSS-риска
- 4Считать client_secret во фронтенде секретом
- 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
Путать авторизацию и аутентификацию
OAuth 2.0 отвечает на вопрос, может ли клиент получить доступ к ресурсу с нужными правами. Он не обязан подтверждать личность пользователя для вашего приложения. Для сценария входа говорите про OpenID Connect иID token. - 2
Называть SPA конфиденциальным клиентом
Браузерный код доступен пользователю, поэтомуclient_secretнельзя безопасно спрятать в bundle или env-переменной. Если в ответе звучит, что секрет можно хранить во фронтенде, сразу появляется риск утечки. Корректнее сказать, что SPA это public client и ей нужен PKCE или серверный слой. - 3
Хранить токены без модели угроз
localStorageудобен, но доступен JavaScript-коду страницы, значит XSS может украсть токен. Cookie сhttpOnlyзащищает от чтения из JS, но требует защиты от CSRF и аккуратных настроекSameSite. Сильный ответ не выбирает хранилище вслепую, а объясняет риск. - 4
Забывать про state и redirect_uri
Если не проверятьstate, можно принять ответ не на тот запрос авторизации. Если разрешить слишком широкийredirect_uri, токен или код могут уйти не туда. Безопаснее генерировать state на каждый запрос и регистрировать точные redirect-адреса. - 5
Дважды обменивать authorization code в UI
authorization codeобычно одноразовый. Если React-компонент запускает обмен вuseEffectбез защиты от повторного старта, можно отправить лишний запрос, получитьinvalid_grantи показать пользователю ошибку после успешного входа. Безопаснее хранить флаг обработки, отключать кнопку повторного входа, показывать loading и после успеха убирать code из URL через replace-навигацию. - 6
Считать access token вечным пропуском
Access token должен быть ограничен по scopes и времени жизни. Иначе утечка превращается в долгий доступ к API. В ответе стоит упомянуть короткий срок жизни, refresh-механику, отзыв доступа и обработку401на фронтенде.
Follow-up
Что могут спросить дальше
Короткие ответы на вопросы, которыми проверяют понимание OAuth-flow, токенов и рисков во frontend-приложении.
Живые ответы
Видео с похожим вопросом
Если найдем публичные интервью с таким вопросом, добавим их сюда. Их удобно смотреть после теории, чтобы свериться с живыми ответами.
Пока видео нет. Когда появятся подходящие публичные интервью, добавим их в этот блок, чтобы можно было сравнить разбор с тем, как отвечают реальные кандидаты.
Как работает JWT 😎
JWT состоит из header, payload и signature, а сервер проверяет подпись и срок действия при каждом запросе. Здесь вы разберете хранение токена, проверку claims, отзыв доступа и риски для frontend-кода.
Как правильно хранить токен во Frontend 😎
Токен лучше не держать в localStorage. На интервью важно объяснить риск XSS, роль HttpOnly cookie, CSRF-защиту и компромисс между cookies и хранением access token в памяти.