Библиотека JOSE (JSON Object Signing and Encryption) в JavaScript представляет собой реализацию набора криптографических стандартов, предназначенных для работы с подписанными и зашифрованными JSON-структурами. Основная задача этой экосистемы — обеспечение целостности, аутентичности и конфиденциальности данных при их передаче между сервисами.
При разработке современных веб-приложений часто возникает необходимость безопасной передачи информации между клиентом и сервером или между микросервисами. Обычная JSON-структура не предоставляет механизмов защиты от подмены или чтения третьими лицами.
Типичные проблемы:
JOSE решает эти задачи через стандартизированный подход к подписи, шифрованию и описанию ключей.
JOSE — это не одна технология, а набор спецификаций, объединённых в единый криптографический стек:
Эти стандарты описаны в RFC 7515–7518 и используются в системах авторизации, таких как OAuth 2.0 и OpenID Connect.
JWS используется для проверки того, что данные не были изменены и действительно созданы доверенной стороной. Чаще всего применяется для токенов доступа.
Структура JWS состоит из трёх частей:
Пример логики формирования:
import { SignJWT } from 'jose'
const token = await new SignJWT({ userId: 123 })
.setProtectedHeader({ alg: 'HS256' })
.setIssuedAt()
.setExpirationTime('2h')
.sign(secretKey)
Подпись гарантирует, что содержимое токена не может быть изменено без знания секретного ключа.
JWE используется, когда необходимо скрыть содержимое сообщения, а не только защитить его от изменений.
В отличие от JWS, здесь payload становится недоступным без ключа расшифровки.
import { EncryptJWT } from 'jose'
const encrypted = await new EncryptJWT({ cardNumber: '1234-5678-xxxx' })
.setProtectedHeader({ alg: 'dir', enc: 'A256GCM' })
.setIssuedAt()
.encrypt(secretKey)
JWE особенно важен при работе с персональными данными, финансовой информацией и внутренними API.
JWK описывает криптографические ключи в JSON-формате. Это упрощает обмен ключами между сервисами и системами авторизации.
Пример структуры:
{
"kty": "oct",
"k": "base64encodedsecret",
"alg": "HS256",
"use": "sig"
}
В JavaScript библиотека JOSE позволяет импортировать и использовать такие ключи напрямую:
import { importJWK } from 'jose'
const key = await importJWK(jwk, 'HS256')
Современная библиотека jose является одной из наиболее
полных реализаций JOSE-стека в экосистеме Node.js и браузера. Она
ориентирована на работу с современными стандартами Web Crypto API и
поддерживает как симметричную, так и асимметричную криптографию.
Основные возможности:
Библиотека реализует широкий набор алгоритмов из JWA:
Выбор алгоритма зависит от требований к безопасности и архитектуры системы.
Наиболее частый сценарий использования — работа с JWT.
Создание токена:
import { SignJWT } from 'jose'
const jwt = await new SignJWT({ role: 'admin' })
.setProtectedHeader({ alg: 'HS256' })
.setSubject('user123')
.setExpirationTime('1h')
.sign(secretKey)
Проверка токена:
import { jwtVerify } from 'jose'
const { payload } = await jwtVerify(token, secretKey)
Если подпись или срок действия недействительны, будет выброшена ошибка.
В более сложных системах используются пары ключей: приватный и публичный.
Подпись выполняется приватным ключом:
const token = await new SignJWT({ id: 1 })
.setProtectedHeader({ alg: 'RS256' })
.sign(privateKey)
Проверка — публичным:
await jwtVerify(token, publicKey)
Такой подход широко используется в микросервисной архитектуре, где один сервис подписывает токены, а другие только проверяют их.
Особенность библиотеки jose заключается в том, что она построена поверх Web Crypto API. Это означает:
Ключи могут быть импортированы напрямую из стандартных форматов, включая PEM и JWK.
JOSE используется в:
Основная ценность заключается в стандартизации: разные сервисы могут безопасно обмениваться данными, не договариваясь о собственных форматах подписи или шифрования.
Криптография в JOSE требует строгого управления ключами:
Ошибки в управлении ключами приводят к компрометации всей системы, даже при использовании корректных алгоритмов.