В библиотеке JOSE (JSON Object Signing and Encryption) обработка ошибок является одной из ключевых частей архитектуры, поскольку работа с токенами и криптографическими операциями требует строгой диагностики причин сбоев. Иерархия ошибок в JOSE построена таким образом, чтобы разработчик мог точно определить, на каком этапе произошла проблема: при декодировании структуры токена, проверке подписи, валидации алгоритма или при обработке ключей.
Базовым элементом всей системы ошибок выступает класс
JOSENotSupported и его производные, но корневым классом, от
которого фактически наследуются все специализированные ошибки, является
JOSEError. Он инкапсулирует общую семантику ошибок
криптографического уровня и служит единым типом для перехвата всех
исключений, связанных с обработкой JOSE-структур.
JOSEError — это фундаментальная ошибка, которая не
привязана к конкретному этапу обработки. Она используется как
абстрактный контейнер для всех проблем, возникающих в библиотеке. В
реальной практике напрямую она возникает редко, поскольку большинство
случаев уточняются через более конкретные подклассы.
Ключевая роль этого уровня — унификация обработки:
instanceof JOSEErrorОдной из самых частых категорий являются ошибки, связанные с некорректной структурой токена или JWS/JWE объекта.
JOSEParseErrorВозникает при невозможности разобрать входную строку как корректный JWT или JWE. Это может происходить в случаях:
Данный тип ошибки относится к ранней стадии обработки, до выполнения криптографических операций.
JOSENotCompact
(в некоторых реализациях)Используется, когда входной объект не соответствует compact serialization формату. Например, попытка передать JSON-сериализованный JWS в функцию, ожидающую compact JWT.
Эта группа является центральной в JOSE, поскольку именно здесь происходит проверка подлинности данных.
JWSInvalidSignatureОдна из наиболее критичных ошибок. Возникает, когда подпись JWT не соответствует ожидаемому значению при проверке с использованием публичного ключа.
Причины возникновения:
Эта ошибка всегда означает, что доверие к токену не может быть установлено.
JWSSignatureVerificationFailedВо многих реализациях используется как более общий вариант проверки
подписи. В отличие от JWSInvalidSignature, может включать
внутренние причины, связанные не только с математическим
несоответствием, но и с проблемами алгоритма или ключевой
инфраструктуры.
JWEDecryptionFailedВозникает при невозможности расшифровать JWE (JSON Web Encryption). Это одна из наиболее сложных ошибок, поскольку она может скрывать широкий спектр причин:
JOSE строго контролирует допустимость криптографических алгоритмов. Любое несоответствие приводит к ошибкам уровня безопасности.
JOSENotSupportedИспользуется, когда:
none, если он
отключён)Этот класс часто является базой для более конкретных ошибок, связанных с алгоритмами.
JOSEAlgNotAllowedВозникает при попытке использовать алгоритм, явно запрещённый
конфигурацией приложения. Например, система может разрешать только
RS256, но входящий токен использует HS256.
Работа с ключами — одна из наиболее чувствительных областей, и JOSE выделяет отдельные ошибки для диагностики проблем с ними.
JWKInvalidВозникает при некорректном формате JSON Web Key (JWK):
kty, use,
alg)JWKMissingKeyИспользуется, когда необходимый ключ не найден в наборе JWK Set. Часто встречается при работе с динамическими ключевыми источниками (например, JWKS endpoint).
JWKSMultipleMatchingKeysВозникает, когда для одного token header находится несколько подходящих ключей. Это создаёт неоднозначность при выборе ключа и считается критической ошибкой конфигурации.
После успешного декодирования и проверки криптографической целостности выполняется этап валидации claims. Здесь также существует отдельная группа ошибок.
JWTExpiredВозникает, когда поле exp (expiration time) указывает на
прошедшее время. Это одна из самых частых ошибок в
production-системах.
JWTNotBeforeErrorВозникает при нарушении поля nbf (not before). Токен ещё
не должен быть активен.
JWTClaimValidationFailedОбобщённая ошибка для случаев, когда один или несколько claims не соответствуют ожиданиям:
iss (issuer)aud (audience)На нижнем уровне находятся ошибки, связанные с кодированием данных.
JWEInvalidИспользуется при невозможности корректно разобрать структуру JWE-сообщения. Может включать проблемы с:
JOSENotBase64URLEncodedВозникает, когда часть JWT не соответствует стандарту Base64URL. Это часто указывает на повреждение токена или попытку передать некорректные данные.
Иерархия ошибок в JOSE построена по принципу постепенного уточнения:
JOSEError
Такое дерево позволяет:
Практически важной особенностью является то, что большинство ошибок
можно перехватывать на разных уровнях абстракции. Например, обработчик
может ловить как общий JOSEError, так и конкретный
JWTExpired, в зависимости от требуемой логики.
В реальных системах иерархия ошибок используется не только для отладки, но и для построения политик безопасности:
JWTExpired выполняется инициирование refresh
flowJWSInvalidSignature запрос полностью
отклоняетсяJWKMissingKey может запускаться обновление JWKS
cacheJOSENotSupported фиксируется ошибка конфигурации
системыТаким образом, ошибки JOSE являются не просто диагностическим механизмом, а полноценной частью управления жизненным циклом токенов и безопасностью приложения.