JWT(JSON Web Token)は通常、ヘッダー + ペイロード + 署名で構成されます。
ヘッダー
JWT に関する メタデータ情報が含まれています。
alg: トークンの署名に使用されるアルゴリズム。
typ: トークンのタイプ。常に JWT。
{
"alg": "HS256",
"typ": "JWT"
}
他にもヘッダーが存在する場合がありますが、上記のヘッダーは 常に存在します。
ペイロード
ペイロードには JWT のクレームが含まれています。標準ヘッダーは以下のとおりです:
iss: JWT を生成・発行するエンティティである発行者。
sub: サブジェクト、このトークンによって識別されるエンティティ。
aud: オーディエンス。このJWTの対象オーディエンス。
exp: 有効期限。トークンを受け入れてはならない日時のUNIXタイムスタンプ。
iat: 発行日時。トークンが発行された日付を指定します。
{
"sub": "1234567890",
"name": "John Doe",
"iat": 1516239022
}
署名
署名は、エンコードされたヘッダー、エンコードされたペイロード、シークレット、および暗号アルゴリズムを使用して作成されます。
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
次のアルゴリズムはクライアントとサーバーの両方の JWT コンポーネントでサポートされています。
JWTの署名と検証には、OpenSSLライブラリが必要です。ただし1つだけ例外があります。
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 トークンは拒否されます。
TsgcHTTP_JWT_Client: JWT をエンコードおよび署名し、HTTP および WebSocket プロトコルの Authorization ヘッダーとして送信できる JWT クライアント。
TsgcHTTP_JWT_Server: HTTP および WebSocket プロトコルの Authorization ヘッダーとして受信した JWT をデコードおよび検証できる JWT サーバー。
* JWT コンポーネントには少なくとも Indy バージョン 10.6.0.5169 または sgcWebSockets Enterprise エディションが必要です。