Ответ
JWT (JSON Web Token) — это открытый стандарт (RFC 7519) для создания компактных и самодостаточных токенов, предназначенных для безопасной передачи информации между сторонами в виде JSON-объекта. Они часто используются для аутентификации и авторизации в API.
Структура JWT:
Токен состоит из трёх частей, разделённых точками (.
):
header.payload.signature
- Header (Заголовок) — содержит метаданные: тип токена (
typ
: "JWT") и используемый алгоритм подписи (alg
: "HS256", "RS256" и т.д.). Кодируется в Base64Url. - Payload (Полезная нагрузка) — содержит утверждения (claims), то есть данные о пользователе и другую информацию. Бывают стандартные (
iss
,sub
,exp
— срок действия) и произвольные (user_id
,role
). Также кодируется в Base64Url. - 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
много данных, токен может стать большим. - Безопасность: Секретный ключ должен храниться в строжайшей тайне. Любой, кто его знает, может подделать токен.