Toolify

JWT デコーダ (ヘッダ・ペイロード・署名・有効期限)

JWT を貼ると即座にヘッダとペイロードを JSON で表示。標準クレーム (iat, exp, nbf) は ISO 8601 に自動変換し、期限切れや未有効を強調表示。

ブラウザ内で完結。トークンはネットワークを流れません。

ヘッダ

{
  "alg": "HS256",
  "typ": "JWT"
}

ペイロード

{
  "sub": "1234567890",
  "name": "Jane Doe",
  "iat": 1730000000,
  "exp": 4886000000
}
署名あり
発行時刻 (iat)
2024-10-27T03:33:20.000Z
有効期限 (exp)
2124-10-30T22:13:20.000Z

仕組み

JWT の構造

JWT は Base64url エンコードされた 3 つのセグメントをドットで連結したもの: header.payload.signature。各セグメントは URL 安全に伝送するため JSON をエンコードしたもの。ヘッダは署名アルゴリズムを宣言、ペイロードはクレーム (subject、expiry、カスタムデータ) を運ぶ。署名があれば受信者が鍵で完全性を検証できる。

本デコーダは最初の 2 セグメントのみ読む。署名は 3 番目だが検証には秘密鍵/公開鍵が必要 — それは別操作。

知っておくべき標準クレーム

iss (issuer): 発行者。iat (issued at): 発行時刻 (Unix タイムスタンプ)。exp (expiry): 有効期限 (Unix)。nbf (not before): 有効になる最早時刻。sub (subject): トークンが代表する主体、通常ユーザ ID。aud (audience): トークンの宛先、通常サービス URL。

全部必須ではない。最小 JWT は sub + iat + exp 程度のことも。カスタムクレームはそれ以外を意味し、ペイロード内で標準と並列する。

デコード ≠ 検証

JWT は誰でもデコード可能 — ヘッダとペイロードは単なる Base64 エンコードされた JSON。だから「ペイロードに秘密を入れない」と言われる: 実質公開情報。

検証は署名を秘密鍵 (HMAC) または公開鍵 (RSA/ECDSA) で照合すること。検証無しではペイロード内のいかなるクレームも信用不可 — 攻撃者は任意のペイロードを偽造可能。

本ツールはデバッグ時の確認用。本番では必ずサーバ側 JWT ライブラリで検証する。

よくある質問

ここで署名検証できる?

できない — 検証には秘密鍵か公開鍵が必要で、これらは信頼できる環境から外に出すべきでない。サーバ側 JWT ライブラリ (Node の jsonwebtoken、Python の PyJWT 等) を使う。

トークンは送信される?

送信されません。デコードはローカル動作。受信用サーバ側エンドポイントすら存在しない。

「無効」と出るのはなぜ?

よくある原因: コピペで空白が混入/欠落、3 セグメント未満、いずれかが不正な Base64url。トリムして再試行。

Base64url と Base64 の違い?

Base64url は '+' を '-' に、'/' を '_' に、末尾 '=' を省略してエンコードし URL や HTTP ヘッダで安全に運べる。JWT は常に Base64url を使う。

Unicode ペイロードが文字化けするのはなぜ?

本ツールは標準の UTF-8 でデコード。発行者が他のエンコーディングを使うと JSON.parse が失敗。多くの JWT 発行者は UTF-8 を正しく使う。

HS256 は安全?

秘密鍵が十分長く (≥256 ビット) 秘匿されていれば安全。HS256 のよくある脆弱性は弱い秘密鍵と alg='none' を許容すること。≥32 文字のランダム鍵を使い 'none' を明示拒否する。

RS256 と HS256 はどちらがよい?

RS256 (非対称 RSA) は検証用の公開鍵を公開しつつ署名鍵は秘匿できる。HS256 (対称 HMAC) は秘密鍵を全検証者と共有が必要。多サービス構成では RS256 が安全。

巨大なトークンもデコード可能?

実用上 ~10 MB が限界。それ以上はブラウザが重くなる。JWT は通常 4 KB 未満。それより大きいならクレームに詰めすぎていないか見直し。

関連ツール

最終更新:

AIプロンプトも見る →