JWTの3番目の部分は署名です。署名はトークンの完全性を保証し、改ざんを検知するための重要なセキュリティメカニズムです。ヘッダーとペイロードを Base64URL エンコードし、署名アルゴリズムを使用して生成されます。暗号化された署名は Base64URL エンコードされて token の最後に付与されます。
署名アルゴリズムには主に3つのカテゴリがあります。HMAC(HS256、HS384、HS512)は共有秘密鍵を使用する対称型暗号化です。RSA(RS256、RS384、RS512)とECDSA(ES256、ES384、ES512)は公開鍵暗号システムを使用する非対称型暗号化です。PSS(PS256、PS384、PS512)もRSAベースの署名方式です。
HS256は最も広く使われるアルゴリズムで、共有秘密鍵による署名と検証を行います。RS256はRSA公開鍵暗号を使用し、非対称鍵による署名を可能にします。ECDSAは楕円曲線暗号を使用し、短い鍵長で高いセキュリティを実現します。ES256はP-256楕円曲線を使用します。
署名検証のプロセスは以下の通りです。受信したトークンのヘッダーとペイロードを再度 Base64URL エンコードし、発行者から受け取った秘密鍵(または公開鍵)を使用して署名を再計算します。得られた署名とトークンに含まれる署名を比較し、一致すれば改ざんされていないことが確認できます。
署名のセキュリティにおいて、アルゴリズムの「alg」ヘッダーは信頼できません。攻撃者はalgフィールドを改ざんすることで、署名検証を回避しようとする場合があります。したがって、サーバー側では受信トークンのalgを検証し、許可されたアルゴリズムのみ受け付けることが重要です。特に「none」アルゴリズムの使用は避けるべきです。