L’entrée de signature est ASCII(base64url(protected header) ‖ "." ‖ base64url(payload)), et la signature ou le MAC est calculé sur exactement ces octets : tout nouvel encodage de l’en-tête ou de la charge utile l’invalide donc. La sérialisation compacte (§3.1, §7.1) porte une seule signature et un en-tête protégé ; la sérialisation JSON (§7.2) autorise plusieurs signatures et des membres d’en-tête non protégés.
Paramètres d’en-tête (§4.1) : alg (obligatoire), kid, typ, cty, crit, et les membres porteurs de clés jwk, jku, x5c, x5u, x5t et x5t#S256, auxquels il ne faut jamais se fier seuls pour choisir une clé de vérification. La RFC 7797 ajoute b64: false pour les charges utiles non encodées, utilisées par les signatures détachées comme l’en-tête x-jws-signature d’Open Banking.
Les JWT que vous rencontrez sont presque toujours des JWS ; les requêtes ACME, les preuves DPoP, les signatures d’émetteur SD-JWT et de nombreuses signatures de webhooks sont aussi des JWS.