В спецификации JSON Web Token (JWT), на которой основана библиотека Jose, payload токена состоит из набора claims — утверждений о субъекте токена и его контексте. Часть этих claims относится к зарегистрированным (registered claims), определённым стандартом RFC 7519. Они имеют фиксированную семантику и используются для обеспечения совместимости, безопасности и корректной валидации токенов.
При работе с библиотекой Jose в JavaScript именно эти claims становятся основой проверки подлинности, срока действия и области применения токена.
iss (Issuer) — издатель
токенаClaim iss определяет сущность, выпустившую токен. Это
может быть сервер авторизации, микросервис или внешний провайдер
идентификации.
{
"iss": "https://auth.example.com"
}
В библиотеке Jose проверка issuer выполняется через указание ожидаемого значения:
import { jwtVerify } from 'jose';
const { payload } = await jwtVerify(token, key, {
issuer: 'https://auth.example.com'
});
Если значение iss не совпадает, валидация завершится
ошибкой.
sub (Subject) — субъект
токенаClaim sub указывает на субъект, к которому относится
токен. Чаще всего это идентификатор пользователя.
{
"sub": "user_12345"
}
В большинстве систем sub используется как primary key
пользователя:
const userId = payload.sub;
aud (Audience) —
аудитория токенаClaim aud определяет получателя токена — сервис или
группу сервисов, для которых токен предназначен.
{
"aud": "payments-service"
}
Возможен также массив значений:
{
"aud": ["service-a", "service-b"]
}
await jwtVerify(token, key, {
audience: 'payments-service'
});
Если токен предназначен другой аудитории, он считается недействительным.
exp
(Expiration Time) — время истеченияClaim exp задаёт момент времени, после которого токен
становится недействительным.
Unix timestamp (в секундах).
{
"exp": 1714740000
}
await jwtVerify(token, key, {
maxTokenAge: '1h'
});
Либо автоматическая проверка через jwtVerify, если
exp присутствует.
nbf (Not Before) — не
ранее чемClaim nbf задаёт момент, до которого токен не считается
действительным.
{
"nbf": 1714730000
}
До указанного времени токен должен быть отклонён даже при корректной подписи.
iat (Issued At) — время
выдачиClaim iat фиксирует момент создания токена.
exp{
"iat": 1714720000
}
В связке с exp и nbf формирует временную
модель токена.
jti
(JWT ID) — уникальный идентификатор токенаClaim jti используется для уникальной идентификации
каждого токена.
{
"jti": "7f9c2b1a-3d4e-4a0b-9f12-8a6d9c5e1f33"
}
В системах с logout или blacklist:
const isRevoked = await redis.get(payload.jti);
if (isRevoked) {
throw new Error('Token revoked');
}
В реальных системах claims используются не по отдельности, а в комбинации, формируя строгую модель безопасности:
{
"iss": "https://auth.example.com",
"sub": "user_123",
"aud": "api-service",
"exp": 1714740000,
"nbf": 1714730000,
"iat": 1714720000,
"jti": "b6f1c2d0-8b9a-4c1d-9f2e-11c0d9a7e8b3"
}
Такой токен:
Библиотека Jose строго следует спецификации JWT и предоставляет встроенную валидацию:
iss, aud, sub проверяются
через параметры jwtVerifyexp, nbf, iat проверяются
автоматически при наличииjti не валидируется библиотекой и требует
пользовательской логикиПример комплексной проверки:
await jwtVerify(token, key, {
issuer: 'https://auth.example.com',
audience: 'api-service'
});
Причина: токен выпущен другим сервисом
Причина: попытка использовать токен в другом сервисе
exp)Причина: истечение времени жизни
nbf)Причина: преждевременное использование
iatПричина: невозможность определить возраст токена
jtiПричина: replay attack или отсутствие blacklist-механизма
Registered claims формируют базовый слой доверия в JWT-системах:
iss — доверие к источникуsub — идентификация субъектаaud — ограничение области действияexp — контроль времени жизниnbf — управление активациейiat — фиксация времени созданияjti — уникальность и отзывИх корректная комбинация обеспечивает предсказуемое поведение токенов в распределённых системах, где Jose выступает инструментом криптографической проверки и валидации.