テック技報最新号へ →
セキュリティ

JWT の alg: none 攻撃を防ぐ検証の書き方

JWT 検証時はトークンのヘッダが主張する alg を信じず、サーバー側で許可するアルゴリズムを固定する。

@yousukezan · 2026-10-09
#jwt#authentication#appsec#web

何が起きるか

  • ヘッダを {"alg":"none"} に書き換え、署名部を空にしたトークンを送る。ライブラリや自前実装がヘッダの alg に従って「署名なし」として受理すると、ペイロードの role: admin などを改ざんし放題になる。
  • 類似に、RS256 の公開鍵を HS256 の共有鍵として使わせる「アルゴリズム混同」攻撃もある。

対策コード例

js
// Node.js (jose)
import { jwtVerify } from 'jose';
const { payload } = await jwtVerify(token, key, {
  algorithms: ['RS256'],      // 許可アルゴリズムを明示
  issuer: 'https://auth.example.com',
  audience: 'my-api',
});
python
# Python (PyJWT)
jwt.decode(token, key, algorithms=["RS256"], audience="my-api", issuer="https://auth.example.com")
  • decode と verify が分かれているライブラリでは、検証なしデコード結果を認可に使わない。
  • exp・iss・aud も必ず検証する。

確認方法

  • テストで alg: none のトークン、HS256 に書き換えたトークンを投げて 401 になることを確認する。

出典

X の元の投稿を開く