← Назад к вопросам

Что такое Access Token?

1.0 Junior🔥 192 комментариев
#Архитектура и паттерны#Работа с сетью

Комментарии (2)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что такое Access Token (токен доступа)?

Access Token (токен доступа) — это строка символов (обычно в формате JWT — JSON Web Token), которая выдается клиенту (например, мобильному приложению iOS) после успешной аутентификации и авторизации. Он представляет собой цифровой ключ, предоставляющий временный и ограниченный доступ к защищенным ресурсам API сервера. В архитектуре OAuth 2.0 и OpenID Connect, которые являются стандартами для современных систем, access token играет центральную роль.

Ключевые характеристики и назначение

  1. Доказательство прав доступа: Токен подтверждает, что пользователь прошел аутентификацию и приложение имеет право запрашивать данные от его имени. Сервер ресурсов (Resource Server) проверяет токен при каждом запросе, не храня состояние сессии — это основа stateless-архитектуры.

  2. Временная природа: Access tokens имеют ограниченный срок жизни (например, 15 минут, 1 час). Это снижает риски при компрометации токена. После истечения срока действия клиент должен использовать Refresh Token для получения нового access token без повторного ввода учетных данных пользователем.

  3. Ограниченная область действия (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-приложении

  1. Получение токена: После ввода пользователем логина/пароля или через социальный вход (Sign in with Apple) приложение отправляет запрос на сервер авторизации (Authorization Server) и получает ответ, содержащий access_token, refresh_token, expires_in и другие поля.

  2. Безопасное хранение: Никогда не храните токен в UserDefaults, plist-файлах или в виде plain text в Keychain. Используйте безопасное хранилище:

    • Keychain Services с использованием флага kSecAttrAccessibleWhenUnlockedThisDeviceOnly.
    • Библиотеки, такие как KeychainAccess, для удобной работы.
    import KeychainAccess
    let keychain = Keychain(service: "com.yourapp.service")
    keychain["accessToken"] = receivedAccessToken
    
  3. Использование в сетевых запросах: Токен добавляется в заголовок Authorization по схеме Bearer (как в примере кода выше). Все запросы к защищенным эндпоинтам API должны включать этот заголовок.

  4. Обновление токена: При получении HTTP-статуса 401 Unauthorized приложение должно использовать refresh token для запроса нового access token. Refresh token имеет более длительный срок жизни и хранится еще более защищенно.

Почему Access Token, а не пароли или сессии?

  • Безопасность: Утечка токена с ограниченным сроком действия менее критична, чем утечка пароля. Можно быстро отозвать токен.
  • Масштабируемость: Серверам не нужно хранить состояние сессии, что упрощает горизонтальное масштабирование.
  • Гибкость и делегирование: Пользователь может предоставить доступ третьему приложению только к определенным ресурсам (scopes), не открывая свои учетные данные.

Практические аспекты в iOS-разработке

  • Интерцепторы запросов: Используйте URLProtocol или middleware вроде Alamofire RequestInterceptor для автоматической подстановки токена и его обновления при истечении срока действия.
  • Биометрия/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 — это фундаментальный навык, требующий понимания не только механизмов сетевого взаимодействия, но и принципов безопасности мобильных клиентов.