JWCrypto は、pyca/cryptography の上に JOSE ファミリー(JWK と JWK セット、JWS、JWE、JWT)を実装しています。すべてが鍵オブジェクト、つまり PEM、JSON、generate() から作成した jwk.JWK を基本としているため、どの呼び出しでも鍵の種類が明示されます。ライセンスは LGPL-3.0-or-later で、改変したコピーを再配布する場合にはこの点が重要になります。
対応するアルゴリズムは Python の JOSE ライブラリの中で最も幅広く、HS、RS、PS、ES の各ファミリー、ES256K、EdDSA、完全指定の Ed25519 と Ed448、さらに 1.6.1 では、ポスト量子 JOSE のドラフトで定義された AKP 鍵による ML-DSA-44、ML-DSA-65、ML-DSA-87 にも対応します。チェックではいずれも署名と検証ができ、すべてがデフォルトの許可リストに含まれています。注意すべきなのはこのデフォルトのリストです。algs を渡さない限り、鍵が合えばどのアルゴリズムも受け入れられるため、サンプルのように、発行者が実際に使うものに絞り込んでください。
none を列挙しない限り、署名のないトークンは Algorithm not allowed で拒否されます。また、EC 公開鍵の JWK を指定した HS256 トークンは失敗します。その種類の鍵では HMAC を実行できないためです。ES256 は P-384 の鍵を Curve requested is "P-256", but key curve is "P-384" で拒否します。ES256 署名は 64 バイトの生の r‖s 形式で、DER の署名は Verification failed for all signatures で失敗します。エンコーディングは JWT デバッガーで確認してください。
2 つのデフォルトはほかのライブラリと異なります。有効期限のチェックでは 60 秒の時刻のずれが許容されます。57 秒前に期限切れになったトークンはまだ検証を通り、63 秒前に期限切れになったトークンは通りませんでした。ずれをまったく許容しない PyJWT や jose よりも寛容です。また、exp は任意で、check_claims で指定しない限り、このクレームのないトークンも検証を通りました。
鍵セットは JWKS ビルダーで作成し、暗号化されたトークンは JWE インスペクターで解析してください。ML-DSA の鍵と署名については、ポスト量子署名ラボでそれぞれのサイズを確認できます。