Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Что такое 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 — это мощный инструмент для безопасной и масштабируемой аутентификации в современных приложениях.