← Назад к вопросам

Что такое JWT-токен?

1.3 Junior🔥 31 комментариев
#Безопасность и аутентификация

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI28 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что такое JWT-токен?

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

Структура JWT

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

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

1. Header (Заголовок)

Первая часть — Base64 encoded JSON с метаданными:

{
  "alg": "HS256",
  "typ": "JWT"
}
  • alg — алгоритм подписи (HS256, RS256, ES256)
  • typ — тип токена

2. Payload (Полезная нагрузка)

Вторая часть — Base64 encoded JSON с данными (claims):

{
  "sub": "1234567890",
  "name": "John Doe",
  "email": "john@example.com",
  "iat": 1516239022,
  "exp": 1516325422
}

Стандартные claims:

  • sub (subject) — идентификатор пользователя
  • iss (issuer) — издатель токена
  • aud (audience) — предполагаемая аудитория
  • exp (expiration time) — время истечения
  • iat (issued at) — время создания
  • nbf (not before) — не использовать раньше
  • Custom claims — любые данные, специфичные для приложения

3. Signature (Подпись)

Третья часть — криптографическая подпись, вычисляется как:

SIGNATURE = HMACSHA256(Base64(header) + "." + Base64(payload), secret)

Назначение: гарантирует целостность и аутентичность токена

Как работает аутентификация с JWT

Шаг 1 — Вход (Login)

POST /api/auth/login
{
  "email": "user@example.com",
  "password": "secret123"
}
→ Ответ: { "token": "eyJhbGc..." }

Шаг 2 — Клиент сохраняет токен

  • localStorage (уязвимо для XSS)
  • sessionStorage
  • secure httpOnly cookie (безопаснее)

Шаг 3 — Клиент отправляет при каждом запросе

GET /api/user/profile
Authorization: Bearer eyJhbGc...

Шаг 4 — Сервер верифицирует

  • Извлекает токен из Header
  • Проверяет signature (гарантирует, что не подделан)
  • Проверяет expiration (не истёк ли)
  • Читает claims и разрешает доступ

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

Stateless аутентификация:

  • Серверу не нужно хранить сессии в памяти/БД
  • Легко масштабировать (no sticky sessions)
  • Подходит для микросервисов и распределённых систем

Компактность:

  • Токен небольшого размера
  • Можно передавать в URL, Body или Header

Кроссдоменность:

  • Работает с CORS (не требует cookies)
  • Подходит для мобильных приложений

Информативность:

  • Все данные внутри токена (no extra БД query)
  • Содержит информацию об авторизации

Недостатки JWT

Отсутствие явного logout:

  • Токен работает до истечения срока
  • Нельзя мгновенно аннулировать (нужен blacklist)

Размер payload:

  • Если много claims — токен станет длинным
  • Передаётся с каждым запросом

Уязвимость хранения:

  • localStorage подвержен XSS атакам
  • Нужно использовать httpOnly cookies

Угроза token prediction:

  • Если secret слаб — токен можно подделать

Лучшие практики

1. Выбери правильный алгоритм:

  • Асимметричные (RS256, ES256) для микросервисов
  • Симметричные (HS256) для single application

2. Установи короткий TTL:

"exp": 1516325422  // 15 минут

3. Используй refresh tokens:

Short-lived JWT (access token) + long-lived refresh token
→ При истечении access token: refresh → новый JWT

4. Храни безопасно:

  • httpOnly + Secure cookies (защита от XSS/CSRF)
  • Никогда не localStorage для sensitive data

5. Валидируй всегда:

  • Проверяй signature
  • Проверяй expiration
  • Проверяй iss и aud

Пример с Python Flask

from flask_jwt_extended import JWTManager, create_access_token

jwt = JWTManager(app)

@app.route(/login, methods=[POST])
def login():
    user = authenticate_user(...)
    token = create_access_token(identity=user.id)
    return {"access_token": token}

@app.route(/profile)
@jwt_required()
def get_profile():
    user_id = get_jwt_identity()
    return {"user_id": user_id}

JWT — это мощный инструмент для безопасной и масштабируемой аутентификации в современных приложениях.

Что такое JWT-токен? | PrepBro