Подписанный JWT (JWS) и зашифрованный JWT (JWE) решают разные задачи и часто путаются, хотя на уровне использования в JavaScript через библиотеку Jose они выглядят схожими по форме — компактная строка из нескольких частей.
Подписанный JWT (JSON Web Signature) предназначен для обеспечения целостности данных и аутентичности источника. Он не скрывает содержимое токена.
JWT в формате JWS состоит из трёх частей:
Формат:
xxxxx.yyyyy.zzzzz
Подпись решает две задачи:
При этом содержимое payload остаётся открытым. Любой может декодировать base64url и увидеть данные:
Библиотека Jose реализует JWS через модуль
jose/jwt/sign.
Типичные алгоритмы:
Пример логики:
import { SignJWT } from 'jose'
const jwt = await new SignJWT({ userId: 123 })
.setProtectedHeader({ alg: 'HS256' })
.setExpirationTime('2h')
.sign(secretKey)
Важно: секрет или приватный ключ участвует только в создании подписи, но не скрывает данные.
Зашифрованный JWT (JSON Web Encryption) решает другую задачу — конфиденциальность данных.
В отличие от JWS, здесь payload недоступен без ключа.
Структура JWE включает 5 частей:
header.encryptedKey.iv.ciphertext.tag
JWE обеспечивает:
Даже если токен перехвачен, его содержимое невозможно восстановить без ключа.
Jose реализует JWE через jose/jwt/encrypt.
Типичные алгоритмы:
Пример:
import { EncryptJWT } from 'jose'
const jwt = await new EncryptJWT({ userId: 123 })
.setProtectedHeader({ alg: 'RSA-OAEP', enc: 'A256GCM' })
.setExpirationTime('2h')
.encrypt(publicKey)
Здесь используется публичный ключ для шифрования, а приватный — для расшифровки.
Подпись и шифрование решают разные задачи и не заменяют друг друга.
Типичный кейс: фронтенд может видеть payload, но не может его подделать.
Распространённая ошибка — хранить чувствительные данные (например, паспортные данные) в подписанном токене. Подпись не защищает от чтения.
Base64 не является шифрованием. В JWS payload читается мгновенно.
Иногда применяют оба подхода:
Это даёт:
Но увеличивает сложность и размер токена.
В библиотеке Jose эти два мира строго разделены:
jose/jwt/sign → JWSjose/jwt/encrypt → JWEОни используют разные криптографические примитивы и разные форматы сериализации.
JWS ориентирован на компактность и скорость. JWE — на безопасность данных даже в недоверенной среде.
Разделение этих подходов — ключевой момент при проектировании безопасных систем аутентификации и обмена данными в JavaScript-экосистеме с использованием Jose.