O jsonwebtoken assina e verifica JSON Web Tokens com três chamadas: jwt.sign(), jwt.verify() e jwt.decode(). Ele trata a camada JWS por meio dos pacotes jws e jwa e faz a criptografia com o node:crypto; por isso, as chaves podem ser strings PEM, buffers ou instâncias de KeyObject. jwt.decode() apenas analisa o token — nunca verifica a assinatura, e o código que lê claims a partir dele confia em tudo o que o remetente escreveu.
A versão 9 fechou os caminhos clássicos de confusão de algoritmo, e o teste confirmou isso na 9.0.3: sem a opção algorithms, a lista de algoritmos permitidos vem do tipo da chave, um token HS256 que usa como chave o texto de uma chave pública é recusado, e alg: none só passa quando você lista none e não fornece chave nenhuma. Passe algorithms mesmo assim — isso documenta o contrato e continua funcionando se o tipo da chave mudar algum dia.
A lista de algoritmos para no conjunto da RFC 7518: não há EdDSA, Ed25519 nem ES256K. Um token de um emissor que assina com Ed25519 — comum em ambientes com jose, Go e Rust — não pode ser verificado aqui; use o jose em vez disso. O ES256 também exige uma chave P-256, e assinar com uma chave P-384 sob esse nome lança uma exceção, em vez de produzir um token que outras bibliotecas rejeitariam.
As assinaturas ECDSA dentro do token estão na forma r‖s bruta de 64 bytes que o JWS exige. Quando um token é montado à mão a partir do openssl dgst, do SHA256withECDSA do Java ou de um KMS de nuvem, a assinatura dele está em DER, e a verificação falha com "ES256" signatures must be "64" bytes — cole o token no depurador de JWT para ver o tamanho da assinatura e corrija-a com o conversor DER ⇄ bruto.
Dois padrões surpreendem muitas equipes, um mais rígido e outro mais permissivo do que elas supõem: clockTolerance é zero, então alguns segundos de diferença de relógio entre servidores já resultam em jwt expired, e exp é opcional, então um token emitido sem ela nunca expira. Defina expiresIn ao assinar e maxAge ou uma exigência explícita de exp ao verificar; confira segredos HMAC com o verificador de segredos JWT.