表示言語: 日本語 英語に切り替え

JWT デコーダー

JSON Web Token をデコードして確認します。署名検証には署名鍵が必要で、サーバー側で行う必要があります — このツールは内容を表示するだけです。

  1. アプリ、API レスポンス、または Authorization ヘッダーから JWT をコピー。
  2. ボックスに貼り付け。入力に合わせてデコードが自動で走ります。
  3. デコードされた header と payload を読みます。署名は参照用にそのまま表示されます。
  4. 時間クレームのまとめ (iat、exp、nbf) を見て、期限切れトークンを検出します。
何ができるのか?

JSON Web Token はドットで結合された3つの base64url エンコードセグメントです: header.payload.signature。header と payload は JSON、署名は最初の2セグメントに対する HMAC あるいは RSA/ECDSA の出力です。このツールはドットで分割し、各部分を base64url デコードし、JSON をパースし、exp のような標準時間クレームを人間が読める日付として表示します。署名の検証は行いません — 理由は下の FAQ をご覧ください。

JWT 仕様のサンプルトークン (HS256、秘密鍵 your-256-bit-secret で署名):

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

デコードされた header:

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

デコードされた payload:

{
  "sub": "1234567890",
  "name": "John Doe",
  "iat": 1516239022
}

JWT の署名が無効とされるのはなぜ?

このデコーダーは署名をチェックしません (FAQ 参照) が、サーバー側の検証者がトークンを拒否する場合、通常の原因はこれらです。

  • 誤った秘密鍵または鍵。 HMAC 秘密鍵がたった1文字違うだけでも、まったく異なる署名になります。検証サービスの JWT_SECRET 環境変数が発行者と一致するか確認してください。
  • アルゴリズムの不一致。 HS256 で署名されたトークンを RS256 で検証することはできません。header の alg クレームを確認し、検証者を同じアルゴリズムに設定してください。
  • 期限切れトークン。 正しく署名された JWT でも、exp が過去になれば検証は失敗します。デコード後に時間クレームのまとめが明示的にこれを示します。
  • 時計のずれ。 nbf (not-before) が少し未来にありサーバー時計がずれていると、"token not yet valid" エラーが出ます。検証者に少しの許容 (例: 60 秒) を設けてください。
  • 貼り付けたトークンに空白。 コピー&ペーストでは先頭のスペースや末尾の改行が入ることがあります。JWT は周囲の空白なしで正確に header.payload.signature である必要があります。
  • alg: none。 header が "alg": "none" と言っていればトークンは未署名です。検証者で拒否してください — 絶対に有効扱いしないこと。
よくある質問

このツールは JWT 署名を検証できますか?

いいえ、そしてそれは意図的です。署名の検証には署名鍵 — HMAC の共有秘密鍵または非対称の公開鍵 — が必要です。その鍵はトークンを発行または消費するサーバーに置くべきであり、Web ページに貼り付けるものではありません。このツールはデコードと表示のみを行い、検証はバックエンドのサーバー側で行われます。

JWT の3つのセグメントにはそれぞれ何が入っていますか?

JWT は header.payload.signature。header はアルゴリズム (alg) とトークン種別を記述する JSON、payload は sub、iat、exp のようなクレームを含む JSON、署名は最初の2セグメントを秘密鍵または秘密鍵で署名した base64url エンコード出力です。最初の2つはエンコードのみで暗号化はされていません。

JWT が期限切れかどうかどう見分けますか?

payload の exp クレームを見ます。これは秒単位の Unix タイムスタンプです。Date.now() / 1000 が exp より大きければトークンは期限切れです。このツールは payload の下に exp、iat、nbf を人間可読な日付として表示するので、自分で計算せずに一目で分かります。

alg: none とは何で、なぜ危険ですか?

alg: none は JWT の機能で、署名が空でチェックされません。多くのライブラリが歴史的にこのようなトークンを受け入れてきたため、攻撃者は payload を作り alg を none に設定することで JWT を偽造できました。この header 値を見たらトークンは未署名 — これを受け入れるサーバーを信頼してはいけません。

ここに貼り付けた JWT を保存していますか?

いいえ。デコーダーに貼り付けたトークンは保存していません。入れたものはタブを閉じるか更新した時点で破棄されます — ログもなく、あなたが調べたトークンの記録は私たちの側にはありません。ただし、JWT は exp までアクセスを付与するので、パスワードのように扱い、デバッグした本番トークンは必ずローテーションしてください。

署名セクションに読めない塊が出ます — 普通ですか?

はい。署名は HMAC あるいは RSA/ECDSA のバイナリ出力を base64url エンコードしたものです。人間が読むためではなく、暗号的なチェックのためだけにあります。デコードされた header と payload があなたが扱う JSON 部分です。空の署名はトークンが未署名 (alg: none) であることを意味します。