Nonce представляет собой криптографически случайное или уникальное значение, которое включается в токен и проверяется на стороне получателя для защиты от повторного использования ранее выданных сообщений. В контексте JSON Web Token и спецификаций JOSE этот механизм особенно важен при работе с OpenID Connect и сценариями аутентификации, где токен может быть перехвачен и повторно использован злоумышленником.
Повторная атака возникает в ситуации, когда корректно сформированное сообщение перехватывается и отправляется повторно без изменения его содержимого. В случае JWT это означает возможность повторного использования валидного токена доступа или идентификационного токена для получения несанкционированного доступа к ресурсу.
Типичный сценарий включает:
Основная проблема заключается в том, что стандартная криптографическая подпись JWT (JWS) гарантирует целостность и подлинность, но не гарантирует уникальность использования токена.
Nonce (number used once) добавляется в полезную нагрузку токена и служит маркером одноразового использования. Его основная задача — обеспечить невозможность повторной обработки одного и того же токена в пределах заданного контекста.
В спецификации OpenID Connect nonce применяется преимущественно в ID Token и связывается с исходным запросом авторизации. Значение nonce генерируется на стороне клиента и передаётся в запросе авторизации, после чего включается в ID Token, выдаваемый провайдером идентификации.
При проверке токена значение nonce сравнивается с ранее сохранённым значением. Несовпадение или отсутствие ожидаемого значения рассматривается как признак потенциальной атаки или некорректного потока аутентификации.
Библиотека jose предоставляет высокоуровневые функции для работы с JWT, включая проверку токенов с учётом nonce. При валидации ID Token параметр nonce передаётся в функцию проверки:
Внутри механизма jwtVerify nonce участвует как часть
проверочного контекста:
Такой подход позволяет связать конкретный токен с конкретным запросом, предотвращая повторное использование даже при корректной подписи.
Nonce не заменяет стандартные защитные механизмы JWT, а дополняет их. В комбинации используются следующие поля:
В отличие от jti, который чаще применяется для серверной
дедупликации токенов, nonce ориентирован на связку «запрос–ответ» и чаще
используется в клиентских сценариях, особенно в браузерной
аутентификации.
Эффективность механизма зависит от корректного хранения значения nonce на стороне клиента или сервера авторизации.
Распространённые подходы:
На серверной стороне возможна дополнительная проверка на повторное использование nonce, особенно в высокозащищённых системах. В этом случае nonce сохраняется в базе данных или кэше с ограниченным временем жизни.
Ключевым требованием к nonce является его непредсказуемость. Используются криптографически стойкие генераторы случайных значений. Недопустимо применение детерминированных или повторяемых алгоритмов.
Типичные характеристики корректного nonce:
В Node.js среде часто используется криптографический модуль для генерации значений, совместимых с требованиями безопасности JOSE.
Неправильная реализация механизма приводит к ослаблению защиты:
Также критической ошибкой является использование nonce вместо полноценной серверной защиты от повторных атак в API, где требуется контроль на уровне бизнес-логики.
В процессе проверки токена библиотека jose выполняет последовательность операций:
Nonce в этом контексте выступает дополнительным уровнем контекстной безопасности, не влияющим на криптографическую целостность, но усиливающим защиту от логических атак повторного воспроизведения.
Использование nonce в jose эффективно только в сочетании с общей архитектурной защитой:
В системах с высокой нагрузкой часто применяется гибридный подход, при котором nonce используется для аутентификационного слоя, а jti и серверные механизмы — для API-слоя.
В современных реализациях OpenID Connect nonce стал обязательным элементом защиты implicit и hybrid flow, а также активно используется в authorization code flow с PKCE в качестве дополнительного контекстного маркера.
Библиотека jose реализует поддержку nonce в соответствии с этими стандартами, обеспечивая корректную проверку токенов без необходимости ручной реализации криптографической логики на уровне приложения.