JWT デコーダ

JWTのヘッダーとペイロードをブラウザ内でデコード。署名検証は行いません。

Loading…

すべての処理はブラウザ内で実行されます — ファイルや入力はサーバへ送信されません。

使い方

JWT(ドットで連結された 3 つの base64url セグメント)を貼り付けると、ヘッダーとペイロードが整形済み JSON として表示されます。ペイロードに "exp" クレームがあれば有効期限が右側に表示され、期限切れの場合は赤い「expired」バッジが付きます。

これはデバッグ用ビューアーであり、検証ツールではありません。署名セグメントは存在チェックのみで、鍵による検証は行いません。改ざんされたトークンでも普通にデコードされます。バックエンドや認証プロバイダ(Auth0・Cognito・Firebase・Keycloak など)がトークンに何を入れたかを開発・トラブルシューティング時に確認する用途に使い、署名検証はサーバー側で適切なライブラリを使ってください。

一般的なアクセストークンを確認

入力
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
出力
// header
{
  "alg": "HS256",
  "typ": "JWT"
}

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

alg は署名アルゴリズム名、typ はほぼ常に JWT です。iat は Unix 秒で表記された発行時刻なので、必要ならタイムスタンプコンバーターで変換できます。

期限切れトークンのデバッグ

入力
eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ1c2VyXzQyIiwiZXhwIjoxNjAwMDAwMDAwfQ.x
出力
// payload
{
  "sub": "user_42",
  "exp": 1600000000
}

expired (2020-09-13)

API が 401 を返したとき、トークンをデコードするだけで原因がすぐ判明することがあります。exp が過去になっている、あるいは発行元のサーバー時計がずれている、というケースです。

不正な形式のトークンを検出

入力
eyJhbGciOiJIUzI1NiJ9.this-is-not-base64.sig
出力
Failed to decode segments

トークンがログで切り詰められた、二重 URL エンコードされた、または「Bearer 」プレフィックスを付けたままコピーされた、といったケースでよく起きます。プレフィックスを外して貼り直してください。

よくある質問

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

いいえ。署名検証には発行元の秘密鍵または公開鍵が必要で、汎用の Web ツールには持たせられません。このデコーダはヘッダーとペイロードの内容を表示するだけです。検証はサーバー側のライブラリ(jsonwebtoken・jose・PyJWT など)で正しい鍵を使って行ってください。

トークンはサーバへ送られますか?

いいえ。デコードは atob と TextDecoder を使ってブラウザ内で完結します。トークンはページ外に出ません。とはいえ本番トークンの扱いには注意してください。どんなツールであれ貼り付けはクリップボード履歴やスクリーンショット経由で漏れる経路を一つ増やすことになります。

どの JWT アルゴリズムに対応していますか?

すべて対応しています。デコーダはアルゴリズムを無視するためです。HS256・RS256・ES256・EdDSA など、署名アルゴリズムが何であってもヘッダーとペイロードは base64url で符号化された JSON にすぎません。アルゴリズムが意味を持つのは検証時だけです。

JWE(暗号化トークン)もデコードできますか?

いいえ。JWE は 3 つではなく 5 つのセグメントを持ち、ペイロードは base64 で符号化された JSON ではなく暗号化されています。復号には鍵と JOSE ライブラリが必要です。実運用で「JWT」と呼ばれているものの大半は JWS(署名のみ・暗号化なし)で、こちらは本ツールで扱えます。

有効期限の表示が想定と違うのはなぜですか?

JWT の exp は UTC の Unix 秒であり、ミリ秒でもローカルタイムゾーンでもありません。バッジは UTC の日付を表示します。サーバーがミリ秒で発行している場合(非標準ですがよくある誤り)、年が 1970 と表示されます。発行側を直すサインです。

関連する概念

JWT は base64url で符号化された 3 つのセグメント(ヘッダー・ペイロード・署名)をドットで連結したものです。ヘッダーは署名アルゴリズム(alg)とトークン種別を示します。ペイロードはクレームの JSON オブジェクトで、登録済みクレーム(iss = 発行者、sub = 主体、aud = 受信者、exp = 有効期限、iat = 発行時刻)に加え、発行元が追加する任意のカスタムクレームを含みます。署名はヘッダーで宣言されたアルゴリズムでヘッダー+ペイロードに対して計算されます。

base64url は通常の base64 と 2 文字(+/ ではなく -_)が異なり、パディングを省略します。そのため JWT を普通の base64 デコーダに貼り付けると大抵失敗します。JWT は暗号化されていません。トークンを持つ者は誰でも中身を読めます。ペイロードに秘密情報を入れてはいけません。署名はペイロードが改ざんされていないことを保証するだけで、内容の秘匿は保証しません。暗号化が必要な場合、JOSE ファミリーは JWE を定義しています(本ツールでは扱えません)。

関連記事

関連ツール