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

Как работает технология аутентификации на базе JWT?

2.3 Middle🔥 281 комментариев
#ASP.NET и Web API#Аутентификация и безопасность

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

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

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

Как работает технология аутентификации на базе JWT

JWT (JSON Web Token) — это открытый стандарт (RFC 7519), который определяет компактный и самодостаточный способ безопасной передачи информации между сторонами в виде JSON объекта. Эта информация может быть проверена и доверена, потому что она цифровая подписана. JWT часто используется для аутентификации и авторизации в современных веб-приложениях и API, особенно в архитектурах, основанных на микросервисах или отдельном фронтенде и бэкенде.

Структура JWT

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

xxxxx.yyyyy.zzzzz

Вот пример разбора реального токена:

// Header (закодирован в Base64Url)
{
  "alg": "HS256",
  "typ": "JWT"
}

// Payload (закодирован в Base64Url)
{
  "sub": "1234567890",
  "name": "John Doe",
  "admin": true,
  "iat": 1516239022
}

// Signature
HMACSHA256(
  base64UrlEncode(header) + "." + base64UrlEncode(payload),
  secret-key
)

1. Header (xxxxx) Определяет алгоритм шифрования (alg) и тип токена (typ). Чаще всего используется HS256 (HMAC с SHA-256) или RS256 (RSA с SHA-256).

2. Payload (yyyyy) Содержит утверждения (claims) — информацию о пользователе и дополнительные данные. Утверждения бывают трех типов:

  • Registered claims: Предопределенные, но не обязательные утверждения (например, iss (issuer), exp (expiration time), sub (subject)).
  • Public claims: Могут быть определены по усмотрению, но должны быть уникальными, чтобы избежать конфликтов.
  • Private claims: Кастомные утверждения, согласованные между сторонами (например, role, department).

3. Signature (zzzzz) Создается путем кодирования Header и Payload с помощью алгоритма, указанного в Header, и секретного ключа (для HMAC) или приватного ключа (для RSA). Сигнатура обеспечивает целостность токена. Если данные токена будут изменены, сигнатура станет невалидной.

Процесс аутентификации с использованием JWT

1. Запрос аутентификации Клиент (например, фронтенд-приложение) отправляет запрос на сервер аутентификации (обычно эндпоинт /login), предоставляя свои учетные данные (username/password, токен OAuth, etc.).

// Пример контроллера для аутентификации в ASP.NET Core
[HttpPost("login")]
public async Task<IActionResult> Login([FromBody] LoginRequest request)
{
    var user = await _userService.Authenticate(request.Username, request.Password);
    if (user == null)
        return Unauthorized();

    var token = _jwtService.GenerateToken(user);
    return Ok(new { token });
}

2. Генерация токена Если учетные данные верны, сервер создает JWT:

  • Формирует Header с алгоритмом.
  • Формирует Payload с утверждениями (например, userId, roles, expiry).
  • Генерирует Signature с использованием секретного ключа.
  • Возвращает токен клиенту (обычно в теле ответа).

3. Передача токена клиенту Клиент сохраняет полученный JWT (часто в localStorage, sessionStorage или в памяти). При каждом последующем запросе к защищенным ресурсам API клиент включает этот токен в HTTP Header Authorization.

Authorization: Bearer <your-jwt-token>

4. Валидация токена на сервере При получении запроса с JWT, сервер (бэкенд API):

  • Проверяет наличие и формат токена в заголовке.
  • Проверяет Signature, чтобы убедиться, что токен не был изменен и был выпущен доверенным источником.
  • Проверяет утверждения в Payload, особенно срок действия (exp).
  • Если токен валиден, сервер извлекает информацию из Payload (например, userId) для авторизации запроса (определения, имеет ли пользователь право на доступ к ресурсу).
// Пример middleware валидации JWT в ASP.NET Core (используется стандартный Microsoft.AspNetCore.Authentication.JwtBearer)
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddJwtBearer(options =>
    {
        options.TokenValidationParameters = new TokenValidationParameters
        {
            ValidateIssuer = true,
            ValidateAudience = true,
            ValidateLifetime = true,
            ValidateIssuerSigningKey = true,
            ValidIssuer = "your-issuer",
            ValidAudience = "your-audience",
            IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("your-secret-key"))
        };
    });

Ключевые преимущества JWT

  • Статусность (Stateless): Серверу не нужно хранить сессию или токен в памяти/базе данных. Все необходимые данные содержатся в самом токене. Это снижает нагрузку на сервер и упрощает масштабирование.
  • Самодостаточность: Токен содержит все необходимые утверждения, что уменьшает количество запросов к базе данных для проверки прав пользователя.
  • Универсальность: JWT может использоваться не только для аутентификации между клиентом и сервером, но и для безопасного обмена информацией между сервисами (микросервисами).
  • Поддержка различных алгоритмов: Можно использовать симметричное шифрование (HMAC) или асимметричное (RSA/ECDSA).

Вопросы безопасности и лучшие практики

  • Срок действия (Expiry): Всегда устанавливайте короткий срок жизни токена (exp), чтобы минимизировать риск использования украденного токена. Для долгосрочного доступа используйте механизм refresh токенов.
  • Секретный ключ: Для алгоритмов HMAC ключ должен быть строго защищен и достаточно сложным. Для RSA используйте надежные приватные ключи.
  • Не хранить конфиденциальные данные: JWT легко декодируется (Header и Payload — это просто Base64), поэтому нельзя помещать в Payload секретную информацию (пароли, ключи).
  • Передача по HTTPS: Токены всегда должны передаваться только по защищенному соединению HTTPS, чтобы предотвратить их перехват.
  • Валидация на стороне сервера: Не доверяйте утверждениям только на основании их наличия в токене. Сервер должен всегда проверять Signature.

JWT стал де-факто стандартом для аутентификации API благодаря своей простоте, статусности и широкой поддержке в библиотеках и фреймворках, таких как ASP.NET Core, где его интеграция осуществляется через пакет Microsoft.AspNetCore.Authentication.JwtBearer.