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

Что хранит в себе JWT?

1.3 Junior🔥 161 комментариев
#Soft Skills и карьера

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

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

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

Что хранит JWT

JWT (JSON Web Token) — это компактный способ кодирования информации о пользователе и его правах в виде защищённого токена. JWT широко используется для аутентификации и авторизации в современных веб-приложениях и микросервисах.

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

Структура JWT

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

Содержит информацию о типе токена и алгоритме подписи.

{
  "alg": "HS256",
  "typ": "JWT"
}
  • alg — алгоритм для подписи (HS256, RS256, ES256 и т.д.)
  • typ — тип токена (обычно JWT)

Эта часть кодируется в Base64.

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

Самая важная часть — содержит claims (утверждения) — информацию о пользователе и его правах.

{
  "sub": "1234567890",
  "name": "Иван Петров",
  "email": "ivan@example.com",
  "role": "admin",
  "iat": 1516239022,
  "exp": 1516242622
}

Стандартные claims:

  • sub — subject (идентификатор пользователя)
  • iat — issued at (время создания токена в Unix timestamp)
  • exp — expiration time (время истечения токена)
  • iss — issuer (издатель, кто выдал токен)
  • aud — audience (предназначение, для кого этот токен)

Пользовательские claims:

  • name, email — личные данные
  • role, permissions — права доступа
  • Любые другие данные, необходимые приложению

Эта часть также кодируется в Base64, но НЕ шифруется! Поэтому не храните здесь пароли и конфиденциальные данные.

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

Защищает целостность токена. Создаётся путём подписания объединённых header и payload с помощью секретного ключа или приватного ключа.

Пример JWT на Java

import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import io.jsonwebtoken.security.Keys;
import java.util.Date;
import javax.crypto.SecretKey;

public class JwtTokenProvider {
    private final SecretKey key = Keys.secretKeyFor(SignatureAlgorithm.HS256);
    private final long EXPIRATION_TIME = 3600000;
    
    public String createToken(String userId, String email, String role) {
        Date now = new Date();
        Date expiryDate = new Date(now.getTime() + EXPIRATION_TIME);
        
        return Jwts.builder()
                .setSubject(userId)
                .claim("email", email)
                .claim("role", role)
                .setIssuedAt(now)
                .setExpiration(expiryDate)
                .signWith(key, SignatureAlgorithm.HS256)
                .compact();
    }
    
    public Claims parseToken(String token) {
        try {
            return Jwts.parserBuilder()
                    .setSigningKey(key)
                    .build()
                    .parseClaimsJws(token)
                    .getBody();
        } catch (ExpiredJwtException e) {
            throw new RuntimeException("Токен истёк", e);
        }
    }
}

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

  • Stateless — сервер не хранит информацию о сессиях
  • Масштабируемость — легко использовать в микросервисной архитектуре
  • Мобильная дружественность — удобно передавать в заголовках HTTP
  • Безопасность — цифровая подпись предотвращает подделку

Важные замечания

  • JWT не является шифрованием! Payload кодируется, но не шифруется
  • Не храните пароли и конфиденциальные данные в JWT
  • Всегда проверяйте подпись при получении токена
  • Установите разумное время истечения токена
  • Используйте HTTPS при передаче JWT
Что хранит в себе JWT? | PrepBro