Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Что хранит 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