jwtDecrypt выполняет расшифровку и проверку JWE (JSON Web Encryption) токенов в формате компактной сериализации, обеспечивая восстановление исходного полезного payload после криптографической обработки и одновременно проверяя корректность структуры токена и применённых алгоритмов.
В библиотеке jose этот механизм встроен в общий стек работы с JWT/JWS/JWE и опирается на строгую типизацию входных данных, поддержку современных криптографических алгоритмов и безопасное управление ключами.
JWE в компактном виде представляет собой строку из пяти частей:
Каждая часть кодируется в base64url и разделяется точками.
jwtDecrypt принимает такую строку и выполняет последовательность операций:
В jose функция используется следующим образом:
import { jwtDecrypt } from 'jose'
Основной формат вызова:
const result = await jwtDecrypt(jwt, key, options)
Где:
jwt — строка JWE в compact форматеkey — ключ расшифровки (KeyLike объект или JWK)options — дополнительные параметры валидацииjwtDecrypt работает только с симметричными или асимметричными ключами, совместимыми с алгоритмами JWE:
Ключ может быть представлен в нескольких формах:
Пример импорта JWK:
import { importJWK } from 'jose'
const key = await importJWK(jwk, 'RSA-OAEP-256')
Внутри jwtDecrypt выполняются строго последовательные шаги:
Токен делится на 5 сегментов. При несоответствии формату выполнение прерывается.
Извлекается JOSE header, где проверяются:
Особое значение имеет enc, например:
Если алгоритм не входит в список разрешённых, операция отклоняется.
С использованием переданного ключа выполняется:
Используется AES-GCM или CBC + HMAC в зависимости от enc.
Authentication tag проверяется до возврата результата. Любое несоответствие означает нарушение целостности данных.
Функция возвращает объект:
{
payload: Uint8Array | string,
protectedHeader: object,
key: CryptoKey
}
payload обычно преобразуется в JSON объект:
const { payload, protectedHeader } = await jwtDecrypt(jwt, key)
const data = JSON.parse(new TextDecoder().decode(payload))
jwtDecrypt не ограничивается только криптографией. Дополнительно может выполняться проверка claims:
Пример использования проверки:
const { payload } = await jwtDecrypt(jwt, key, {
issuer: 'auth-service',
audience: 'api-service'
})
Если хотя бы одно условие нарушено, выбрасывается ошибка.
jwtDecrypt генерирует строго типизированные ошибки:
Каждая ошибка отражает конкретный этап процесса:
Пример обработки:
try {
await jwtDecrypt(jwt, key)
} catch (e) {
if (e.code === 'ERR_JWE_DECRYPTION_FAILED') {
// некорректный токен или ключ
}
}
При использовании ECDH-ES ключи согласовываются динамически:
jwtDecrypt автоматически обрабатывает этот процесс через Web Crypto API.
Часто ключи берутся из JWKS (JSON Web Key Set):
import { createRemoteJWKSet } from 'jose'
const JWKS = createRemoteJWKSet(new URL('https://example.com/.well-known/jwks.json'))
const { payload } = await jwtDecrypt(jwt, JWKS)
В этом случае библиотека автоматически:
При работе jwtDecrypt учитываются критические принципы:
В jose существует также функция decrypt, которая работает с чистым JWE.
jwtDecrypt отличается тем, что:
В прикладной архитектуре jwtDecrypt используется в цепочке:
В современных версиях jose используется Web Crypto API:
Это обеспечивает единый криптографический слой без зависимости от node-forge или legacy библиотек.
Производительность jwtDecrypt зависит от:
ECDH-ES и AES-GCM считаются наиболее оптимальными для высоконагруженных систем.
import { jwtDecrypt, importJWK } from 'jose'
const key = await importJWK(jwk, 'A256GCM')
const { payload } = await jwtDecrypt(token, key, {
issuer: 'auth-server',
audience: 'service-api'
})
const data = JSON.parse(new TextDecoder().decode(payload))
Данный поток объединяет:
Любое нарушение целостности приводит к немедленному прекращению операции:
plaintext не возвращается ни при каких условиях до успешной проверки integrity.