Access Token — це облікові дані, які клієнтський застосунок пред’являє серверу для доступу до захищених ресурсів API. Після аутентифікації користувача сервер авторизації видає access token, який клієнт передає в HTTP-заголовку Authorization з кожним запитом. За даними OAuth.net, 2025, access token може бути opaque string (довільний рядок без смислового навантаження) або JWT (самодостатній токен з даними всередині) — вибір формату залежить від архітектури та вимог до продуктивності системи.
Головне
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 також є основою для делегованої авторизації — модель, у якій користувач надає застосунку обмежений доступ до своїх даних на іншому сервісі. Наприклад, коли мобільний застосунок для редагування фотографій запитує доступ до Google Drive через OAuth 2.0, користувач бачить екран згоди, де перелічені конкретні scope, і після підтвердження отримує access token із цими правами.
Механізм роботи access token заснований на схемі Bearer: клієнт додає заголовок Authorization: Bearer <token> до кожного HTTP-запиту. Сервер ресурсів (API) отримує токен, перевіряє його валідність і визначає, які ресурси доступні. Перевірка може відбуватися двома способами: локально (для JWT) або через introspection endpoint (для opaque 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 існує в двох форматах: opaque (непрозорий) і JWT (самодостатній). Вибір між ними — одне з ключових архітектурних рішень при проектуванні системи аутентифікації.
| Параметр | Opaque Token | JWT |
|---|---|---|
| Формат | Випадковий рядок (32–64 байти) | Base64-кодований JSON з підписом |
| Перевірка | Через introspection endpoint (HTTP-запит) | Локальна (криптографічний підпис) |
| Містить дані | Ні — тільки ідентифікатор | Так — claims всередині токена |
| Відкликання | Миттєве — перевірка на сервері | Через blacklist або короткий TTL |
| Продуктивність | Кожен запит → introspection (RTT) | Локальна перевірка (без RTT) |
| Розмір | ~100 байт | ~500–2000 байт |
Opaque token кращий для систем, де потрібне миттєве відкликання доступу та централізована перевірка прав. JWT — для мікросервісної архітектури, де важливі продуктивність і мінімізація мережевих викликів. Багато провайдерів (Auth0, Keycloak) підтримують обидва формати та дозволяють налаштувати тип токена для кожного клієнта. Вибір між opaque і JWT — це компроміс між контролем і продуктивністю: opaque дає повний контроль серверу, JWT — мінімальну затримку.
Життєвий цикл 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 зберігається: на 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 для Android, що демонструє відправлення запиту з access token у заголовку Authorization та обробку 401 з автоматичним оновленням через refresh token. Використовується OkHttp з кастомним Interceptor.
data class TokenStore {
fun getAccessToken(): String? {
// Reading from 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, який перевіряє статус відповіді та при необхідності оновлює токен без участі розробника.
Часті запитання
API key — статичний ідентифікатор застосунку, не прив—язаний до конкретного користувача. Access token — динамічний, тимчасовий, прив—язаний до користувача та сесії. API key не підтримує scope (обмеження прав), у той час як access token може мати різні рівні доступу для різних операцій.
Два способи: активний — перевірка поля exp у JWT (клієнт сам обчислює, чи закінчився токен); пасивний — відправка запиту та отримання HTTP 401 Unauthorized. Рекомендується комбінувати: попередня перевірка exp для запобігання втрати даних, та обробка 401 як fallback.
Ні. Access token ніколи не повинен передаватися в query string URL. URL-параметри зберігаються в історії браузера, логах сервера, реферері та кеші проксі-серверів. Єдиний безпечний спосіб — заголовок Authorization: Bearer. Це вимога OAuth 2.0 Security Best Practices (RFC 9700).
Рекомендується 15–30 хвилин. При цьому використовується refresh token з rotation для автоматичного оновлення. Такий TTL балансує безпеку та UX: користувач не помічає оновлень, а вікно атаки при витоку токена мінімальне. Для особливо чутливих операцій (переказ грошей) — 1–5 хвилин.
Bearer token — це тип access token, при якому будь-який пред’явник (bearer) токена отримує доступ. Не потрібно криптографічного доказу володіння — достатньо факту передачі токена. Bearer-схема проста та ефективна, але вимагає обов’язкового HTTPS для захисту від перехоплення токена в дорозі.
Підсумки
Ми розробимо мобільний застосунок під ключ
IT Sectr створює застосунки для iOS та Android для стартапів і бізнесу з 2017 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.
Читайте також