jsonwebtoken signiert und prüft JSON Web Tokens mit drei Aufrufen: jwt.sign(), jwt.verify() und jwt.decode(). Die JWS-Schicht übernehmen die Pakete jws und jwa, die Kryptografie erledigt node:crypto, Schlüssel können also PEM-Strings, Buffer oder Instanzen von KeyObject sein. jwt.decode() parst das Token nur – die Methode prüft nie die Signatur, und Code, der Claims daraus liest, vertraut allem, was der Absender hineingeschrieben hat.
Version 9 hat die klassischen Wege zur Algorithm Confusion geschlossen, und die Prüfung bestätigte das für 9.0.3: Ohne die Option algorithms ergibt sich die Liste der zulässigen Algorithmen aus dem Schlüsseltyp, ein HS256-Token mit dem Text eines öffentlichen Schlüssels als HMAC-Schlüssel wird abgelehnt, und alg: none kommt nur durch, wenn du none aufführst und überhaupt keinen Schlüssel angibst. Übergib algorithms trotzdem – die Option dokumentiert die Erwartung und greift weiter, falls sich der Schlüsseltyp einmal ändert.
Die Algorithmusliste endet beim Umfang von RFC 7518: Es gibt kein EdDSA, Ed25519 oder ES256K. Ein Token von einem Aussteller, der mit Ed25519 signiert – verbreitet bei jose sowie in Go- und Rust-Stacks –, lässt sich hier nicht prüfen; nimm stattdessen jose. ES256 verlangt außerdem einen P-256-Schlüssel, und das Signieren mit einem P-384-Schlüssel unter diesem Namen wirft eine Exception, statt ein Token zu erzeugen, das andere Bibliotheken ablehnen würden.
ECDSA-Signaturen im Token haben die 64 Byte lange rohe Form r‖s, die JWS vorschreibt. Wurde ein Token von Hand aus openssl dgst, SHA256withECDSA aus Java oder einem Cloud-KMS zusammengesetzt, ist seine Signatur DER-kodiert, und die Prüfung scheitert mit "ES256" signatures must be "64" bytes – füge das Token in den JWT-Debugger ein, um die Länge der Signatur zu sehen, und korrigiere die Signatur mit dem Konverter DER ⇄ Raw.
Zwei Standardeinstellungen überraschen viele Teams – die eine ist strenger, die andere lockerer als angenommen: clockTolerance ist null, sodass schon wenige Sekunden Uhrenabweichung zwischen Servern zu jwt expired führen, und exp ist optional, sodass ein ohne diesen Claim ausgestelltes Token nie abläuft. Setze beim Signieren expiresIn und beim Prüfen maxAge oder verlange exp ausdrücklich; prüfe HMAC-Secrets mit dem JWT-Secret-Checker.