Что такое Access Token?
Комментарии (2)
Ответ сгенерирован нейросетью и может содержать ошибки
Что такое Access Token (токен доступа)?
Access Token (токен доступа) — это строка символов (обычно в формате JWT — JSON Web Token), которая выдается клиенту (например, мобильному приложению iOS) после успешной аутентификации и авторизации. Он представляет собой цифровой ключ, предоставляющий временный и ограниченный доступ к защищенным ресурсам API сервера. В архитектуре OAuth 2.0 и OpenID Connect, которые являются стандартами для современных систем, access token играет центральную роль.
Ключевые характеристики и назначение
-
Доказательство прав доступа: Токен подтверждает, что пользователь прошел аутентификацию и приложение имеет право запрашивать данные от его имени. Сервер ресурсов (Resource Server) проверяет токен при каждом запросе, не храня состояние сессии — это основа stateless-архитектуры.
-
Временная природа: Access tokens имеют ограниченный срок жизни (например, 15 минут, 1 час). Это снижает риски при компрометации токена. После истечения срока действия клиент должен использовать Refresh Token для получения нового access token без повторного ввода учетных данных пользователем.
-
Ограниченная область действия (Scope): Токен выдается для конкретных разрешений (scopes), например
read_profile,write_photos. Это принцип минимальных привилегий — приложение получает доступ только к тем ресурсам, которые ему действительно нужны.
// Пример HTTP-запроса с Access Token в заголовке
let url = URL(string: "https://api.example.com/user/profile")!
var request = URLRequest(url: url)
request.httpMethod = "GET"
// Добавление токена в заголовок Authorization
request.setValue("Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...", forHTTPHeaderField: "Authorization")
URLSession.shared.dataTask(with: request) { data, response, error in
// Обработка ответа от защищенного API
}.resume()
Жизненный цикл Access Token в iOS-приложении
-
Получение токена: После ввода пользователем логина/пароля или через социальный вход (Sign in with Apple) приложение отправляет запрос на сервер авторизации (Authorization Server) и получает ответ, содержащий
access_token,refresh_token,expires_inи другие поля. -
Безопасное хранение: Никогда не храните токен в UserDefaults, plist-файлах или в виде plain text в Keychain. Используйте безопасное хранилище:
- Keychain Services с использованием флага
kSecAttrAccessibleWhenUnlockedThisDeviceOnly. - Библиотеки, такие как
KeychainAccess, для удобной работы.
import KeychainAccess let keychain = Keychain(service: "com.yourapp.service") keychain["accessToken"] = receivedAccessToken - Keychain Services с использованием флага
-
Использование в сетевых запросах: Токен добавляется в заголовок
Authorizationпо схеме Bearer (как в примере кода выше). Все запросы к защищенным эндпоинтам API должны включать этот заголовок. -
Обновление токена: При получении HTTP-статуса
401 Unauthorizedприложение должно использовать refresh token для запроса нового access token. Refresh token имеет более длительный срок жизни и хранится еще более защищенно.
Почему Access Token, а не пароли или сессии?
- Безопасность: Утечка токена с ограниченным сроком действия менее критична, чем утечка пароля. Можно быстро отозвать токен.
- Масштабируемость: Серверам не нужно хранить состояние сессии, что упрощает горизонтальное масштабирование.
- Гибкость и делегирование: Пользователь может предоставить доступ третьему приложению только к определенным ресурсам (scopes), не открывая свои учетные данные.
Практические аспекты в iOS-разработке
- Интерцепторы запросов: Используйте
URLProtocolили middleware вродеAlamofireRequestInterceptor для автоматической подстановки токена и его обновления при истечении срока действия. - Биометрия/Face ID: Для дополнительной защиты refresh token можно использовать
LAContext(Local Authentication), привязывая доступ к токену к биометрической проверке. - JWT декодирование: Часто access token — это JWT. Вы можете декодировать его payload (без валидации, это делает сервер) для получения информации, например, срока действия или идентификатора пользователя.
// Декодирование JWT payload для проверки exp (expiry date)
func getExpiryDate(from jwt: String) -> Date? {
let segments = jwt.components(separatedBy: ".")
guard segments.count > 1,
let payloadData = Data(base64Encoded: base64UrlDecode(segments[1])),
let payload = try? JSONSerialization.jsonObject(with: payloadData) as? [String: Any],
let expTimestamp = payload["exp"] as? TimeInterval else {
return nil
}
return Date(timeIntervalSince1970: expTimestamp)
}
В современных iOS-приложениях работа с Access Token — это фундаментальный навык, требующий понимания не только механизмов сетевого взаимодействия, но и принципов безопасности мобильных клиентов.