Токен доступа
Токен доступа — это строка символов, содержащая учётные данные для аутентификации и авторизации пользователя, приложения или сервиса при обращении к защищённым ресурсам (API, веб-сайтам, базам данных). Токен служит цифровым ключом, который выдаётся после успешной проверки подлинности (например, ввода логина и пароля) и временно подтверждает право владельца на выполнение определённых действий.
Принцип работы
Токен доступа используется в протоколах аутентификации как альтернатива передаче имени пользователя и пароля при каждом запросе. Процесс обычно включает три этапа:
- Аутентификация. Пользователь или приложение предоставляет учётные данные (логин/пароль, сертификат, биометрические данные) серверу аутентификации.
- Выдача токена. При успешной проверке сервер генерирует токен доступа, который содержит информацию о субъекте (пользователе) и его правах (ролях, разрешениях). Токен подписывается цифровой подписью сервера для защиты от подделки.
- Использование. Клиент включает токен в заголовок каждого последующего запроса к защищённому ресурсу (чаще всего в поле
Authorization: Bearer <токен>). Сервер ресурса проверяет подпись и срок действия токена, после чего предоставляет доступ без повторного запроса учётных данных.
Токены доступа имеют ограниченный срок жизни (от нескольких минут до нескольких часов). Для продления сессии без повторного ввода пароля часто используется пара «токен доступа + рефреш-токен» (refresh token), который позволяет получить новый токен доступа по истечении старого.
Виды токенов доступа
Существует несколько классификаций токенов по формату, способу хранения и области применения.
По формату
- JWT (JSON Web Token). Самый распространённый формат. Представляет собой три части, разделённые точками: заголовок (алгоритм подписи), полезная нагрузка (данные пользователя, права, срок действия) и подпись. JWT компактен, может передаваться в URL, заголовках HTTP или в теле запроса. Не требует обращения к серверу для проверки — достаточно проверить подпись локально.
- Opaque (непрозрачные) токены. Произвольная строка символов (например, UUID или хеш), не несущая смысловой нагрузки. Сервер хранит соответствие между токеном и данными пользователя в своей базе данных. Для проверки требуется запрос к серверу. Пример — сессионные идентификаторы в веб-приложениях.
- SAML (Security Assertion Markup Language) ассерции. Формат на основе XML, используемый в корпоративных системах единого входа (SSO). Менее компактен, чем JWT, но поддерживает сложные сценарии федерации.
По способу хранения
- Bearer-токены. Наиболее распространённый тип. Любой, кто предъявит такой токен (bearer — предъявитель), получает доступ. Требуют обязательной защиты канала передачи (HTTPS).
- MAC-токены (Message Authentication Code). Требуют от клиента доказательства владения секретным ключом, что снижает риск перехвата. Используются реже из-за сложности реализации.
По области применения
- Токены для API. Используются в RESTful и GraphQL API для авторизации запросов от мобильных приложений, веб-клиентов или сторонних сервисов.
- Токены для OAuth 2.0. В протоколе OAuth 2.0 токен доступа является основным элементом, позволяющим делегировать доступ к ресурсам без передачи пароля владельца.
- Токены для OpenID Connect. Расширение OAuth 2.0, где помимо токена доступа выдаётся ID-токен (обычно JWT), содержащий информацию об аутентифицированном пользователе.
Протоколы и стандарты
OAuth 2.0
OAuth 2.0 — это протокол авторизации, который позволяет сторонним приложениям получать ограниченный доступ к ресурсам пользователя без раскрытия его учётных данных. В рамках протокола сервер авторизации выдаёт токен доступа после согласия пользователя (grant). Основные типы grant-ов:
- Authorization Code Grant. Используется для веб- и мобильных приложений. Клиент получает код авторизации, который затем обменивает на токен доступа.
- Client Credentials Grant. Для серверных приложений, которые действуют от своего имени, а не от имени пользователя.
- Implicit Grant (устаревший). Упрощённый вариант для одностраничных приложений, где токен возвращался напрямую. Рекомендуется заменять на Authorization Code Grant с PKCE (Proof Key for Code Exchange).
- Resource Owner Password Credentials Grant (устаревший). Предполагает передачу логина и пароля клиенту, что противоречит идее OAuth 2.0. Используется только в доверенных средах.
OpenID Connect (OIDC)
OIDC — это слой аутентификации поверх OAuth 2.0. Он добавляет ID-токен (JWT), который содержит информацию о пользователе (имя, email, идентификатор). OIDC стандартизирует процесс входа в систему (Single Sign-On) и используется многими крупными провайдерами, включая Google, Яндекс, VK.
SAML 2.0
SAML 2.0 — это стандарт обмена данными аутентификации и авторизации между сторонами (поставщиком удостоверений и поставщиком услуг). Широко применяется в корпоративных информационных системах, особенно в государственных учреждениях и крупных организациях. В отличие от OAuth 2.0, SAML ориентирован на аутентификацию, а не на авторизацию.
Безопасность
Токены доступа являются критически важными данными, и их компрометация может привести к несанкционированному доступу. Основные меры защиты:
- Ограничение срока действия. Короткое время жизни (например, 15 минут) снижает риск при утечке.
- Хранение на стороне клиента. В веб-приложениях токены не должны храниться в
localStorageилиsessionStorageиз-за уязвимости к XSS-атакам. Рекомендуется использоватьhttpOnlyиSecureкуки. В мобильных приложениях — защищённое хранилище (Keychain на iOS, Keystore на Android). - Передача по защищённому каналу. Все запросы с токеном должны выполняться по протоколу HTTPS.
- Рефреш-токены. Хранятся в более защищённом месте и имеют длительный срок жизни, но могут быть отозваны сервером.
- Подпись. JWT подписываются с использованием алгоритмов HMAC (HS256) или асимметричного шифрования (RS256, ES256). Подпись гарантирует целостность и подлинность токена.
- Отзыв токенов. Сервер должен иметь возможность отозвать токен доступа (например, при выходе пользователя из системы или подозрении на взлом). Для непрозрачных токенов это реализуется через чёрные списки, для JWT — через хранение идентификатора токена в базе данных и проверку его статуса.
Применение
Токены доступа используются в подавляющем большинстве современных веб- и мобильных приложений, а также в микросервисной архитектуре. Примеры:
- Авторизация API. Приложение для заказа такси использует токен доступа для вызова API сервера, чтобы получить список ближайших машин.
- Единый вход (SSO). Пользователь входит в один сервис (например, Яндекс), получает токен и автоматически авторизуется в других сервисах (Яндекс.Музыка, Яндекс.Почта) без повторного ввода пароля.
- Делегированный доступ. Приложение для редактирования фото запрашивает доступ к фотографиям пользователя в облачном хранилище через OAuth 2.0. Пользователь соглашается, и приложение получает токен доступа только к фото, но не к другим данным.
- Микросервисы. Внутренние сервисы системы обмениваются токенами (часто JWT) для аутентификации друг друга, что позволяет избежать передачи паролей в каждом запросе.
Критика и ограничения
- Уязвимость к перехвату. Bearer-токены могут быть перехвачены при атаках типа «человек посередине» (MITM), если не используется HTTPS. В случае компрометации злоумышленник получает полный доступ до истечения срока токена.
- Сложность отзыва. JWT не могут быть отозваны до истечения срока действия без дополнительной инфраструктуры (чёрные списки, базы данных). Это делает их менее гибкими в сценариях, где требуется немедленный отзыв.
- Размер. JWT могут быть относительно большими (несколько килобайт), что увеличивает нагрузку на сеть при частых запросах.
- Отсутствие стандартизации для некоторых сценариев. Например, OAuth 2.0 не определяет формат токена доступа, что может приводить к несовместимости между реализациями.
Источники
- 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.
- OpenID Connect Core 1.0 Specification.
- SAML V2.0 Technical Overview.
- «OAuth 2.0 in Action» — Justin Richer, Antonio Sanso.
- «JSON Web Tokens (JWT) in Practice» — Auth0 Documentation.
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →