web-token реализует JWS, JWE, JWK и наборы JWK как отдельные компоненты; web-token/jwt-library объединяет их в одном пакете, а бандл для Symfony регистрирует их как сервисы. Это выбор для PHP, когда нужны JWE, управление наборами JWK или полный список алгоритмов: в версии 4.2.3 подпись и проверка работали для HS, RS, PS и ES в вариантах 256/384/512, а также для EdDSA, включая PS384/512 и ES512, которых нет в firebase/php-jwt. Классов алгоритмов для ES256K и для полностью определённого Ed25519 нет.
Алгоритмы разрешаются явно: AlgorithmManager, переданный в JWSVerifier, и есть список разрешённых алгоритмов, а токен с любым другим алгоритмом отклоняется с ошибкой The algorithm "RS256" is not supported. Класс алгоритма none существует, но этот алгоритм принимается, только если вы сами добавите его в менеджер. Поддельный токен HS256, подписанный текстом PEM ключа EC, не прошёл проверку даже при разрешённом HS256: JWK ключа EC нельзя использовать как ключ HMAC. При ES256 с ключом P-384 получилась подпись, которую отверг собственный код проверки той же библиотеки.
Проверка подписи и проверка утверждений — отдельные шаги: JWSVerifier::verifyWithKey() вернул true для токена, срок действия которого истёк час назад. После этого запустите ClaimCheckerManager, перечислите обязательные утверждения — иначе exp не считается обязательным — и передайте допуск на расхождение часов в ExpirationTimeChecker, которому начиная с версии 4 нужен ещё и объект часов PSR-20; вся последовательность показана в примере.
Подписи ES256 — это 64 байта в формате raw r‖s, а с подписью в DER verifyWithKey() возвращает false; какой формат в токене, покажет отладчик JWT. Ключи везде представлены объектами JWK: JWKFactory создаёт их из PEM, сертификатов или параметров ключа, а конструктор JWKS формирует наборы ключей в том же формате.