Ab JJWT 0.12 gibt es eine Fluent-API mit Builder und Parser – Jwts.builder()…signWith(key, alg) und Jwts.parser().verifyWith(key)…parseSignedClaims(token) –, und Jwts.SIG enthält die Algorithmen. Die Bibliothek wird als drei Artefakte ausgeliefert: jjwt-api zur Kompilierzeit, jjwt-impl und eine JSON-Bindung wie jjwt-jackson zur Laufzeit. Version 0.13.0 bestand den Roundtrip mit HS, RS, PS und ES bei 256/384/512 sowie mit EdDSA; ES256K und die Namen Ed25519 und Ed448 fehlen in Jwts.SIG.
Der Parser leitet den zulässigen Algorithmus aus dem Prüfschlüssel ab, und seine Fehlermeldungen sagen das unmissverständlich. Ein RS256-Token, geprüft mit einem öffentlichen Schlüssel vom Typ EC, und ein HS256-Token mit dem PEM-Text dieses EC-Schlüssels als Schlüssel scheiterten beide mit UnsupportedJwtException und dem Hinweis, dass der Schlüssel für diesen Algorithmus nicht verwendet werden darf. Der Schutz ist der Schlüsseltyp, keine Liste: Mit Keys.hmacShaKeyFor(pemBytes) als Schlüssel bestand dieses gefälschte Token die Prüfung des Parsers – baue HMAC-Schlüssel also nie aus Material, das öffentlich sein könnte.
Unsignierte Tokens lehnt parseSignedClaims mit einer Meldung ab, die auf RFC 7518 §3.6 verweist; lesbar sind sie nur über Jwts.parser().unsecured()…parseUnsecuredClaims. Schwache HMAC-Schlüssel kommen gar nicht so weit: Keys.hmacShaKeyFor lehnte einen 16-Byte-Schlüssel mit WeakKeyException ab, denn RFC 7518 verlangt Schlüssel, die mindestens so lang sind wie der Hash. ES256 lehnt einen P-384-Schlüssel schon beim Signieren ab.
Zwei Standardeinstellungen verdienen Aufmerksamkeit. Es gibt keine Toleranz für Uhrenabweichungen (Clock Skew) – ein Token, das drei Sekunden zuvor abgelaufen war, scheiterte –, und exp ist optional; setze also clockSkewSeconds und prüfe Ablauf und Aussteller, wie es das Beispiel tut. ES256-Signaturen sind das 64 Byte lange rohe r‖s; eine DER-Signatur wird präzise gemeldet (Provided signature is 576 bits (72 bytes) but ES256 signatures must be exactly 512 bits (64 bytes)) – JJWT ist eine der wenigen Bibliotheken, die das Kodierungsproblem benennen. Untersuche Tokens im JWT-Debugger und HMAC-Schlüssel mit dem JWT-Secret-Checker.
Für die Verarbeitung von JWE und JWK-Sets in großem Umfang lohnt sich ein Vergleich mit Nimbus JOSE + JWT.