Заголовок 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) против секрета, который вы вставляете, локально в вашем браузере.