JWT ガイド

JWT exp claim と有効期限を私が確認する方法

JWT exp を NumericDate として読み、秒/ミリ秒の違い、clock skew、nbf/iat との timeline を確認して本当に expiration が原因か判断する手順を解説します。

著者: JWTDecoder.tools最終確認 2026-09-13

編集上の表現について:一人称の記述は JWTDecoder.tools の検証済みワークフローを示すもので、発行者・組織著者は JWTDecoder.tools です。

iat、nbf、有効期間、exp を示す JWT タイムライン
期限切れと判断する前に iat、nbf、有効期間、exp を確認します。

token expired、jwt expired、時間が原因らしい 401 を見たとき、私はまず exp を確認します。ただし library の error text だけで決めず、token を decode し、timestamp を自分で変換し、実際に reject した verifier の clock と比較します。

手早く確認するなら JWT 有効期限チェック で exp、iat、nbf を UTC に変換します。

exp が意味するもの

RFC 7519 で exp は Expiration Time です。NumericDate で、Unix epoch からの 秒 を表します。

{
  "sub": "user_123",
  "iat": 1789200000,
  "exp": 1789203600
}

conceptually verifier は:

current verifier time >= exp

になった後 token を reject します。

最初に確認するミス: 秒とミリ秒

JavaScript の Date.now() は milliseconds です。JWT NumericDate は seconds です。

正しくは:

const expiresAt = payload.exp * 1000;
const expired = Date.now() >= expiresAt;

私は:

Date.now() >= payload.exp

という比較を見たら units bug を疑います。

本当に expired か確認する順番

  1. exp が存在するか。
  2. UTC timestamp に変換する。
  3. reject した service の clock と比較する。
  4. nbf と iat も同時に見る。
  5. verifier の clock tolerance を確認する。

自分の laptop time だけを authority にしないことが重要です。

clock skew をどう扱うか

RFC 7519 は小さな clock difference を吸収する leeway を実装が使えるとしています。

boundary 直前/直後なら私は:

  • API server clock は synchronized か。
  • issuer clock は synchronized か。
  • JWT library に tolerance setting があるか。

を確認します。

error を消すために大きな grace period を入れません。それは issuer が宣言した acceptance window を実質的に伸ばします。

数秒の差なら skew の可能性がありますが、1 時間前に expired した token を skew で説明しません。

exp がないとき

base JWT specification に exp は registered claim としてありますが、すべての JWT profile が必須とするわけではありません。

そのため missing exp を universal malformed JWT と断定しません。

ただし short-lived bearer access token の profile で expiration が期待されるなら investigation 対象です。JWT Validator ではこの condition を確認しつつ、すべての profile に同じ rule を押し付けません。

unexpired でも failure する理由

exp が未来なら私は expiration から離れます。

  • signature failure
  • nbf が未来
  • wrong issuer
  • wrong audience
  • 異なる実行環境
  • wrong token type
  • missing scope / role

など、別 layer の可能性があります。

issuer/audience は JWT デバッガー、trusted key があるなら JWT 署名検証 に進みます。

exp を編集して更新しない

signed token の:

{ "exp": 1789203600 }

を未来値に書き換えると signed bytes が変わります。authorized signing credential なしでは valid signature を作り直せません。

正しい renewal は refresh / reauthentication など system が提供する token acquisition flow です。

iat / nbf / exp を 1 timeline で見る

issued -------- active window -------- expired
  iat     nbf                     exp

私は:

  • iat は login timing と合うか。
  • nbf が current time より後ではないか。
  • exp は iat より後か。
  • lifetime が異常に長い/短いか。

を確認します。

odd timeline は unit conversion、clock、異なる実行環境、profile policy の clue になります。

私の exp troubleshooting flow

  1. JWT 有効期限チェック を開く。
  2. exp を seconds として解釈する。
  3. UTC を reject した verifier の clock と比較する。
  4. iat / nbf に矛盾がないか見る。
  5. configured tolerance を確認する。
  6. 本当に expired なら正規の flow で new token を得る。
  7. まだ active なら issuer、audience、signature へ進む。

exp が答えるのは declared time window の外かどうかです。token を trust / accept すべきかの全部ではありません。

出典・参考資料

関連ガイド