OAuth-токен
OAuth-токен — это строка символов, представляющая собой учётные данные для предоставления доступа к определённым ресурсам или действиям от имени пользователя или приложения, выдаваемая в рамках протокола авторизации OAuth (Open Authorization). Токен служит временным, делегированным разрешением, которое позволяет стороннему приложению (клиенту) получать доступ к защищённым данным, хранящимся у поставщика услуг (сервера ресурсов), без необходимости передавать этому приложению логин и пароль пользователя.
История и стандартизация
Протокол OAuth был разработан для решения проблемы делегирования доступа в веб-приложениях. Первая версия (OAuth 1.0) была опубликована в 2010 году, но имела сложности с реализацией и безопасностью. В 2012 году был принят стандарт OAuth 2.0 (RFC 6749), который стал основой для большинства современных систем авторизации. OAuth-токен является центральным элементом этого протокола.
В отличие от OAuth 1.0, где использовались цифровые подписи для каждого запроса, OAuth 2.0 отказался от подписей в пользу использования токенов, передаваемых по защищённому каналу (HTTPS). Это упростило разработку и повысило гибкость, но потребовало строгого соблюдения правил безопасности.
Типы OAuth-токенов
В рамках протокола OAuth 2.0 выделяют два основных типа токенов, которые различаются по назначению и жизненному циклу:
1. Токен доступа (Access Token)
Токен доступа — это основной элемент, который клиент предъявляет серверу ресурсов для получения доступа к защищённым данным. Он представляет собой подписанную или ссылочную строку, которая содержит информацию о разрешениях (scopes), сроке действия и идентификаторе пользователя или клиента.
- Формат: Чаще всего используется JWT (JSON Web Token) — компактный, URL-безопасный токен, содержащий утверждения (claims) в формате JSON. JWT подписывается цифровой подписью, что позволяет серверу ресурсов проверить его подлинность без обращения к серверу авторизации.
- Срок действия: Обычно короткий — от нескольких минут до нескольких часов. Короткое время жизни снижает риски при компрометации токена.
- Передача: Передаётся в HTTP-заголовке
Authorization: Bearer <token>.
2. Токен обновления (Refresh Token)
Токен обновления — это долгоживущий токен, который используется для получения нового токена доступа после истечения срока действия старого, без необходимости повторной аутентификации пользователя.
- Срок действия: Может жить дни, недели или даже месяцы, но может быть отозван сервером авторизации в любой момент.
- Хранение: Должен храниться в секрете на стороне клиента, так как его компрометация позволяет злоумышленнику получать новые токены доступа неограниченное время.
- Использование: Отправляется только на сервер авторизации, а не на сервер ресурсов.
Процесс получения OAuth-токена (Гранты)
Протокол OAuth 2.0 определяет несколько типов грантов (flows) — сценариев получения токена. Наиболее распространённые:
## Грант авторизационного кода (Authorization Code Grant)
Самый безопасный и распространённый сценарий для серверных веб-приложений.
- Пользователь нажимает кнопку «Войти через...» в клиентском приложении.
- Приложение перенаправляет пользователя на сервер авторизации (например, Google, VK, Яндекс).
- Пользователь вводит свои логин и пароль на странице сервера авторизации и подтверждает разрешения (например, «доступ к профилю»).
- Сервер авторизации перенаправляет пользователя обратно в клиентское приложение, передавая в URL временный авторизационный код.
- Клиентское приложение (на серверной стороне) отправляет этот код вместе со своим секретным ключом (client secret) на сервер авторизации.
- Сервер авторизации проверяет код и секрет, после чего выдаёт клиенту токен доступа и, опционально, токен обновления.
## Грант неявного типа (Implicit Grant)
Устаревший сценарий, использовавшийся для одностраничных приложений (SPA) и мобильных приложений, где невозможно безопасно хранить секретный ключ. В этом сценарии токен доступа выдавался напрямую после перенаправления, без промежуточного кода. Из-за низкой безопасности (токен виден в URL) этот метод не рекомендуется к использованию.
## Грант учётных данных клиента (Client Credentials Grant)
Используется для сервер-серверной аутентификации, когда приложение обращается к своим собственным ресурсам, а не от имени пользователя. Клиент передаёт свой идентификатор и секретный ключ и получает токен доступа напрямую.
## Грант пароля владельца ресурса (Resource Owner Password Credentials Grant)
Устаревший сценарий, при котором клиент напрямую запрашивает у пользователя логин и пароль и передаёт их серверу авторизации. Используется только в доверенных приложениях (например, официальные мобильные приложения) и не рекомендуется для сторонних сервисов.
Структура и содержимое OAuth-токена (JWT)
Если токен доступа реализован как JWT, его структура состоит из трёх частей, разделённых точками:
- Header: Содержит информацию о типе токена и алгоритме подписи (например,
{"alg": "RS256", "typ": "JWT"}). - Payload: Содержит утверждения (claims), которые могут включать:
sub(subject) — идентификатор пользователя или клиента.iss(issuer) — издатель токена (сервер авторизации).aud(audience) — получатель токена (сервер ресурсов).exp(expiration time) — время истечения срока действия.iat(issued at) — время выдачи.scope— разрешения, предоставленные токеном (например,read,write).
- Signature: Цифровая подпись, созданная с использованием секретного ключа или закрытого ключа сервера авторизации. Позволяет серверу ресурсов проверить, что токен не был подделан.
Безопасность и риски
OAuth-токены, несмотря на свою надёжность, подвержены ряду атак:
- Перехват токена (Token Theft): Если злоумышленник получает токен доступа (например, через незащищённое соединение, XSS-атаку или вредоносное ПО), он может использовать его для доступа к данным пользователя до истечения срока действия. Для снижения риска используется короткое время жизни токенов и обязательное использование HTTPS.
- CSRF (Cross-Site Request Forgery): При использовании гранта авторизационного кода атакующий может попытаться заставить пользователя выполнить нежелательные действия. Для защиты используется параметр
stateв запросе авторизации. - Утечка токена обновления: Компрометация долгоживущего токена обновления позволяет злоумышленнику получать новые токены доступа неограниченное время. Поэтому токены обновления должны храниться в защищённом хранилище (например, в HttpOnly-куках или на серверной стороне).
- Атака на редирект (Redirect URI Manipulation): Злоумышленник может попытаться подменить URI перенаправления, чтобы перехватить авторизационный код. Сервер авторизации должен строго проверять зарегистрированные URI.
Применение
OAuth-токены широко используются в современных веб-сервисах, мобильных приложениях и API. Примеры:
- Авторизация через социальные сети: Вход на сайт с помощью аккаунта Google, VK, Яндекс, Facebook (организация Meta признана экстремистской и запрещена в РФ) или Apple.
- Доступ к API: Приложения, работающие с данными из облачных сервисов (Google Drive, Dropbox, Яндекс.Диск), получают токен для чтения или записи файлов.
- Микросервисная архитектура: Внутренние сервисы компании могут использовать OAuth-токены для аутентификации и авторизации друг друга.
- Платёжные системы: Сервисы, такие как Stripe или PayPal, используют OAuth-токены для безопасного доступа к платёжным данным.
Интересные факты
- Протокол OAuth 2.0 не является протоколом аутентификации (проверки личности), а только авторизации (выдачи разрешений). Для аутентификации поверх OAuth 2.0 был разработан стандарт OpenID Connect.
- Токен доступа может быть как «прозрачным» (содержит все данные внутри себя, как JWT), так и «непрозрачным» (просто случайная строка, которую сервер ресурсов должен проверить у сервера авторизации).
- В России OAuth-токены активно используются в экосистемах «Госуслуги», VK, Яндекс, а также в корпоративных системах авторизации.
Источники
- RFC 6749 — The OAuth 2.0 Authorization Framework
- RFC 7519 — JSON Web Token (JWT)
- RFC 6750 — The OAuth 2.0 Authorization Framework: Bearer Token Usage
- Документация OAuth 2.0 на сайте IETF (Internet Engineering Task Force)
- Стандарт OpenID Connect 1.0
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →