O web-token implementa JWS, JWE, JWK e conjuntos de JWK como componentes separados; o web-token/jwt-library reúne todos eles, e um bundle do Symfony os registra como serviços. É a opção em PHP quando você precisa de JWE, de gerenciamento de conjuntos de JWK ou da lista completa de algoritmos: a versão 4.2.3 assinou e verificou HS, RS, PS e ES em 256/384/512 e EdDSA, incluindo PS384/512 e ES512, que faltam no firebase/php-jwt. Não há classe de algoritmo para ES256K nem para o Ed25519 totalmente especificado.
Os algoritmos são permitidos explicitamente: o AlgorithmManager passado ao JWSVerifier é a lista de algoritmos permitidos, e um token em qualquer outro algoritmo é rejeitado com The algorithm "RS256" is not supported. O none existe como classe de algoritmo, mas só é aceito se você o incluir no gerenciador. Um token HS256 forjado com o texto PEM da chave EC falhou mesmo com o HS256 permitido, porque uma JWK EC não pode ser usada como chave HMAC. O ES256 com uma chave P-384 produziu uma assinatura que o próprio verificador da biblioteca rejeitou.
A verificação da assinatura e a validação das claims são etapas separadas: JWSVerifier::verifyWithKey() retornou true para um token que tinha expirado uma hora antes. Rode um ClaimCheckerManager em seguida, liste as claims obrigatórias — sem isso, a exp não é obrigatória — e passe uma tolerância ao ExpirationTimeChecker, que desde a versão 4 também exige um relógio PSR-20; o exemplo mostra a sequência completa.
As assinaturas ES256 são 64 bytes de r‖s brutos, e uma assinatura DER faz verifyWithKey() retornar false; o depurador de JWT mostra qual das duas um token traz. As chaves são sempre objetos JWK; a JWKFactory as cria a partir de PEM, de certificados ou de parâmetros de chave, e o construtor de JWKS gera conjuntos de chaves no mesmo formato.