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

エラーメッセージ

jwt expired

このエラーの意味

jsonwebtoken の TokenExpiredError です。トークンの exp クレーム(秒単位の Unix タイムスタンプ)が、検証者の現在時刻より前になっています。署名自体はまったく問題なく有効かもしれません。トークンが、発行者の定めた有効期間を過ぎただけです。エラーオブジェクトの expiredAt には、期限切れになった正確な時刻が入っています。

発生する理由

修正方法

  1. 1.

    小さな時刻のずれを明示的に許容する

    clockTolerance は秒単位で指定し、exp と nbf に適用されます。値は小さく(30〜60 秒)してください。これは時計のずれを吸収するためのものであり、トークンの有効期間を延ばすためのものではありません。

    js
    jwt.verify(token, publicKey, {
      algorithms: ["ES256"],
      clockTolerance: 30, // seconds of tolerated skew
    });
  2. 2.

    時計を疑う前に exp を確認する

    クレームをデコードし、exp を現在時刻と並べて出力してください。exp が 1.7e12 のような値ならミリ秒のバグです。数分前の時刻なら、リフレッシュのロジックが必要です。

    js
    const { exp } = jwt.decode(token);
    console.log("exp:", new Date(exp * 1000).toISOString());
    console.log("now:", new Date().toISOString());
  3. 3.

    時計を同期し、リフレッシュの仕組みを追加する

    検証を行うホストでは NTP(chrony/systemd-timesyncd)を実行し、クライアント側では 401 レスポンスを受け取ったらトークンをリフレッシュする処理を実装してください。ignoreExpiration: true を決して本番環境にリリースしてはいけません。漏洩したトークンがすべて、永続的な認証情報になってしまいます。

関連するエラー

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