Nimbus couvre JWS, JWE, JWK et JWT sur deux couches : des objets de bas niveau (SignedJWT, ECDSASigner, MACVerifier) et le DefaultJWTProcessor, qui réunit la sélection des clés, la vérification de la signature et le contrôle des claims. Le serveur de ressources de Spring Security repose sur lui, si bien que ses valeurs par défaut sont celles qu’appliquent la plupart des API Spring.
Avec le processeur, le JWSVerificationKeySelector constitue la liste d’autorisation : configuré pour ES256, il a refusé un jeton RS256 ainsi qu’un jeton HS256 dont la clé était le texte PEM de la clé EC, avec Another algorithm expected, or no matching key(s) found, et sans aucun sélecteur, il refuse tout. Les jetons non signés sont rejetés (Unsecured (plain) JWTs are rejected, extend class to handle). L’API de bas niveau n’offre pas cette protection (un MACVerifier construit à partir du texte PEM a vérifié ce jeton HS256 forgé) : le code qui choisit un vérificateur d’après l’en-tête du jeton recrée donc le bug classique de confusion d’algorithme. Utilisez le processeur, comme le fait l’exemple.
DefaultJWTClaimsVerifier tolère par défaut 60 secondes de décalage d’horloge, et exp est facultatif sauf s’il figure parmi les claims obligatoires (l’exemple exige sub et exp et fixe l’émetteur). ES256 refuse une clé P-384 (The ES256 algorithm is not allowed or supported by the JWS signer), et une signature encodée en DER échoue simplement à la vérification ; contrôlez la longueur de la signature avec le débogueur JWT.
La version 10.10 a fonctionné en aller-retour avec les familles HS, RS, PS et ES, ainsi qu’avec EdDSA et le nom plus récent Ed25519. Ed25519 nécessite Google Tink dans le classpath : sans lui, la signature a échoué avec NoClassDefFoundError: com/google/crypto/tink/subtle/Ed25519Sign$KeyPair. ES256K nécessite un fournisseur qui prend en charge secp256k1, comme Bouncy Castle, car le JDK n’en propose aucun.
Pour contrôler ce que publie un fournisseur d’identité, utilisez le vérificateur JWKS ; pour les jetons chiffrés, l’inspecteur JWE.