JWT Bearer: валидация токена, claims, срок жизни
↑ 3.4 Аутентификация и авторизация · ← Предыдущая · → Следующая
Зачем это на собесе
JWT спрашивают везде: структура, что проверяется, где хранить, как отзывать.
Объяснение
JWT = header.payload.signature (Base64Url). Подпись гарантирует целостность, но не секретность: payload читается любым.
| Часть | Содержимое |
|---|---|
| Header | алгоритм (RS256, HS256), kid |
| Payload | claims: 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,HttpOnlycookie — к CSRF; выбирайте осознанно.
Практика
- Подключите Keycloak и валидацию через
Authority. - Декодируйте токен на jwt.io и найдите claims.
- Реализуйте refresh с ротацией токенов.
Вопросы с ответами
Что проверяет JwtBearer?
Подпись, издателя, аудиторию, срок действия (
exp/nbf) и алгоритм.
Как отозвать JWT?
Короткий срок, denylist/
jti, ротация ключей, введение introspection; сам токен не отзывается.
HS256 или RS256?
RS256/ES256 для распределённых систем: сервисы проверяют по публичному ключу без общего секрета.