JWT デコーダー
JSON Web Token をデコードして確認します。署名検証には署名鍵が必要で、サーバー側で行う必要があります — このツールは内容を表示するだけです。
Header
Payload
署名
- アプリ、API レスポンス、または Authorization ヘッダーから JWT をコピー。
- ボックスに貼り付け。入力に合わせてデコードが自動で走ります。
- デコードされた header と payload を読みます。署名は参照用にそのまま表示されます。
- 時間クレームのまとめ (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) であることを意味します。