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

Что такое JWT?

2.3 Middle🔥 111 комментариев
#Аутентификация и безопасность

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

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

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

Что такое JWT?

JWT (JSON Web Token) – это стандарт (RFC 7519) для создания токенов доступа, которые представляют собой безопасный способ передачи информации между двумя сторонами в формате JSON. Токен является самодостаточным: он содержит всю необходимую информацию о пользователе или клиенте, что позволяет избежать необходимости многократно обращаться к базе данных или другим хранилищам для проверки данных.

Структура JWT

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

Header.Payload.Signature

1. Header

Содержит метаданные о токене – тип токена (typ) и алгоритм хеширования (alg), используемый для создания сигнатуры (например, HMAC SHA256 или RSA).

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

2. Payload

Это основная часть токена, содержащая утверждения (claims) – информацию о пользователе и дополнительные данные. Утверждения бывают трех типов:

  • Registered claims – предопределенные, стандартные поля (например, iss – издатель, exp – время истечения, sub – субъект).
  • Public claims – могут быть определены по усмотрению пользователей, но должны быть либо уникальными, либо зарегистрированными в IANA.
  • Private claims – произвольные данные, согласованные между сторонами.

Пример Payload:

{
  "sub": "1234567890",
  "name": "John Doe",
  "admin": true,
  "exp": 1516239022
}

3. Signature

Создается путем объединения хешированного Header, Payload и секретного ключа с использованием алгоритма, указанного в Header. Сигнатура обеспечивает целостность токена – если данные изменятся, сигнатура станет невалидной.

Пример создания сигнатуры для алгоритма HS256:

// Псевдокод для иллюстрации
signature = HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload), secret_key);

Итоговый токен выглядит так (пример):

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

Как работает JWT в веб-приложениях?

Процесс обычно включает следующие шаги:

  1. Аутентификация: Клиент отправляет учетные данные (например, логин/пароль) на сервер.
  2. Генерация токена: Сервер проверяет данные, создает JWT и отправляет его клиенту.
  3. Передача токена: Клиент сохраняет токен (часто в localStorage или cookie) и включает его в заголовок Authorization при последующих запросах:
    Authorization: Bearer <JWT>
    
  4. Верификация: Сервер проверяет сигнатуру токена и утверждения (например, срок действия) без обращения к базе данных – это называется stateless authentication.

Преимущества и недостатки JWT

Преимущества:

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

Недостатки:

  • Неотменяемость: Если токен утек, его сложно немедленно отозвать (без использования черного списка или короткого времени жизни).
  • Размер: Токены могут быть крупнее, чем, например, случайные строки сессий, что влияет на объем передаваемых данных.
  • Хранение на клиенте: Если токен хранится в localStorage, есть риск атак XSS.

Пример использования JWT в C# (ASP.NET Core)

В ASP.NET Core JWT часто используются для аутентификации в API. Пример конфигурации:

// Startup.cs или Program.cs
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddJwtBearer(options =>
    {
        options.TokenValidationParameters = new TokenValidationParameters
        {
            ValidateIssuer = true,
            ValidateAudience = true,
            ValidateLifetime = true,
            ValidateIssuerSigningKey = true,
            ValidIssuer = "yourdomain.com",
            ValidAudience = "yourdomain.com",
            IssuerSigningKey = new SymmetricSecurityKey(
                Encoding.UTF8.GetBytes("your_secret_key_here"))
        };
    });

Генерация токена может выглядеть так:

var claims = new[]
{
    new Claim(JwtRegisteredClaimNames.Sub, userId),
    new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString())
};

var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(secret));
var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);

var token = new JwtSecurityToken(
    issuer: "yourdomain.com",
    audience: "yourdomain.com",
    claims: claims,
    expires: DateTime.Now.AddMinutes(30),
    signingCredentials: creds);

return new JwtSecurityTokenHandler().WriteToken(token);

Заключение

JWT – это мощный инструмент для реализации аутентификации и передачи данных в современных распределенных системах. Он особенно полезен в микросервисных архитектурах и приложениях, где важны stateless-свойства и межсервисное взаимодействие. Однако важно учитывать его ограничения, особенно в вопросах безопасности и управления токенами, и применять дополнительные меры (например, короткие сроки жизни, refresh tokens, защиту от XSS) для построения надежных систем.