KJUR.jws.JWS является центральным классом библиотеки jsrsasign для работы с JSON Web Signature (JWS). Он реализует создание, разбор, проверку и управление цифровыми подписями в формате JWS, определённом спецификацией RFC 7515. Класс предоставляет высокоуровневый API поверх криптографических примитивов библиотеки и скрывает большую часть низкоуровневой работы с кодированием, сериализацией и криптографическими операциями.
JWS представляет собой компактную строку, состоящую из трёх частей:
BASE64URL(header) + "." + BASE64URL(payload) + "." + BASE64URL(signature)
Пример структуры:
eyJalg...header...XQ.eyJzdWIiOiIxMjM0NTY3ODkwIn0.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
Класс KJUR.jws.JWS отвечает за:
Класс работает в связке с:
Основной способ создания JWS — метод sign.
KJUR.jws.JWS.sign(
alg, // алгоритм подписи
header, // объект или JSON строка
payload, // данные
key // ключ (секрет или приватный ключ)
)
const jws = KJUR.jws.JWS.sign(
"HS256",
{ alg: "HS256", typ: "JWT" },
JSON.stringify({ sub: "1234567890", name: "Ivan", admin: true }),
"secret123"
);
В этом случае используется симметричный ключ, одинаковый для подписи и проверки.
const jws = KJUR.jws.JWS.sign(
"RS256",
{ alg: "RS256", typ: "JWT" },
JSON.stringify({ sub: "user1" }),
privateKeyPEM
);
Проверка подписи осуществляется методом verify.
KJUR.jws.JWS.verify(jwsString, key)
const isValid = KJUR.jws.JWS.verify(jws, "secret123");
const isValid = KJUR.jws.JWS.verify(jws, publicKeyPEM);
Метод parse или parseJWS позволяет извлечь
компоненты токена.
const parsed = KJUR.jws.JWS.parse(jwsString);
Структура результата:
{
headerObj: {...},
payloadObj: {...},
sighex: "...",
sHeader: "...",
sPayload: "..."
}
Метод позволяет разделить JWS на части:
const components = KJUR.jws.JWS.parseJWS(jws);
Результат:
[
"header(base64url)",
"payload(base64url)",
"signature(base64url)"
]
Расширенный метод проверки:
KJUR.jws.JWS.verifyJWS(jws, key)
Отличие от verify заключается в более строгой обработке
структуры и возможности работы с дополнительными параметрами.
Класс поддерживает широкий набор алгоритмов:
Header может задаваться как объект:
{
alg: "HS256",
typ: "JWT"
}
Или как JSON строка:
'{"alg":"HS256","typ":"JWT"}'
При создании JWS библиотека автоматически кодирует header в Base64URL.
Payload может быть:
Пример:
JSON.stringify({
iss: "auth-server",
exp: 1710000000,
sub: "user123"
});
При работе с KJUR.jws.JWS возможны типовые ошибки:
Пример обработки:
try {
const valid = KJUR.jws.JWS.verify(jws, "secret");
} catch (e) {
console.log("Ошибка проверки:", e);
}
При создании подписи выполняются шаги:
сериализация header и payload
Base64URL кодирование
формирование signing input:
base64url(header) + "." + base64url(payload)применение алгоритма подписи
кодирование signature в Base64URL
const secret = "my_secret_key";
const token = KJUR.jws.JWS.sign(
"HS256",
{ alg: "HS256", typ: "JWT" },
JSON.stringify({ user: "admin" }),
secret
);
const isValid = KJUR.jws.JWS.verify(token, secret);
const token = KJUR.jws.JWS.sign(
"RS256",
{ alg: "RS256", typ: "JWT" },
JSON.stringify({ role: "user" }),
privateKeyPEM
);
const valid = KJUR.jws.JWS.verify(token, publicKeyPEM);
KJUR.jws.JWS использует Base64URL вместо стандартного Base64:
+ заменяется на -/ заменяется на _= удаляетсяЭто обеспечивает совместимость с JWT-стандартом и URL-безопасность.
Класс позволяет работать с уже разобранными частями токена:
const components = KJUR.jws.JWS.parseJWS(jws);
const header = KJUR.jws.JWS.readSafeJSONString(
KJUR.b64utos(components[0])
);
Использование JWS как JWT для передачи идентификаторов пользователя.
Передача ролей и прав доступа через payload.
Проверка подписи входящих запросов.
Гарантия целостности передаваемых данных.
exp)KJUR.jws.JWS тесно связан с:
При разборе JWS внутренние структуры выглядят как:
{
headerS: "...",
payloadS: "...",
signatureS: "...",
headerObj: {...},
payloadObj: {...}
}
JWS допускает произвольные payload, включая бинарные данные (в виде строки):
const payload = "raw_data_block";
Однако большинство сценариев ориентированы на JSON.