В чем разница JWT и других токенов для передачи чувствительных данных
Что проверяют
Главное, что хотят услышать: обычный JWT подписан, но не зашифрован, и прочитать его содержимое может любой. Аналитику это нужно, чтобы правильно описывать интеграции и не заложить утечку прямо в требования. Следом обычно спрашивают, как отозвать JWT до истечения срока.
Как отвечать
Разведите понятия, которые часто смешивают:
- JWT (JWS): три части в base64url: заголовок, полезная нагрузка с claims и подпись (
HS256,RS256,ES256). Подпись защищает от подделки, но payload декодируется за секунду любым декодером. Сервис проверяет токен сам, без запроса в хранилище, это удобно для микросервисов; - JWE: зашифрованный вариант, содержимое скрыто. Встречается реже и сложнее в поддержке;
- opaque token: случайная строка без смысла, данные лежат на сервере. Проверяется запросом в хранилище или через introspection endpoint (RFC 7662). Такой токен легко отозвать, и в нём нечего прочитать;
- сессионная кука: тот же непрозрачный идентификатор, но в cookie с флагами
HttpOnly,Secure,SameSite, что закрывает доступ к нему из JavaScript.
OAuth 2.0 и OpenID Connect это протоколы, а не тип токена: access token в них бывает и JWT, и opaque, а ID token в OIDC всегда JWT.
Отсюда вывод: чувствительные данные (паспорт, номер карты, диагноз) в токен не кладут вообще. В JWT идут идентификатор пользователя, роли, exp, iss, aud, а сами данные сервис получает по API через TLS с проверкой прав. Если нужны и отзыв, и скорость, делают короткий срок жизни access token, refresh token и шлюз, который меняет внешний opaque-токен на внутренний JWT. В требованиях аналитик фиксирует состав claims, сроки жизни и сценарий отзыва.
Где спотыкаются
Говорят, что JWT «шифрует данные». Это подпись, а не шифрование, и base64 любой прочитает без ключа.
Называют OAuth видом токена наравне с JWT. OAuth описывает, как выдать доступ, а формат токена выбирает сервер авторизации.
Считают JWT stateless без оговорок и не знают, как его отозвать. Мгновенный отзыв требует денайлиста или очень короткого срока жизни, то есть частичного возврата к состоянию на сервере.