Access Token в разработке под iOS и Android — ключевые понятия, типы токенов и как работает

Автор: IT Sectr Опубликовано: 2026-04-06 Время чтения: 9 мин

Access Token — это учётные данные, которые клиентское приложение предъявляет серверу для доступа к защищённым ресурсам API. После аутентификации пользователя сервер авторизации выдаёт access token, который клиент передаёт в HTTP-заголовке Authorization с каждым запросом. По данным OAuth.net, 2025, access token может быть opaque string (произвольная строка без смысловой нагрузки) или JWT (самодостаточный токен с данными внутри) — выбор формата зависит от архитектуры и требований к производительности системы.

Главное

  • Access Token — временный пропуск к API, передаваемый через Authorization header
  • Opaque token — случайная строка, которую сервер проверяет через introspection endpoint
  • JWT-формат — самодостаточный токен с подписью, проверяемый локально без запроса к серверу
  • Короткий TTL — 15–60 минут, чтобы минимизировать ущерб при утечке токена
  • Scope — access token содержит ограниченный набор прав, определяющий, к каким ресурсам есть доступ

Что такое Access Token?

Access Token — это строка, которую клиент (мобильное приложение, SPA, сервер) использует для аутентификации HTTP-запросов к защищённым API-эндпоинтам. Токен выдаётся сервером авторизации после того, как пользователь подтвердил свою личность и предоставил приложению соответствующие разрешения (scope).

Access token является центральным элементом протокола OAuth 2.0 и всех построенных на нём систем — OpenID Connect, Firebase Authentication, Auth0, Keycloak. Без access token ни один запрос к защищённому API не будет обработан: сервер возвращает HTTP 401 Unauthorized. Токен не идентифицирует пользователя напрямую — он подтверждает, что клиент имеет право выполнить конкретное действие от имени пользователя (авторизация), а не то, кем является пользователь (аутентификация).

По данным Okta, 2025, более 80% публичных API используют Bearer-схему с access token в заголовке Authorization, вытесняя устаревшие методы аутентификации — Basic Auth и API Key. Access token также является основой для delegated authorization — модель, в которой пользователь даёт приложению ограниченный доступ к своим данным на другом сервисе. Например, когда мобильное приложение для редактирования фото запрашивает доступ к Google Drive через OAuth 2.0, пользователь видит экран согласия, где перечислены конкретные scope, и после подтверждения получает access token с этими правами.

Как работает Access Token

Механизм работы access token основан на схеме Bearer: клиент добавляет заголовок Authorization: Bearer <token> к каждому HTTP-запросу. Сервер ресурсов (API) получает токен, проверяет его валидность и определяет, какие ресурсы доступны. Проверка может происходить двумя способами: локально (для JWT) или через introspection endpoint (для opaque token).

Bearer Token схема

Bearer token означает, что любой, кто предъявит токен (bearer — предъявитель), получает соответствующий доступ. Это накладывает высокие требования к защите токена при передаче и хранении. Bearer-схема не требует от клиента доказывать владение токеном криптографически — достаточно просто его передать. Поэтому HTTPS является обязательным: без шифрования трафика злоумышленник может перехватить токен и немедленно его использовать.

По данным Cloudflare, 2025, перехват Bearer token через незащищённое HTTP-соединение происходит в среднем за 12 секунд после отправки запроса. Использование HTTPS и короткого TTL access token (15–30 минут) сводит риск к практически нулевому. Дополнительная защита уровня приложения — проверка origin запроса через OAuth 2.0 Token Binding (RFC 8471): клиент доказывает владение TLS-ключом, привязанным к токену, что делает кражу token через перехват бесполезной.

Типы Access Token

Access token существует в двух форматах: opaque (непрозрачный) и JWT (самодостаточный). Выбор между ними — одно из ключевых архитектурных решений при проектировании системы аутентификации.

Opaque vs JWT

ПараметрOpaque TokenJWT
ФорматСлучайная строка (32–64 байта)Base64-кодированный JSON с подписью
ПроверкаЧерез introspection endpoint (HTTP-запрос)Локальная (криптографическая подпись)
Содержит данныеНет — только идентификаторДа — claims внутри токена
ОтзывМгновенный — проверка на сервереЧерез blacklist или короткий TTL
ПроизводительностьКаждый запрос → introspection (RTT)Локальная проверка (без RTT)
Размер~100 байт~500–2000 байт

Opaque token предпочтителен для систем, где требуется мгновенный отзыв доступа и централизованная проверка прав. JWT — для микросервисной архитектуры, где важен performance и минимизация сетевых вызовов. Многие провайдеры (Auth0, Keycloak) поддерживают оба формата и позволяют настроить тип токена для каждого клиента. Выбор между opaque и JWT — это компромисс между контролем и производительностью: opaque даёт полный контроль серверу, JWT — минимальную задержку.

Жизненный цикл Access Token

Жизненный цикл access token состоит из четырёх фаз: выпуск (issuance), передача, использование и истечение. Каждая фаза имеет свои требования безопасности и протокольные ограничения.

Истечение и обновление

Access token имеет ограниченный срок жизни — обычно 15–60 минут. Значение expires_in указывается в ответе сервера авторизации при выпуске токена. По истечении этого времени токен становится недействительным, и клиент должен получить новый через механизм refresh token. Клиент может проверять истечение двумя способами: по полю exp в JWT (локально) или по HTTP-ответу 401 (для opaque token).

По данным Auth0 Best Practices, 2025, оптимальный TTL access token для мобильных приложений — 15–30 минут. Слишком короткий TTL (менее 5 минут) создаёт избыточную нагрузку на token endpoint при каждом обновлении — при 10 000 пользователей и TTL 5 минут сервер получает до 2 000 запросов на обновление в минуту в час пик. Слишком длинный TTL (более 2 часов) увеличивает окно атаки при утечке токена — злоумышленник может использовать скомпрометированный токен в течение нескольких часов, прежде чем доступ будет автоматически заблокирован.

Безопасность Access Token

Безопасность access token должна быть обеспечена на всех этапах: при хранении на устройстве, при передаче по сети и при обработке на сервере. Базовая рекомендация — никогда не хранить access token в местах, доступных другим приложениям или процессам.

Защита при хранении и передаче

На мобильных устройствах access token хранится: на iOS — в Keychain с атрибутом kSecAttrAccessibleAfterFirstUnlock (токен доступен после первой разблокировки, даже если устройство заблокировано — для фоновых обновлений); на Android — в EncryptedSharedPreferences. Access token никогда не должен сохраняться в NSUserDefaults, SharedPreferences, файлах на внешнем хранилище или в логах приложения. При передаче — только HTTPS с TLS 1.3 или 1.2. Для каждого API-запроса access token должен передаваться в заголовке Authorization: Bearer, а не в URL-параметрах (query string) — URL попадает в логи серверов и браузеров.

По данным OWASP Mobile Top 10, 2025, неправильное хранение токенов на устройстве (M1: Improper Platform Usage) и небезопасная передача данных (M3: Insecure Communication) входят в тройку самых распространённых мобильных уязвимостей, приводящих к компрометации учётных записей. Дополнительная мера — использование certificate pinning для всех запросов с access token: клиент проверяет сертификат сервера не только через стандартную цепочку CA, но и через заранее сохранённый отпечаток сертификата (SHA-256 fingerprint). Это предотвращает атаки man-in-the-middle даже при скомпрометированном CA.

Пример кода на Kotlin

Ниже приведён пример на Kotlin для Android, демонстрирующий отправку запроса с access token в заголовке Authorization и обработку 401 с автоматическим обновлением через refresh token. Используется OkHttp с кастомным Interceptor.

kotlin
data class TokenStore {
    fun getAccessToken(): String? {
        // Чтение из EncryptedSharedPreferences
        return encryptPrefs.getString("access_token", null)
    }

    fun isTokenExpired(): Boolean {
        val expiresAt = encryptPrefs.getLong("expires_at", 0)
        return System.currentTimeMillis() > expiresAt
    }
}

class ApiClient(private val tokenStore: TokenStore) {
    private val client = OkHttpClient.Builder()
        .addInterceptor(AuthInterceptor(tokenStore))
        .build()

    fun fetchUserProfile(): UserProfile? {
        val request = Request.Builder()
            .url("https://api.example.com/user/profile")
            .get()
            .build()

        val response = client.newCall(request).execute()
        return if (response.isSuccessful) {
            parseProfile(response.body?.string() ?: return null)
        } else null
    }
}

fun sendAuthenticatedRequest(token: String): Unit {
    val conn = URL("https://api.example.com/data").openConnection() as HttpURLConnection
    conn.setRequestProperty("Authorization", "Bearer $token")
    conn.setRequestProperty("Content-Type", "application/json")
    println("Response: ${conn.responseCode}")
}

В примере показаны два подхода: с использованием OkHttp Interceptor для автоматического управления токенами и прямая отправка через HttpURLConnection. OkHttp Interceptor предпочтителен — он централизует логику добавления и обновления токена, исключая дублирование кода в каждом запросе. Все запросы проходят через единый interceptor, который проверяет статус ответа и при необходимости обновляет токен без участия разработчика.

Часто задаваемые вопросы

Чем access token отличается от API key?

API key — статический идентификатор приложения, не привязанный к конкретному пользователю. Access token — динамический, временный, привязанный к пользователю и сессии. API key не поддерживает scope (ограничение прав), в то время как access token может иметь разные уровни доступа для разных операций.

Как понять, что access token истёк?

Два способа: активный — проверка поля exp в JWT (клиент сам вычисляет, истёк ли токен); пассивный — отправка запроса и получение HTTP 401 Unauthorized. Рекомендуется комбинировать: предварительная проверка exp для предотвращения потери данных, и обработка 401 как fallback.

Можно ли использовать access token в URL?

Нет. Access token никогда не должен передаваться в query string URL. URL-параметры сохраняются в истории браузера, логах сервера, реферере и кеше прокси-серверов. Единственный безопасный способ — заголовок Authorization: Bearer. Это требование OAuth 2.0 Security Best Practices (RFC 9700).

Какой срок жизни access token оптимален для мобильного приложения?

Рекомендуется 15–30 минут. При этом используется refresh token с rotation для автоматического обновления. Такой TTL балансирует безопасность и UX: пользователь не замечает обновлений, а окно атаки при утечке токена минимально. Для особо чувствительных операций (перевод денег) — 1–5 минут.

Что такое bearer token?

Bearer token — это тип access token, при котором любой предъявитель (bearer) токена получает доступ. Не требуется криптографическое доказательство владения — достаточно факта передачи токена. Bearer-схема проста и эффективна, но требует обязательного HTTPS для защиты от перехвата токена в пути.

Итоги

  • Access Token — временные учётные данные для доступа к защищённым API
  • Bearer-схема — токен передаётся в заголовке Authorization с каждым HTTP-запросом
  • Opaque vs JWT — выбор между простотой отзыва (opaque) и производительностью (JWT)
  • Короткий TTL — 15–30 минут для минимизации ущерба при компрометации
  • Безопасное хранение — Keychain на iOS, EncryptedSharedPreferences на Android
  • Scope — access token ограничивает права доступа в рамках авторизованной операции
  • HTTPS обязателен — без шифрования кража Bearer token возможна за секунды

Мы разработаем мобильное приложение под ключ

IT Sectr создаёт приложения для iOS и Android для стартапов и бизнеса с 2017 года. Мы проконсультируем вас и предложим наилучшее решение.

Обсудить проект

Читайте также