Открыть сервис

Implicit Flow

Implicit Flow — это устаревший тип авторизационного потока в протоколе OAuth 2.0, предназначенный для одностраничных приложений (SPA) и других клиентов, работающих исключительно в браузере, где доступ к секрету клиента (client secret) невозможен или небезопасен. В этом потоке токен доступа (access token) выдаётся напрямую клиенту через URL-перенаправление, минуя промежуточный этап обмена авторизационного кода на токен.

История

Implicit Flow был определён в спецификации OAuth 2.0 (RFC 6749), опубликованной в октябре 2012 года. Он разрабатывался как упрощённый механизм для публичных клиентов, которые не могут безопасно хранить секреты (например, JavaScript-приложения в браузере). Основная идея заключалась в том, чтобы сократить количество сетевых запросов и избежать необходимости использования client secret, который в браузере легко раскрывается.

Однако с течением времени стали очевидны серьёзные недостатки этого подхода. Основные проблемы были связаны с безопасностью: токен доступа передавался в URL (через фрагмент #), что делало его уязвимым для перехвата через Referer-заголовки, историю браузера и атаки типа «человек посередине» (Man-in-the-Middle). Кроме того, Implicit Flow не поддерживает обновление токенов (refresh tokens), что вынуждало приложения либо запрашивать новый токен при каждом истечении срока действия, либо хранить токен дольше, чем это безопасно.

В 2019 году в спецификации OAuth 2.0 for Browser-Based Applications (BCP 6749) и в обновлении RFC 8252 для нативных приложений было рекомендовано отказаться от Implicit Flow в пользу Authorization Code Flow с PKCE (Proof Key for Code Exchange). В 2023 году Implicit Flow был официально признан устаревшим (deprecated) в спецификации OAuth 2.0 Security Best Current Practice (RFC 9700).

Принцип работы

Implicit Flow состоит из следующих этапов:

  1. Инициализация: Клиент (например, JavaScript-приложение) перенаправляет пользователя на сервер авторизации (Authorization Server) с параметрами: response_type=token, client_id, redirect_uri и scope.
  2. Аутентификация: Пользователь вводит свои учётные данные на странице сервера авторизации и даёт согласие на запрашиваемые разрешения (scope).
  3. Выдача токена: Сервер авторизации перенаправляет браузер обратно на redirect_uri, добавляя в URL фрагмент (#) с параметрами access_token, token_type, expires_in и, опционально, state.
  4. Извлечение токена: Клиентское приложение (браузер) извлекает токен доступа из фрагмента URL. Фрагмент не передаётся на сервер, что было задумано как мера безопасности.
  5. Доступ к ресурсам: Клиент использует токен доступа для запросов к защищённым ресурсам (Resource Server), отправляя его в HTTP-заголовке Authorization: Bearer <token>.

Недостатки и критика

Implicit Flow имеет несколько критических недостатков, которые привели к его вытеснению:

  • Передача токена в URL: Токен доступа передаётся в фрагменте URL. Хотя фрагмент не отправляется на сервер при обычных HTTP-запросах, он может быть сохранён в истории браузера, перехвачен через Referer-заголовки при переходе на другие страницы или украден при атаке XSS (межсайтовый скриптинг).
  • Отсутствие refresh token: Клиент не получает токен обновления, что означает, что при истечении срока действия access token приложение должно либо запрашивать новый токен (снова перенаправляя пользователя), либо использовать долгоживущий токен, что увеличивает риски.
  • Уязвимость к атакам с подменой redirect_uri: Злоумышленник может попытаться перехватить токен, подставив свой redirect_uri, если сервер авторизации не проверяет его строго.
  • Отсутствие возможности для отзыва токена: В отличие от Authorization Code Flow, где токен выдан после обмена кода, в Implicit Flow сервер авторизации не может гарантировать, что токен не был перехвачен на этапе перенаправления.
  • Проблемы с безопасностью в SPA: Современные одностраничные приложения часто используют сервис-воркеры (Service Workers) или iframe, что может привести к утечке токена через postMessage или другие механизмы.

Замена: Authorization Code Flow с PKCE

В качестве замены Implicit Flow был предложен Authorization Code Flow с PKCE (RFC 7636). Этот поток также предназначен для публичных клиентов (SPA, мобильные приложения), но лишён основных недостатков:

  • Токен доступа не передаётся в URL, а выдаётся после обмена авторизационного кода на серверной стороне (или через HTTPS).
  • Клиент генерирует криптографический вызов (code challenge) и проверяет его при обмене кода, что предотвращает атаки с перехватом кода.
  • Поддерживаются refresh tokens, что позволяет безопасно обновлять токены без повторной аутентификации пользователя.

Применение в современной практике

На 2025 год Implicit Flow практически не используется в новых разработках. Все современные рекомендации (OAuth 2.0 Security Best Current Practice, RFC 9700; OAuth 2.0 for Browser-Based Applications, RFC 8252) настоятельно рекомендуют использовать Authorization Code Flow с PKCE для всех типов клиентов, включая одностраничные приложения.

Тем не менее, некоторые устаревшие системы и библиотеки могут всё ещё поддерживать Implicit Flow для обратной совместимости. Например, в Azure AD (Microsoft Entra ID) и Google OAuth 2.0 этот поток был отключён для новых регистраций приложений, но может быть включён для старых. В России, где использование зарубежных облачных сервисов ограничено, некоторые локальные платформы (например, Яндекс.OAuth) также перешли на Authorization Code Flow с PKCE.

Интересные факты

  • Implicit Flow получил своё название из-за того, что токен доступа выдаётся «неявно» (implicitly), без явного обмена кода.
  • В спецификации OAuth 2.0 (RFC 6749) Implicit Flow был описан как «упрощённый поток» (simplified flow), но на практике он оказался менее безопасным, чем предполагалось.
  • В 2023 году рабочая группа IETF OAuth официально объявила Implicit Flow устаревшим, рекомендовав все новые реализации использовать Authorization Code Flow с PKCE.
  • Некоторые старые реализации OAuth 2.0 (например, в Facebook Login до 2018 года) использовали Implicit Flow, но затем перешли на более безопасные механизмы.

Источники

  • RFC 6749 — The OAuth 2.0 Authorization Framework (2012)
  • RFC 7636 — Proof Key for Code Exchange (PKCE) (2015)
  • RFC 8252 — OAuth 2.0 for Native Apps (2017)
  • RFC 9700 — The OAuth 2.0 Security Best Current Practice (2023)
  • OAuth 2.0 for Browser-Based Applications (BCP 6749)

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →