JWT (JSON Web Token)

JWT — это открытый стандарт (RFC 7519) для создания компактных, URL-безопасных токенов, которые содержат JSON данные между сторонами.

Структура JWT

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

  • Header — заголовок с информацией о типе токена
  • Payload — полезная нагрузка с claims
  • Signature — подпись для верификации

Пример JWT

1# Полный токен
2eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
 1# Header (base64 decoded)
 2{
 3  "alg": "HS256",
 4  "typ": "JWT"
 5}
 6
 7# Payload (base64 decoded)
 8{
 9  "sub": "1234567890",
10  "name": "John Doe",
11  "iat": 1516239022
12}
1# Signature
2HMACSHA256(
3  base64UrlEncode(header) + "." +
4  base64UrlEncode(payload),
5  secret)

Стандартные Claims

  • iss — issuer (издатель)
  • sub — subject (субъект)
  • aud — audience (аудитория)
  • exp — expiration time (время истечения)
  • nbf — not before (не раньше чем)
  • iat — issued at (время выпуска)
  • jti — JWT ID (уникальный идентификатор)

Создание JWT в Node.js

 1const jwt = require('jsonwebtoken');
 2
 3// Создание токена
 4const payload = {
 5  userId: 123,
 6  username: 'john_doe',
 7  role: 'user'
 8};
 9
10const secret = 'your-secret-key';
11const token = jwt.sign(payload, secret, { 
12  expiresIn: '1h',
13  issuer: 'your-app'
14});
15
16// Верификация токена
17try {
18  const decoded = jwt.verify(token, secret);
19  console.log(decoded);
20} catch (error) {
21  console.log('Invalid token:', error.message);
22}

Установка библиотеки

1# Для Node.js
2npm install jsonwebtoken
3
4# Для Python
5pip install PyJWT
6poetry add PyJWT

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

  • Stateless — не требует хранения на сервере
  • Компактность — URL-безопасный формат
  • Самодостаточность — содержит всю необходимую информацию
  • Кроссплатформенность — поддержка многих языков

Недостатки JWT

  • Невозможность отзыва без дополнительной логики
  • Размер больше чем у session ID
  • Чувствительность к утечке секретного ключа

FAQ

Где хранить JWT на клиенте?

localStorage прост, но уязвим для XSS. httpOnly cookies безопаснее, но требуют защиты от CSRF.