JSON Web Key представляет собой стандартизированное JSON-представление криптографических ключей, используемое в Web Crypto API и экосистеме JOSE (JSON Object Signing and Encryption). Основная цель формата — обеспечить переносимость ключей между различными системами, протоколами и библиотеками без привязки к бинарным форматам.
JWK всегда представляет один ключ и состоит из набора обязательных и опциональных полей, которые зависят от типа криптографического алгоритма.
Базовая структура:
{
"kty": "RSA",
"kid": "key-id",
"use": "sig",
"key_ops": ["sign", "verify"],
"alg": "RS256",
"ext": true
}
Каждое поле несёт строго определённую семантику и участвует в интерпретации ключа криптографическими системами.
kty определяет тип криптографического ключа и является
обязательным.
Основные значения:
RSA — RSA-ключиEC — эллиптические кривые (Elliptic Curve)oct — симметричные ключи (octet sequence)Пример:
"kty": "RSA"
Тип ключа определяет набор обязательных дополнительных параметров. Например, RSA требует модуль и экспоненту, EC — параметры кривой и координаты точки.
use описывает предполагаемое назначение ключа.
Возможные значения:
sig — подпись (sign/verify)enc — шифрование (encrypt/decrypt)Пример:
"use": "sig"
Поле носит рекомендательный характер и используется для фильтрации ключей в наборах JWK.
key_ops задаёт допустимые операции с ключом. В отличие
от use, это более точная декларация разрешённых
действий.
Возможные значения:
signverifyencryptdecryptwrapKeyunwrapKeyderiveKeyderiveBitsПример:
"key_ops": ["sign", "verify"]
В Web Crypto API это поле напрямую соотносится с параметром
keyUsages при импорте/экспорте ключей.
alg указывает криптографический алгоритм, для которого
предназначен ключ.
Примеры:
RS256 — RSA с SHA-256ES256 — ECDSA с P-256 и SHA-256A256GCM — AES-GCM с 256-битным ключомПример:
"alg": "RS256"
Поле используется для предотвращения неправильного применения ключа в несовместимых алгоритмах.
kid — идентификатор ключа, используемый для выбора ключа
из набора (JWK Set).
Пример:
"kid": "2026-01-signing-key"
kid особенно важен в системах с ротацией ключей, где
одновременно существует несколько активных ключей.
ext определяет, можно ли извлекать ключ из
криптографического контекста.
true — ключ можно экспортироватьfalse — ключ неэкспортируемыйПример:
"ext": true
В Web Crypto API соответствует параметру extractable при
генерации ключа.
Для симметричных ключей используется поле k, содержащее
секрет в формате base64url.
{
"kty": "oct",
"k": "mF7u9sQpZl8k3v..."
}
k — это бинарные данные ключа, закодированные в
base64url без padding.
Используется в алгоритмах:
RSA JWK требует набора обязательных параметров.
n — модуль (modulus)e — публичная экспонентаd — приватная экспонента (только для приватного
ключа){
"kty": "RSA",
"n": "0vx7agoebGcQSuuPiLJXZptN9n...",
"e": "AQAB",
"alg": "RS256",
"use": "sig",
"kid": "rsa-key-1"
}
{
"kty": "RSA",
"n": "0vx7agoebGcQSuuPiLJXZptN9n...",
"e": "AQAB",
"d": "X4cTteJY_gn4FYPsXB8y...",
"p": "83i-7IvMGXoMXCskv73TKrB...",
"q": "3dfOR9cuYq-0S-3XbP8x...",
"dp": "G4sPXkc6Ya9y8oR...",
"dq": "s9lAH9fggBsoFR...",
"qi": "GyM_p6JrXyS2...",
"alg": "RS256",
"ext": true
}
CRT-параметры (p, q, dp,
dq, qi) ускоряют операции дешифрования и
подписи.
Ключи на эллиптических кривых используют координаты точки на кривой.
crv — кривая (curve)x — координата Xy — координата Yd — приватный скаляр (для приватного ключа){
"kty": "EC",
"crv": "P-256",
"x": "f83OJ3D2xF4Fh3Q...",
"y": "x_FEzRu9Yd4T6K...",
"use": "sig",
"alg": "ES256"
}
{
"kty": "EC",
"crv": "P-256",
"x": "f83OJ3D2xF4Fh3Q...",
"y": "x_FEzRu9Yd4T6K...",
"d": "NzbLSX7aGQ...",
"alg": "ES256",
"ext": true
}
Поддерживаемые кривые в Web Crypto API:
P-256P-384P-521Все бинарные данные в JWK кодируются в base64url без padding.
Особенности base64url:
+ заменяется на -/ заменяется на _= удаляетсяЭто обеспечивает безопасное использование ключей в URL и JSON без экранирования.
Несколько ключей группируются в структуру JWK Set:
{
"keys": [
{
"kty": "RSA",
"n": "...",
"e": "AQAB",
"kid": "key-1"
},
{
"kty": "EC",
"crv": "P-256",
"x": "...",
"y": "...",
"kid": "key-2"
}
]
}
JWK Set используется в:
В Web Crypto API JWK используется для:
importKey()exportKey()Пример импорта:
crypto.subtle.importKey(
"jwk",
jwk,
{ name: "RSA-PSS", hash: "SHA-256" },
true,
["sign"]
);
Экспорт:
crypto.subtle.exportKey("jwk", key);
alg, use) не влияют на
криптографическую операцию, но используются для метаданныхCryptoKeyЕсли alg не соответствует параметрам
importKey, импорт может завершиться ошибкой.
Обычный base64 без преобразования приводит к некорректным значениям
n, e, x, y,
k.
n или e недопустимcrv, x, y считается
неполнымk невозможенПри обработке JWK обычно выполняется логическая валидация:
kty и набора полейkey_ops и usealg с Web Crypto API{
"kty": "RSA",
"n": "...",
"e": "AQAB"
}
{
"kty": "EC",
"crv": "P-256",
"x": "...",
"y": "..."
}
{
"kty": "oct",
"k": "base64url-value"
}