エラーメッセージ
jwt signature is required
jsonwebtoken (Node.js) — JsonWebTokenError from jwt.verify()
このエラーの意味
トークンの 3 番目のセグメントが空です。保護されていない JWT(`alg: "none"`)か、署名が切り取られた署名付きトークンです。しかし `verify()` を鍵付きで呼び出しているため、署名は必須です。jsonwebtoken は、誰も署名していないクレームを受け入れずに拒否します。外部からこのようなトークンが API に届いている場合は、誰かが典型的な「alg none」の弱点を探っている可能性があります。
発生する理由
alg が「none」の保護されていないトークン
よくあるRFC 7519 は、完全性が別の手段で保証されている状況に限って、署名のない JWT を認めています。API がそのような状況に当たることはありません。`eyJhbGciOiJub25lIn0.eyJzdWIiOiJhZG1pbiJ9.` のようなトークンは、好きな ID を自由に名乗れます。
テストやツールで手作りしたトークン
ときどきヘッダーとペイロードを base64 でエンコードして組み立てたフィクスチャや、署名を無効にしたデバッグツールが生成したトークンは、署名が空になります。
転送中に署名が取り除かれた
ときどきログのマスキング処理、URL の長さ制限、ストレージのカラムなどによってトークンが 2 つ目のドットの直後で切り捨てられると、一見有効なヘッダーとペイロードだけが残り、検証する対象がなくなります。
修正方法
- 1.
拒否とアルゴリズムの許可リストを維持する
発行者が使うアルゴリズムだけを指定した明示的な `algorithms` リストを使って検証してください。外部から署名のないトークンが届いた場合はリクエスト元をログに記録し、そのようなトークンを受け入れるコードパスを追加してはいけません。
js // Always pass an explicit allow-list; "none" must never be in it. const claims = jwt.verify(token, publicKey, { algorithms: ["ES256"] }); - 2.
使い捨ての鍵でテスト用トークンに署名する
テストのセットアップで鍵ペアを生成し、それでフィクスチャに署名してください。そうすれば、テストは本番環境と同じ検証パスを通ります。
js import { generateKeyPairSync } from "node:crypto"; // Test setup: a throwaway key pair, real signatures, same verification path as production. const { privateKey, publicKey } = generateKeyPairSync("ec", { namedCurve: "P-256" }); const token = jwt.sign({ sub: "test-user" }, privateKey, { algorithm: "ES256", expiresIn: "5m" });