Заголовок alg решает всё

Заголовок называет алгоритм, которым он подписан, например "alg": "HS256". Это единственное значение определяет, какой ключ нужен проверяющему и что подпись на самом деле доказывает. Алгоритмы делятся на два семейства, симметричное и асимметричное, и выбор между ними — это по сути выбор о том, кому нужно проверять токен.

Симметричное: семейство HMAC (HS256/384/512)

HS256, HS384 и HS512 — это с , SHA-384 или SHA-512. Они используют один общий секрет и для подписи, и для проверки. Кто может проверить токен , тот может и подделать его, потому что создание и сверка подписи используют один и тот же ключ.

Это делает семейство HMAC хорошим выбором, когда одна и та же сторона выпускает и проверяет токен, или когда издатель и проверяющий уже разделяют доверенный секрет, например один бэкенд, подписывающий собственные токены сессии. Оно быстро и просто. Его предел — распределение: каждому проверяющему нужен секрет, и чем в большем числе мест живёт секрет, тем больше радиус поражения, если один утечёт.

Асимметричное: RSA и ECDSA (RS256, ES256 и другие)

RS256 (RSASSA-PKCS1-v1_5 с SHA-256), PS256 () и ES256 ( с кривой P-256) используют пару ключей: приватный ключ подписывает, а соответствующий открытый ключ проверяет. Приватный ключ никогда не покидает издателя; открытый ключ можно вручить кому угодно.

Это то, что вам нужно, когда много независимых сервисов должны проверять токены от одного издателя. Провайдер идентичности подписывает своим приватным ключом и публикует свои открытые ключи (обычно как эндпоинт ); каждый нижестоящий сервис проверяет открытым ключом, и ни один из них не может чеканить токены. Вот почему провайдеры OpenID Connect по умолчанию выпускают ID-токены или .

Между и ECDSA компромисс — размер и скорость: ключи и подписи ECDSA гораздо меньше при эквивалентной безопасности, тогда как RSA старше и поддерживается более универсально. EdDSA (Ed25519) — современная быстрая альтернатива, набирающая распространение.

Выбор

  • Одна сторона подписывает и проверяет, или секрет уже общийHMAC (HS256). Просто и быстро.
  • Один подписывающий, много независимых проверяющих → асимметричное (RS256 или ES256). Открытый ключ можно распространять свободно; подписать может только держатель приватного ключа.

Что бы вы ни выбрали, проверяющий должен закрепить приемлемый алгоритм, а не доверять собственному заголовку alg токена. Принимать всё, что заявляет токен, открывает дверь к атакам alg: none и путаницы алгоритмов, описанным в статье об анатомии JWT.

Инструмент JWT декодирует заголовок, чтобы вы видели, какой алгоритм объявляет токен, и проверяет семейство HMAC (HS256/384/512) против секрета, который вы вставляете, локально в вашем браузере.