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

Что такое OAuth и JWT?

1.0 Junior🔥 132 комментариев
#Теория тестирования

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

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

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

Введение в OAuth и JWT

OAuth и JWT — это два фундаментальных протокола, которые часто используются вместе в современных системах аутентификации и авторизации для веб-приложений и API. Хотя они решают разные задачи, их комбинация стала де-факто стандартом для безопасного управления доступом.


OAuth (Open Authorization)

OAuth — это открытый стандарт авторизации, а НЕ аутентификации. Его основная цель — предоставить приложению (клиенту) безопасный делегированный доступ к защищенным ресурсам пользователя на другом сервисе (провайдере ресурсов), без необходимости делиться с клиентом учетными данными пользователя (логином и паролем).

Ключевые концепции и роли в OAuth 2.0 (самая распространенная версия):

  • Владелец ресурса (Resource Owner): Пользователь, который владеет данными и может предоставить доступ к ним.
  • Клиент (Client): Приложение (веб-сайт, мобильное приложение), которое запрашивает доступ к ресурсам.
  • Сервер авторизации (Authorization Server): Сервис, который аутентифицирует пользователя и выдает токены доступа (Access Token) после получения согласия.
  • Сервер ресурсов (Resource Server): API или сервис, который хранит защищенные ресурсы пользователя и принимает для доступа токены доступа.
  • Токен доступа (Access Token): Ключ, который клиент предъявляет серверу ресурсов для получения данных. Обычно это непрозрачная строка (например, ya29.a0AfH6S...).

Типичный сценарий (Поток кода авторизации):

  1. Пользователь в клиентском приложении нажимает "Войти через Google".
  2. Клиент перенаправляет пользователя на сервер авторизации Google с запросом определенных областей видимости (scopes).
  3. Пользователь аутентифицируется у Google и дает согласие.
  4. Google перенаправляет пользователя обратно в приложение с кодом авторизации.
  5. Клиентский сервер обменивает этот код (и свой client_secret) на токен доступа.
  6. Клиент использует этот токен для вызова API Google (сервера ресурсов) и получения данных пользователя (например, email).

OAuth решает проблему безопасного делегирования прав, но не определяет формат самого токена. Здесь на сцену выходит JWT.


JWT (JSON Web Token)

JWT — это открытый стандарт (RFC 7519) для создания компактных, самодостаточных токенов в формате JSON, которые могут быть надежно переданы между сторонами. В отличие от непрозрачных токенов OAuth, JWT содержит в себе информацию (утверждения, claims) в закодированном и подписанном виде.

Структура JWT

JWT состоит из трех частей, разделенных точками:

header.payload.signature

1. Header (Заголовок)

Определяет алгоритм подписи (alg, например, HS256 или RS256) и тип токена (typ: JWT).

{
  "alg": "HS256",
  "typ": "JWT"
}

2. Payload (Полезная нагрузка)

Содержит утверждения (claims) о пользователе и дополнительных данных. Стандартные поля: iss (издатель), sub (субъект, обычно ID пользователя), exp (срок действия), iat (время выдачи).

{
  "sub": "1234567890",
  "name": "John Doe",
  "iat": 1516239022,
  "exp": 1516242622
}

3. Signature (Подпись)

Создается путем кодирования header и payload в Base64Url, их объединения с точкой и шифрования с использованием секретного ключа (для HS256) или приватного ключа (для RS256) по алгоритму, указанному в header.

// Псевдокод создания подписи
signature = HMACSHA256(
  base64UrlEncode(header) + "." + base64UrlEncode(payload),
  secret_key
);

Как работает JWT в связке с OAuth?

JWT часто используется в качестве формата токена доступа (Access Token) и токена идентификации (ID Token) в рамках расширения OAuth 2.0 — OpenID Connect (OIDC). Это превращает OAuth из чистого протокола авторизации в протокол и для аутентификации.

  1. После успешной авторизации по OAuth, сервер авторизации выдает клиенту Access Token в формате JWT.
  2. Клиент отправляет этот JWT в заголовке Authorization: Bearer <jwt_token> при вызове защищенного API.
  3. Сервер ресурсов (API) может самостоятельно проверить валидность токена, не делая запрос к серверу авторизации (stateless-проверка):
    *   Проверяет подпись, используя публичный ключ или общий секрет.
    *   Проверяет срок действия (`exp`).
    *   Проверяет издателя (`iss`).
    *   Извлекает данные пользователя (например, `sub`, `roles`) прямо из payload токена.


Сравнение и совместное использование

АспектOAuthJWT
Основная цельПротокол авторизации (делегирование доступа).Формат токена для передачи утверждений между сторонами.
Содержание токенаОбычно непрозрачная строка (референс).Самостоятельный, содержит кодированные данные (claims).
ПроверкаТребует обращения к серверу авторизации для интроспекции (stateful).Может проверяться локально по подписи (stateless).
ИспользованиеПолучение разрешения на доступ к ресурсам.Компактная и безопасная передача идентификационной информации.

Типичная архитектура OAuth 2.0 + JWT:

Пользователь -> [Клиентское приложение] -> [Сервер авторизации (OAuth)]
                                                    |
                                                    v
                                             [Выдает JWT Token]
                                                    |
                                                    v
[Сервер ресурсов (API)] <- [Клиент передает JWT в запросе] 
       |
       v
[Проверяет подпись JWT, извлекает данные из Payload, предоставляет доступ]

Заключение

Таким образом, OAuth — это протокол, который определяет процесс получения клиентом разрешения на доступ к данным пользователя. JWT — это конкретный формат токена, который часто используется в этом процессе для кодирования информации о доступе и пользователе. Вместе они образуют мощную и гибкую систему, где OAuth управляет потоком предоставления прав, а JWT выступает в роли безопасного, самодостаточного носителя этих прав, что особенно критично для микросервисных архитектур и serverless-приложений, где важна stateless-аутентификация.