署名付き JWT は header.payload.signature の形で、各部分はパディングなしの base64url です。ヘッダーはアルゴリズム(alg)、鍵(kid)、種類(typ)を示し、ペイロードには iss、sub、aud、exp、nbf、iat、jti(RFC 7519 §4.1)などのクレームと、アプリケーション固有のクレームが入ります。暗号化された JWT は 5 つの部分からなります。署名付き JWT のペイロードは、トークンを持っていれば誰でも読めます。署名が守るのは完全性であって、機密性ではありません。
検証は 2 段階です。まず、検証者があらかじめ決めたアルゴリズムと鍵で署名を検証し、次にクレームを検証します。対象は発行者、オーディエンス、わずかな時刻のずれを許容したうえでの有効期限、そしてトークンの種類で、トークンの種類を確認するのは、アクセストークンを期待する場面で ID トークンが受け入れられないようにするためです。RFC 8725(JWT Best Current Practices)がこれらのルールをまとめており、JWT の脆弱性の多くは、そのどれかを省いたことが原因です。
アルゴリズムの選択にはトレードオフがあり、ES256 と RS256 の比較と HS256 と RS256 の比較で解説しています。JWT デバッガーでは、トークンをローカルでデコード・検証できます。