Модуль JWT в библиотеке jsrsasign предназначен для создания, подписи, верификации и декодирования JSON Web Token. Внутри он опирается на криптографические примитивы (RSA, ECDSA, HMAC) и стандарты JOSE (JSON Object Signing and Encryption).
JWT состоит из трёх частей:
Формат:
base64url(header) + "." + base64url(payload) + "." + base64url(signature)
В jsrsasign работа с JWT сосредоточена в пространстве имён
KJUR.jws.
Основной метод:
KJUR.jws.JWS.sign(alg, header, payload, key, pass)
Параметры:
alg — алгоритм подписи (например, HS256, RS256,
ES256)header — JSON-строка заголовкаpayload — JSON-строка данныхkey — секрет (для HMAC) или приватный ключ (для
RSA/ECDSA)pass — пароль ключа (если используется защищённый
PEM)Пример HMAC (HS256):
const header = JSON.stringify({ alg: "HS256", typ: "JWT" });
const payload = JSON.stringify({ sub: "user123", iat: 1710000000 });
const token = KJUR.jws.JWS.sign("HS256", header, payload, "secret");
Пример RSA (RS256):
const privateKey = `-----BEGIN PRIVATE KEY-----
...
-----END PRIVATE KEY-----`;
const token = KJUR.jws.JWS.sign(
"RS256",
JSON.stringify({ alg: "RS256", typ: "JWT" }),
JSON.stringify({ iss: "issuer", exp: 1710003600 }),
privateKey
);
Метод:
KJUR.jws.JWS.verify(token, key, acceptAlgs)
Параметры:
token — строка JWTkey — секрет или публичный ключacceptAlgs — массив допустимых алгоритмовПример:
const isValid = KJUR.jws.JWS.verify(token, publicKey, ["RS256"]);
Важно:
acceptAlgsМетод:
KJUR.jws.JWS.parse(token)
Возвращает объект:
{
headerObj: {...},
payloadObj: {...},
sigHex: "...",
headerPP: "...",
payloadPP: "..."
}
Пример:
const parsed = KJUR.jws.JWS.parse(token);
console.log(parsed.payloadObj.sub);
Используется только для чтения, без доверия данным.
Более высокоуровневый API:
KJUR.jws.JWT.verifyJWT(token, key, options)
options может включать:
alg — допустимые алгоритмыiss — ожидаемый issuersub — subjectaud — аудиторияexp — проверка срока действияnbf — not beforeПример:
const isValid = KJUR.jws.JWT.verifyJWT(token, publicKey, {
alg: ["RS256"],
iss: ["issuer"],
verifyAt: KJUR.jws.IntDate.get("now")
});
JWT часто содержит:
iat — время выпускаexp — срок действияnbf — не раньше чемjsrsasign предоставляет утилиту:
KJUR.jws.IntDate.get("now")
Или:
KJUR.jws.IntDate.get("now + 1hour")
Пример генерации payload:
const payload = {
sub: "user",
iat: KJUR.jws.IntDate.get("now"),
exp: KJUR.jws.IntDate.get("now + 1hour")
};
HMAC:
RSA:
ECDSA:
Выбор алгоритма влияет на:
Простой строковый секрет:
const key = "my-secret";
Приватный ключ (подпись):
-----BEGIN PRIVATE KEY-----
Публичный ключ (проверка):
-----BEGIN PUBLIC KEY-----
Аналогично RSA, но ключи в формате EC.
Перед верификацией полезно убедиться, что токен корректен:
KJUR.jws.JWS.parse(token);
Ошибки:
JWT использует base64url вместо стандартного base64:
+ → -/ → _=jsrsasign автоматически обрабатывает это внутри.
Нельзя доверять значению alg из заголовка без
проверки:
KJUR.jws.JWS.verify(token, key, ["RS256"]);
Запрещено:
verify(token, key, null)
Иначе возможна атака подмены алгоритма.
jsrsasign требует строки JSON, но удобно использовать объекты:
const headerObj = { alg: "HS256", typ: "JWT" };
const payloadObj = { user: "admin" };
const token = KJUR.jws.JWS.sign(
"HS256",
JSON.stringify(headerObj),
JSON.stringify(payloadObj),
"secret"
);
Частые ошибки:
unsupported algorithmkey mismatchinvalid signaturemalformed tokenОбработка:
try {
const valid = KJUR.jws.JWS.verify(token, key, ["HS256"]);
} catch (e) {
console.error(e);
}
Пример расширенного payload:
const payload = {
iss: "auth-server",
sub: "user123",
aud: "client-app",
role: "admin",
permissions: ["read", "write"],
iat: KJUR.jws.IntDate.get("now"),
exp: KJUR.jws.IntDate.get("now + 2hour")
};
JWT допускает сложные структуры:
const payload = {
user: {
id: 1,
name: "Alice"
},
meta: {
ip: "127.0.0.1"
}
};
KJUR.jws.JWT.verifyJWT(token, key, {
aud: ["my-app"]
});
Если aud не совпадает — токен считается
недействительным.
Если ключ зашифрован:
KJUR.jws.JWS.sign("RS256", header, payload, privateKey, "password");
exp и nbfМодуль JWT в jsrsasign построен поверх:
KJUR.crypto — криптографияKJUR.jws.JWS — подписиKJUR.jws.JWT — логика проверки claimsРазделение позволяет гибко использовать как низкоуровневые, так и высокоуровневые API.
// 1. Создание
const token = KJUR.jws.JWS.sign(
"HS256",
JSON.stringify({ alg: "HS256", typ: "JWT" }),
JSON.stringify({ sub: "user", iat: KJUR.jws.IntDate.get("now") }),
"secret"
);
// 2. Проверка
const valid = KJUR.jws.JWS.verify(token, "secret", ["HS256"]);
// 3. Чтение
const parsed = KJUR.jws.JWS.parse(token);
Такой цикл охватывает основные операции работы с JWT в jsrsasign.