JJWT начиная с версии 0.12 предоставляет построитель и парсер с fluent-интерфейсом — Jwts.builder()…signWith(key, alg) и Jwts.parser().verifyWith(key)…parseSignedClaims(token), а алгоритмы собраны в Jwts.SIG. Библиотека поставляется тремя артефактами: jjwt-api нужен при компиляции, а во время выполнения — jjwt-impl и модуль привязки к JSON, например jjwt-jackson. В версии 0.13.0 полный цикл подписи и проверки прошли HS, RS, PS и ES на 256/384/512 и EdDSA; ES256K и имён Ed25519 и Ed448 в Jwts.SIG нет.
Парсер выводит разрешённый алгоритм из ключа проверки подписи и прямо говорит об этом в сообщениях об ошибках. Токен RS256 при проверке открытым ключом EC и токен HS256, подписанный текстом PEM ключа EC, отклонены с исключением UnsupportedJwtException, в котором сказано, что этот ключ нельзя использовать для такого алгоритма. Защиту обеспечивает тип ключа, а не список: парсер, получивший Keys.hmacShaKeyFor(pemBytes), принял этот поддельный токен, поэтому никогда не создавайте ключи HMAC из данных, которые могут быть общедоступны.
parseSignedClaims отклоняет неподписанные токены с сообщением, которое ссылается на RFC 7518, § 3.6; прочитать их можно только через Jwts.parser().unsecured()…parseUnsecuredClaims. Слабые ключи HMAC до этого этапа не доходят: Keys.hmacShaKeyFor отклонил 16-байтовый ключ с исключением WeakKeyException, поскольку RFC 7518 требует, чтобы ключ был не короче хеша. ES256 не принимает ключ P-384 уже на этапе подписи.
Два значения по умолчанию требуют внимания. Допуска на расхождение часов нет (токен, срок действия которого истёк 3 секунды назад, не прошёл проверку), а exp необязателен, поэтому задайте clockSkewSeconds и проверяйте срок действия и издателя, как в примере. Подписи ES256 — это 64-байтовый формат raw r‖s; о подписи DER библиотека сообщает точно (Provided signature is 576 bits (72 bytes) but ES256 signatures must be exactly 512 bits (64 bytes)), и это одна из немногих библиотек, которые прямо называют проблему с кодировкой. Разбирайте токены в отладчике JWT, а ключи HMAC проверяйте инструментом проверки секретов JWT.
Для масштабной работы с JWE и наборами JWK сравните JJWT с Nimbus JOSE + JWT.