Стандартные claims: iss, sub, aud, exp, nbf, iat, jti

JWT использует набор стандартных утверждений (claims), которые определяют контекст, срок действия и назначение токена. В библиотеке Jsrsasign работа с ними происходит через создание и проверку JWT с помощью объектов KJUR.jws.JWS и KJUR.jws.JWS.sign / verify. Эти поля формируют основу безопасности и контроля доступа, поскольку позволяют серверу интерпретировать токен без обращения к базе данных.

В спецификации JWT стандартные claims делятся на зарегистрированные (registered claims). Они имеют фиксированное назначение и широко поддерживаются всеми реализациями, включая Jsrsasign.


Claim iss определяет издателя токена. Это строковый идентификатор, который позволяет системе понять, какой сервис сформировал JWT.

В Jsrsasign это значение не обрабатывается автоматически — оно просто включается в payload и затем проверяется на стороне верификации.

Пример формирования токена с iss:

const header = { alg: "HS256", typ: "JWT" };

const payload = {
  iss: "https://auth.example.com",
  sub: "user123",
  iat: Math.floor(Date.now() / 1000)
};

const secret = "secret-key";

const jwt = KJUR.jws.JWS.sign(null, header, payload, secret);

При проверке значение iss сравнивается вручную после декодирования:

const isValid = KJUR.jws.JWS.verify(jwt, secret);

const decoded = KJUR.jws.JWS.parse(jwt);
const payloadObj = decoded.payloadObj;

if (payloadObj.iss !== "https://auth.example.com") {
  throw new Error("Invalid issuer");
}

sub (subject)

sub определяет субъект токена — сущность, которой он принадлежит. Чаще всего это идентификатор пользователя или клиента.

Это поле является ключевым для связывания токена с конкретной учетной записью.

Пример:

const payload = {
  iss: "auth-server",
  sub: "user_98765",
  iat: Math.floor(Date.now() / 1000)
};

В практических системах sub используется как основной идентификатор при авторизации запросов:

const decoded = KJUR.jws.JWS.parse(jwt);
const userId = decoded.payloadObj.sub;

aud (audience)

aud задаёт аудиторию токена — сервис или набор сервисов, для которых предназначен JWT. Это предотвращает использование токена в неправильном контексте.

Значение может быть строкой или массивом.

const payload = {
  sub: "user_1",
  aud: "api.service.com",
  iss: "auth.service.com"
};

Множественная аудитория:

const payload = {
  aud: ["api.service.com", "mobile.app"]
};

Проверка:

const decoded = KJUR.jws.JWS.parse(jwt).payloadObj;

const isAudienceValid =
  decoded.aud === "api.service.com" ||
  (Array.isArray(decoded.aud) && decoded.aud.includes("api.service.com"));

exp (expiration time)

exp определяет момент истечения срока действия токена в формате Unix timestamp (в секундах). После этого времени токен считается недействительным.

Это один из наиболее важных параметров безопасности.

Пример создания токена с ограниченным сроком жизни:

const payload = {
  sub: "user123",
  iat: Math.floor(Date.now() / 1000),
  exp: Math.floor(Date.now() / 1000) + 3600
};

Проверка:

const payloadObj = KJUR.jws.JWS.parse(jwt).payloadObj;

const now = Math.floor(Date.now() / 1000);

if (payloadObj.exp && now > payloadObj.exp) {
  throw new Error("Token expired");
}

Jsrsasign не выполняет автоматическую проверку exp, поэтому логика всегда реализуется вручную.


nbf (not before)

nbf задаёт время, до которого токен считается невалидным. Даже если токен корректно подписан, он не должен использоваться раньше указанного времени.

const payload = {
  sub: "user123",
  nbf: Math.floor(Date.now() / 1000) + 60
};

Это означает, что токен станет активным только через 60 секунд.

Проверка:

const payloadObj = KJUR.jws.JWS.parse(jwt).payloadObj;

const now = Math.floor(Date.now() / 1000);

if (payloadObj.nbf && now < payloadObj.nbf) {
  throw new Error("Token not active yet");
}

nbf часто используется в системах отложенной активации прав доступа или при синхронизации распределённых систем.


iat (issued at)

iat фиксирует момент выдачи токена. Это базовый claim, который помогает отслеживать возраст токена и предотвращать повторное использование старых токенов.

const payload = {
  sub: "user123",
  iat: Math.floor(Date.now() / 1000)
};

Используется для:

  • анализа времени жизни токена
  • отладки
  • построения систем ротации токенов

Проверка:

const payloadObj = KJUR.jws.JWS.parse(jwt).payloadObj;

const age = Math.floor(Date.now() / 1000) - payloadObj.iat;

jti (JWT ID)

jti — уникальный идентификатор токена. Используется для предотвращения повторного использования (replay attacks) и для возможности отзыва конкретного токена.

Обычно генерируется как UUID или случайная строка.

const payload = {
  sub: "user123",
  iat: Math.floor(Date.now() / 1000),
  jti: "8f14e45f-ea9b-4c3d-9f2a-1c2d9a8b7c11"
};

Проверка уникальности требует серверного хранилища:

const payloadObj = KJUR.jws.JWS.parse(jwt).payloadObj;

if (isTokenRevoked(payloadObj.jti)) {
  throw new Error("Token revoked");
}

jti особенно важен в системах с refresh-токенами и blacklist-механизмами.


Стандартные claims формируют структуру доверия в JWT. В Jsrsasign они не обрабатываются автоматически на уровне бизнес-логики, но предоставляют основу, на которой строится проверка подписи, контроль доступа и управление жизненным циклом токена.