JWTの仕組みと安全な使い方
JWT(JSON Web Token)はWeb APIの認証で広く使われるトークン形式です。Header・Payload・Signatureの3パートで構成され、署名によって改ざん検知が可能です。仕組みを正しく理解することで、セキュリティ上の落とし穴を避けられます。
JWTの構造
JWTはBase64URL形式の3パートをドット(.)で繋いだ文字列です。Headerにはアルゴリズムとトークンタイプ、PayloadにはClaimsと呼ばれる任意のデータ、SignatureにはHeader+PayloadをSecretで署名した値が入ります。重要なのはPayloadは単に Base64URL エンコードされているだけで暗号化はされていないこと。機密情報をPayloadに入れてはいけません。
HS256 / RS256 / ES256 の違い
HS256(HMAC-SHA256)は共有秘密鍵で署名する対称アルゴリズムです。シンプルですが署名鍵と検証鍵が同じため、検証する全サービスが秘密鍵を持つ必要があります。RS256(RSA-SHA256)は秘密鍵で署名し公開鍵で検証する非対称方式で、マイクロサービス間の検証に適しています。ES256(ECDSA-SHA256)はRS256より鍵長が短くパフォーマンスに優れます。
標準クレーム(Registered Claims)
RFC 7519で定義された標準クレームがあります。iss(発行者)、sub(主体)、aud(対象者)、exp(有効期限・Unix timestamp)、nbf(有効開始時刻)、iat(発行時刻)、jti(JWT ID・ユニーク識別子)。特にexpの検証は必須です。検証なしでトークンを信頼すると期限切れトークンが悪用されます。
JWTのセキュリティ注意点
よくある脆弱性として「algをnoneに変更した攻撃」があります。古い実装ではalg:noneのJWTを署名なしで受け入れてしまう場合があります。対策としてサーバー側でアルゴリズムを固定します。またJWTはステートレスのため失効(Revoke)が難しく、有効期限を短く(15分〜1時間)設定しリフレッシュトークンと組み合わせる設計が推奨されます。