JWT(JSON Web Token)は OIDC の IDトークンなどで広く使われますが、検証を誤ると認証を丸ごと迂回される重大な脆弱性につながります。自前で検証する場合の典型的な落とし穴を整理します。

1. alg=none 攻撃

JWT のヘッダで署名アルゴリズムに none を指定し、署名なしトークンを受け入れさせる攻撃です。

  • 対策:許可するアルゴリズムをサーバー側で固定し、none を絶対に受け入れない。

2. 署名アルゴリズムの取り違え(RS256 → HS256)

公開鍵(RSA)を HMAC の鍵として誤用させ、攻撃者が公開鍵で署名を偽造する古典的脆弱性です。

  • 対策:期待するアルゴリズムを明示し、ヘッダの alg を鵜呑みにしない。

3. aud(受け手)の未検証

aud が自分のクライアント ID であることを確認しないと、別アプリ向けのトークンを使い回されるおそれがあります。

  • 対策aud が自分の client_id と一致するか必ず検証。

4. iss / exp / nbf の検証漏れ

  • iss(発行者)が信頼する IdP か
  • exp(有効期限)が切れていないか
  • nbf(有効開始)前でないか

これらを検証しないと、失効・他者発行のトークンを受け入れてしまいます。

5. nonce の未検証(OIDC)

リプレイ攻撃を防ぐため、認可時に送った nonce と IDトークンの nonce を突き合わせます(GoでOIDC実装 参照)。

まとめ:自前検証より検証済みライブラリ

これらの落とし穴は、実績あるライブラリ(例:github.com/coreos/go-oidc の Verifier)を使い、JWKS で署名検証・aud/iss/exp を検証するのが安全です。自前実装は最小限に。背景は OpenID Connect とは を参照してください。