В библиотеке jose работа с JWT строится вокруг формирования набора стандартных и пользовательских клеймов (claims), которые затем включаются в подписываемый токен. Методы setIssuedAt, setNotBefore, setIssuer, setSubject, setAudience и setJti используются при построении полезной нагрузки токена через SignJWT и позволяют точно управлять семантикой и жизненным циклом JWT.
Метод setIssuedAt() добавляет в токен стандартный клейм
iat (issued at) — момент времени, когда токен был
выдан.
import { SignJWT } from 'jose';
const jwt = await new SignJWT({ role: 'admin' })
.setIssuedAt()
.sign(key);
.setIssuedAt(1710000000)
iat используется для:
Метод setNotBefore() задаёт клейм nbf (not
before), который определяет момент, до которого токен считается
недействительным.
const jwt = await new SignJWT({ role: 'user' })
.setNotBefore('10m')
.sign(key);
Поддерживаются несколько вариантов:
абсолютное время (timestamp)
относительное время в формате временных интервалов:
"10s""5m""2h"Если текущее время меньше nbf, библиотека при валидации
токена будет считать его недействительным, даже при корректной
подписи.
Метод setIssuer() задаёт клейм iss
(issuer), идентифицирующий эмитента токена.
const jwt = await new SignJWT({ role: 'user' })
.setIssuer('auth-service')
.sign(key);
iss используется для:
При верификации можно требовать совпадение issuer:
jwtVerify(token, key, {
issuer: 'auth-service'
});
Несовпадение приводит к ошибке валидации.
Метод setSubject() формирует клейм sub
(subject), который описывает субъект токена.
const jwt = await new SignJWT({ role: 'user' })
.setSubject('user:12345')
.sign(key);
sub обычно используется для:
Часто используется формат с неймспейсом:
user:123service:billingdevice:mobile:abcЭто снижает риск коллизий между типами сущностей.
Метод setAudience() задаёт клейм aud
(audience), который определяет целевую аудиторию токена.
const jwt = await new SignJWT({ role: 'user' })
.setAudience('api-service')
.sign(key);
.setAudience(['api-service', 'analytics-service'])
aud используется для:
jwtVerify(token, key, {
audience: 'api-service'
});
При несовпадении аудитории токен считается недействительным.
Метод setJti() задаёт клейм jti (JWT ID) —
уникальный идентификатор токена.
const jwt = await new SignJWT({ role: 'user' })
.setJti('550e8400-e29b-41d4-a716-446655440000')
.sign(key);
jti используется для:
Обычно используется UUID или аналогичный уникальный идентификатор.
Пример генерации:
import { randomUUID } from 'crypto';
.setJti(randomUUID())
При хранении активных сессий jti позволяет:
Все перечисленные методы обычно используются в цепочке при создании токена:
const jwt = await new SignJWT({ role: 'admin' })
.setIssuer('auth-service')
.setSubject('user:123')
.setAudience('api-service')
.setIssuedAt()
.setNotBefore('0s')
.setJti(randomUUID())
.sign(key);
Такая конфигурация формирует строго определённый контекст токена, где каждый клейм отвечает за отдельный аспект:
При валидации библиотека jose учитывает эти поля через
jwtVerify, где можно явно задать ожидаемые значения:
jwtVerify(token, key, {
issuer: 'auth-service',
audience: 'api-service'
});
iat, nbf и exp (если
используется) проверяются автоматически при включённых проверках
времени.
В типичной архитектуре:
iss фиксирует сервис авторизацииsub связывает токен с пользователемaud ограничивает сервисы потребленияiat фиксирует момент выпускаnbf управляет задержкой активацииjti обеспечивает уникальность и контроль сессийЭти клеймы образуют базовую структуру безопасного JWT, вокруг которой строится вся логика авторизации в приложениях, использующих jose.