jsonwebtoken firma y verifica JSON Web Tokens con tres llamadas: jwt.sign(), jwt.verify() y jwt.decode(). Gestiona la capa JWS mediante los paquetes jws y jwa y hace la criptografía con node:crypto, así que las claves pueden ser cadenas PEM, buffers o instancias KeyObject. jwt.decode() solo analiza el token —nunca comprueba la firma—, y el código que lee los claims de su resultado se fía de lo que haya escrito el remitente.
La versión 9 cerró las vías clásicas de confusión de algoritmos, y la comprobación lo confirmó con la 9.0.3: sin la opción algorithms, la lista de algoritmos permitidos se deriva del tipo de clave, un token HS256 con el texto de una clave pública como clave se rechaza y alg: none solo pasa cuando incluyes none en la lista y no proporcionas ninguna clave. Pasa algorithms de todos modos: documenta el contrato y sigue funcionando si el tipo de clave cambia algún día.
La lista de algoritmos se queda en el conjunto del RFC 7518: no hay EdDSA, Ed25519 ni ES256K. Un token de un emisor que firma con Ed25519 —algo habitual con jose y con stacks de Go y Rust— no se puede verificar aquí; usa jose en su lugar. ES256 también exige una clave P-256, y firmar bajo ese nombre con una clave P-384 lanza un error en lugar de producir un token que otras bibliotecas rechazarían.
Las firmas ECDSA dentro del token tienen la forma r‖s en bruto de 64 bytes que exige JWS. Cuando un token se arma a mano con openssl dgst, con SHA256withECDSA de Java o con un KMS en la nube, su firma es DER y la verificación falla con "ES256" signatures must be "64" bytes: pega el token en el decodificador de JWT para ver la longitud de la firma y corrígela con el conversor DER ⇄ en bruto.
Dos valores predeterminados sorprenden a muchos equipos, uno por más estricto y otro por más laxo de lo que suponen: clockTolerance es cero, así que unos pocos segundos de desfase de reloj entre servidores ya producen jwt expired, y exp es opcional, así que un token emitido sin él nunca caduca. Configura expiresIn al firmar y maxAge o un requisito explícito de exp al verificar; comprueba los secretos HMAC con el comprobador de secretos JWT.