JWT Bearer: валидация токена, claims, срок жизни

↑ 3.4 Аутентификация и авторизация · ← Предыдущая · → Следующая

Обязательно~3 мин чтенияУровень: middle

Зачем это на собесе

JWT спрашивают везде: структура, что проверяется, где хранить, как отзывать.

Объяснение

JWT = header.payload.signature (Base64Url). Подпись гарантирует целостность, но не секретность: payload читается любым.

ЧастьСодержимое
Headerалгоритм (RS256, HS256), kid
Payloadclaims: iss, sub, aud, exp, nbf, iat, роли и т.п.
Signatureподпись header+payload ключом
builder.Services.AddAuthentication().AddJwtBearer(o =>
{
    o.Authority = "https://keycloak.example.com/realms/app";   // ключи из JWKS
    o.Audience = "orders-api";
    o.TokenValidationParameters = new()
    {
        ValidateIssuer = true, ValidateAudience = true,
        ValidateLifetime = true, ClockSkew = TimeSpan.FromSeconds(30),
        ValidAlgorithms = ["RS256"],
    };
});
СхемаПлюсыМинусы
HS256 (общий секрет)простосекрет знают все проверяющие
RS256/ES256 (пара ключей)проверка по публичному ключу (JWKS)сложнее управление ключами

Access и Refresh

Access-токен короткоживущий (5–15 минут), refresh — долгоживущий, хранится защищённо, ротируется, отзывается на сервере.

Нюансы и подводные камни

  • Проверять нужно подпись, iss, aud, exp; отключение любой проверки — уязвимость.
  • Не кладите секреты и персональные данные в payload.
  • Отзыв: JWT сам по себе нельзя «отозвать» — короткий срок жизни, denylist по jti, introspection.
  • alg: none и подмена алгоритма — известные атаки; фиксируйте ValidAlgorithms.
  • Хранение в браузере: localStorage уязвим к XSS, HttpOnly cookie — к CSRF; выбирайте осознанно.

Практика

  1. Подключите Keycloak и валидацию через Authority.
  2. Декодируйте токен на jwt.io и найдите claims.
  3. Реализуйте refresh с ротацией токенов.

Вопросы с ответами

Связанные темы