web-token は JWS、JWE、JWK、JWK セットを個別のコンポーネントとして実装しています。web-token/jwt-library はそれらをまとめたもので、Symfony バンドルはそれらをサービスとして組み込みます。JWE、JWK セットの管理、またはすべてのアルゴリズムが必要な場合、PHP ではこのライブラリが選択肢になります。4.2.3 では 256/384/512 の HS、RS、PS、ES と EdDSA で署名と検証ができ、firebase/php-jwt にない PS384/512 と ES512 も含まれます。ES256K と、完全指定の Ed25519 のアルゴリズムクラスはありません。
アルゴリズムは明示的に許可します。JWSVerifier に渡す AlgorithmManager が許可リストで、それ以外のアルゴリズムのトークンは The algorithm "RS256" is not supported. で失敗します。none はアルゴリズムクラスとして存在しますが、マネージャーに追加した場合にのみ受け入れられます。EC 鍵の PEM テキストを使って偽造した HS256 トークンは、HS256 を許可していても失敗しました。EC の JWK は HMAC の鍵として使えないためです。P-384 の鍵で ES256 の署名を行うと、ライブラリ自身の検証処理が拒否する署名が生成されました。
署名の検証とクレームのチェックは別々の処理です。JWSVerifier::verifyWithKey() は、1 時間前に期限切れになったトークンに対しても true を返しました。検証の後で ClaimCheckerManager を実行し、必須のクレームを列挙してください(列挙しなければ exp は必須になりません)。また、ExpirationTimeChecker には許容する時刻のずれを渡してください。バージョン 4 以降は PSR-20 のクロックも必要です。サンプルで一連の手順を示しています。
ES256 の署名は 64 バイトの生の r‖s で、DER 署名を渡すと verifyWithKey() は false を返します。トークンがどちらの形式かは JWT デバッガーで確認できます。鍵はすべて JWK オブジェクトとして扱います。JWKFactory は PEM、証明書、鍵パラメーターから JWK を作成し、JWKS ビルダーも同じ形式の鍵セットを生成します。