JWT の alg: none 攻撃を防ぐ検証の書き方
JWT 検証時はトークンのヘッダが主張する alg を信じず、サーバー側で許可するアルゴリズムを固定する。
何が起きるか
- ヘッダを
{"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 になることを確認する。
出典
- @yousukezan · 2026-04-05 (Qiita 記事の紹介)