本文へスキップ
ecdsa.com
jsonwebtoken (Node.js)JWT ライブラリ

エラーメッセージ

jwt signature is required

jsonwebtoken (Node.js) — JsonWebTokenError from jwt.verify()

このエラーの意味

トークンの 3 番目のセグメントが空です。保護されていない JWT(`alg: "none"`)か、署名が切り取られた署名付きトークンです。しかし `verify()` を鍵付きで呼び出しているため、署名は必須です。jsonwebtoken は、誰も署名していないクレームを受け入れずに拒否します。外部からこのようなトークンが API に届いている場合は、誰かが典型的な「alg none」の弱点を探っている可能性があります。

発生する理由

修正方法

  1. 1.

    拒否とアルゴリズムの許可リストを維持する

    発行者が使うアルゴリズムだけを指定した明示的な `algorithms` リストを使って検証してください。外部から署名のないトークンが届いた場合はリクエスト元をログに記録し、そのようなトークンを受け入れるコードパスを追加してはいけません。

    js
    // Always pass an explicit allow-list; "none" must never be in it.
    const claims = jwt.verify(token, publicKey, { algorithms: ["ES256"] });
  2. 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" });

関連するエラー

署名エラーデータベースをすべて見る