HTTP | JWT

JWT(JSON Web Token)は通常、ヘッダー + ペイロード + 署名で構成されます。

 

ヘッダー

 

JWT に関する メタデータ情報が含まれています。

 


{
  "alg": "HS256",
  "typ": "JWT"
}

他にもヘッダーが存在する場合がありますが、上記のヘッダーは 常に存在します。

 

ペイロード

 

ペイロードには JWT のクレームが含まれています。標準ヘッダーは以下のとおりです:

 


{
  "sub": "1234567890",
  "name": "John Doe",
  "iat": 1516239022
}

 

署名

 

署名は、エンコードされたヘッダー、エンコードされたペイロード、シークレット、および暗号アルゴリズムを使用して作成されます。


eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5M
DIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

サポートされているアルゴリズム

次のアルゴリズムはクライアントとサーバーの両方の JWT コンポーネントでサポートされています。

 

 

JWTの署名と検証には、OpenSSLライブラリが必要です。ただし1つだけ例外があります。

 

ML-DSA、ポスト量子署名

3つの ML-DSA アルゴリズムは RFC 9964 のポスト量子 JOSE アルゴリズムであり、上記の例外にあたります。これらは sgcCrypto パック内で純粋な Object Pascal として実装されているため、OpenSSL ライブラリがなくても署名と検証ができます。署名は、JWS 署名入力に対する、空のコンテキストを用いた純粋モードの FIPS 204 ML-DSA であり、base64url としてトークンに格納されます。署名器は決定的であるため、同じ鍵と同じ入力は常に同じ署名を生成します。

 

列挙型の値はjwtMLDSA44、jwtMLDSA65、jwtMLDSA87であり、それらが書き出すalgヘッダーはML-DSA-44、ML-DSA-65、ML-DSA-87です。クライアントは PKCS#8 PEM の秘密鍵であるJWTOptions.Algorithms.MLDSA.PrivateKeyで署名し、サーバーは SubjectPublicKeyInfo PEM の公開鍵であるJWTOptions.Algorithms.MLDSA.PublicKeyで検証します。鍵のパラメータセットはアルゴリズムが示すものでなければなりません。それ以外の場合、署名はエラーになり、検証は False を返します。

 

署名は大きくなります。ML-DSA-44 の署名は 2420 バイトであり、ES256 の 64 バイトと対照的です。そのためトークンは base64url でおよそ 3.2 KB 増え、ML-DSA-87 ではおよそ 6.2 KB 増えます。採用する前に、トークンが経由するすべての経路のヘッダーサイズ制限を確認してください。

 

鍵は AKP JSON Web Key として運ぶこともできます(RFC 9964 のセクション 3 と 4)。sgcMLDSA_ExportPublicJWKとsgcMLDSA_ExportPrivateJWKが JWK を書き出し、sgcMLDSA_ImportJWKはどちらの形式も読み取り、sgcMLDSA_ImportJWKAsPEMは JWK を、両コンポーネントが読み取る PEM 文字列に直接変換します。秘密 JWK は 32 バイトのシードをprivに格納します。これはセクション 4 が定める唯一の秘密形式であるため、展開された秘密鍵を JWK として書き出すことはできません。4つの関数はいずれもsgcHTTP_JWT_MLDSAで宣言されています。

 

* ML-DSA アルゴリズムには sgcCrypto パックが必要です。これがない場合も列挙型の値は存在するため、これを使って保存したフォームはそのまま読み込めますが、署名はエラーになり、すべての ML-DSA トークンは拒否されます。

コンポーネント

 

 

 

* JWT コンポーネントには少なくとも Indy バージョン 10.6.0.5169 または sgcWebSockets Enterprise エディションが必要です。