Из чего состоит JWT-токен
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Структура JWT (JSON Web Token)
JWT (JSON Web Token) — это открытый стандарт (RFC 7519) для создания токенов доступа, которые компактно и безопасно передают информацию между сторонами в виде объекта JSON. Токен состоит из трёх основных частей, разделённых точками: **Header** (заголовок), **Payload** (полезная нагрузка) и **Signature** (подпись). Формат: `Header.Payload.Signature`.
1. Header (Заголовок)
Заголовок содержит метаданные о типе токена и алгоритме подписи. Обычно включает два поля:
- typ (type) — тип токена, например, "JWT".
- alg (algorithm) — алгоритм хеширования, используемый для создания подписи (например, HMAC SHA256 или RSA).
Пример закодированного Header:
{
"alg": "HS256",
"typ": "JWT"
}
После кодирования в Base64Url (безопасный для URL вариант Base64) он становится первой частью токена.
2. Payload (Полезная нагрузка)
Payload содержит утверждения (claims) — утверждения о пользователе и дополнительные данные. Утверждения бывают трёх типов:
- Зарегистрированные (Registered claims) — стандартные поля, рекомендованные спецификацией JWT (например,
iss— издатель,exp— срок действия,sub— тема). - Публичные (Public claims) — пользовательские поля, которые могут быть определены по соглашению.
- Приватные (Private claims) — произвольные данные для обмена информацией между сторонами.
Пример Payload:
{
"sub": "1234567890",
"name": "John Doe",
"admin": true,
"exp": 1516239022
}
Payload также кодируется в Base64Url, образуя вторую часть токена. Важно: данные в Payload не шифруются по умолчанию (если не используется JWE), поэтому не следует хранить чувствительную информацию.
3. Signature (Подпись)
Подпись обеспечивает целостность и подлинность токена. Она создаётся путём подписи закодированных Header и Payload с использованием секретного ключа (для HMAC) или пары ключей (для RSA). Алгоритм указан в Header. Процесс создания:
- Берутся закодированные Header и Payload, объединяются через точку.
- К ним применяется алгоритм подписи (например, HMAC-SHA256) с секретным ключом.
Пример создания подписи на Go:
import (
"crypto/hmac"
"crypto/sha256"
"encoding/base64"
"strings"
)
func CreateSignature(header, payload, secret string) string {
data := strings.Join([]string{header, payload}, ".")
hash := hmac.New(sha256.New, []byte(secret))
hash.Write([]byte(data))
signature := base64.RawURLEncoding.EncodeToString(hash.Sum(nil))
return signature
}
Подпись кодируется в Base64Url и становится третьей частью токена. При верификации подпись проверяется, чтобы убедиться, что токен не был изменён.
Как работает JWT на практике
- Создание токена: Сервер генерирует JWT после аутентификации пользователя, подписывая его с помощью секретного ключа.
- Передача токена: Клиент включает JWT в заголовок Authorization (например,
Bearer <token>) при запросах к защищённым ресурсам. - Верификация токена: Сервер проверяет подпись и утверждения (например, срок действия) перед предоставлением доступа.
Безопасность и важные аспекты
- Не храните секреты в Payload: Так как Payload только кодируется, для конфиденциальных данных используйте JWE (JSON Web Encryption).
- Защищайте ключи подписи: Компрометация секретного ключа позволяет злоумышленнику подделывать токены.
- Используйте короткие сроки жизни: Устанавливайте небольшое время действия (
exp) для минимизации рисков при утечке токена. - Алгоритмы подписи: Рекомендуются надёжные алгоритмы, такие как RS256 (асимметричный), вместо симметричных (HS256) в публичных API.
Пример полного JWT
Визуально токен выглядит так:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
Где:
- Первая часть: Header.
- Вторая часть: Payload.
- Третья часть: Signature.
Таким образом, JWT предоставляет стандартизированный и расширяемый механизм для безопасной передачи данных, широко используемый в аутентификации и авторизации веб-приложений и API.