JWK (JSON Web Key) представляет собой стандартизированное JSON-представление криптографического ключа. В экосистеме JavaScript и библиотеки Jsrsasign JWK используется для обмена ключами между сервисами, хранения публичных и приватных ключей в структурированном виде и интеграции с JWT, JWS и JWE.
Основная идея JWK заключается в том, чтобы описывать ключ не в бинарной форме (как PEM или DER), а в виде JSON-объекта, пригодного для передачи по HTTP, хранения в конфигурациях и использования в веб-приложениях.
JWK всегда представляет собой JSON-объект с набором обязательных и дополнительных полей. Минимальная структура зависит от типа ключа, но общий шаблон выглядит следующим образом:
{
"kty": "RSA",
"kid": "key-id-123",
"use": "sig",
"alg": "RS256"
}
Каждое поле имеет строго определённое назначение и влияет на то, как ключ будет использоваться в криптографических операциях.
kty — обязательное поле, определяющее тип
криптографического ключа.
Наиболее распространённые значения:
RSA — асимметричные RSA ключиEC — эллиптические кривыеoct — симметричные ключи (HMAC, AES)Пример:
{
"kty": "EC"
}
Значение kty определяет набор обязательных параметров,
которые должны присутствовать в объекте JWK. Например, для RSA требуются
n и e, а для EC — crv,
x, y.
kid — идентификатор ключа. Используется для выбора
конкретного ключа из набора (JWKS).
{
"kid": "auth-key-2026-01"
}
В системах с ротацией ключей kid играет ключевую роль:
он позволяет серверу выбрать правильный публичный ключ для проверки
подписи JWT.
use определяет назначение ключа:
sig — для подписи и проверки подписиenc — для шифрования{
"use": "sig"
}
Это поле не является строго обязательным, но широко используется для фильтрации ключей в JWKS.
alg задаёт алгоритм, с которым ключ предназначен
работать.
Примеры:
RS256 — RSA + SHA-256ES256 — ECDSA + SHA-256HS256 — HMAC + SHA-256{
"alg": "RS256"
}
В Jsrsasign это поле часто используется как подсказка при выборе алгоритма подписи или проверки JWT.
RSA-ключи требуют дополнительных параметров:
n — модуль (modulus)e — экспонента (public exponent)d — приватная экспонента (только для приватных
ключей)Пример публичного RSA JWK:
{
"kty": "RSA",
"kid": "rsa-1",
"use": "sig",
"n": "base64url-modulus",
"e": "AQAB"
}
Приватный RSA JWK:
{
"kty": "RSA",
"kid": "rsa-1",
"d": "base64url-private-exponent",
"n": "base64url-modulus",
"e": "AQAB"
}
n и e всегда присутствуют в публичной
частиd присутствует только в приватнойДля ключей на эллиптических кривых используются следующие поля:
crv — кривая (например, P-256)x — координата Xy — координата Yd — приватное значение (если ключ приватный)Пример:
{
"kty": "EC",
"crv": "P-256",
"kid": "ec-key-1",
"x": "base64url-x",
"y": "base64url-y"
}
Приватный вариант:
{
"kty": "EC",
"crv": "P-256",
"x": "base64url-x",
"y": "base64url-y",
"d": "base64url-private"
}
Тип oct используется для симметричных алгоритмов,
например HMAC или AES.
Основное поле:
k — ключ в Base64URLПример:
{
"kty": "oct",
"k": "base64url-secret-key",
"use": "sig",
"alg": "HS256"
}
В отличие от RSA и EC, здесь нет разделения на публичную и приватную часть, так как ключ один и тот же для подписи и проверки.
key_ops определяет допустимые операции с ключом:
signverifyencryptdecryptwrapKeyunwrapKeyПример:
{
"key_ops": ["sign", "verify"]
}
Это поле более строгое, чем use, так как явно
перечисляет разрешённые действия.
x5c содержит цепочку сертификатов X.509 в формате
Base64.
{
"x5c": [
"MIIC...base64cert..."
]
}
Используется для доверенной валидации ключей в корпоративных системах.
Эти поля представляют отпечаток сертификата:
x5t — SHA-1 thumbprintx5t#S256 — SHA-256 thumbprint{
"x5t#S256": "base64url-thumbprint"
}
Они используются для быстрого сопоставления сертификатов без полного разбора цепочки.
JWK часто используется не по одному ключу, а в виде набора — JWKS (JSON Web Key Set).
Структура JWKS:
{
"keys": [
{
"kty": "RSA",
"kid": "key-1",
"n": "...",
"e": "AQAB"
},
{
"kty": "EC",
"kid": "key-2",
"crv": "P-256",
"x": "...",
"y": "..."
}
]
}
JWKS используется в системах авторизации (OAuth2, OpenID Connect) для динамической загрузки публичных ключей.
В библиотеке Jsrsasign JWK активно используется для:
Пример использования:
const rsaKey = KEYUTIL.getKey(jwkObject);
Jsrsasign автоматически интерпретирует поля JWK и преобразует их в внутренний формат ключа.
Все бинарные данные в JWK кодируются в Base64URL:
=+ → -/ → _Это критично для корректной работы с веб-протоколами.
Корректный JWK должен:
ktyuse, alg,
key_ops не должны противоречить друг другу)Нарушение этих правил приводит к ошибкам при импорте ключа в Jsrsasign или при проверке JWT.
JWK напрямую используется для:
В типичном сценарии:
kidЭта схема позволяет безопасно обновлять ключи без остановки сервиса.