Что такое JWT-токен, какова его структура и какие у него есть недостатки?

Ответ

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

Структура JWT:

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

  1. Header (Заголовок) — содержит метаданные: тип токена (typ: "JWT") и используемый алгоритм подписи (alg: "HS256", "RS256" и т.д.). Кодируется в Base64Url.
  2. Payload (Полезная нагрузка) — содержит утверждения (claims), то есть данные о пользователе и другую информацию. Бывают стандартные (iss, sub, exp — срок действия) и произвольные (user_id, role). Также кодируется в Base64Url.
  3. Signature (Подпись) — используется для проверки того, что токен не был изменён. Создаётся путём подписи закодированных header и payload с использованием секретного ключа (для HS256) или приватного ключа (для RS256).

Пример создания в Go (golang-jwt/jwt):

// Создаем claims (утверждения)
claims := jwt.MapClaims{
    "user_id": 123,
    "role":    "admin",
    "exp":     time.Now().Add(time.Hour * 24).Unix(), // Токен живет 24 часа
}

// Создаем токен с указанием алгоритма и claims
token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)

// Подписываем токен секретным ключом
tokenString, err := token.SignedString([]byte("your_secret_key"))

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

  • Stateless: Серверу не нужно хранить информацию о сессиях, вся информация находится в токене.
  • Компактность: Можно передавать в URL, заголовках (Authorization: Bearer ...) или теле запроса.

Недостатки и способы их решения:

  • Невозможно отозвать досрочно: Если токен украден, он будет действителен до истечения срока (exp).
    • Решение: Использовать короткое время жизни токенов и Refresh-токены, либо вести "черный список" (blacklist) отозванных токенов, например, в Redis.
  • Размер: Если в payload много данных, токен может стать большим.
  • Безопасность: Секретный ключ должен храниться в строжайшей тайне. Любой, кто его знает, может подделать токен.