JWT デコーダー

JWTのヘッダー・ペイロード・署名を解析・表示。有効期限のハイライト表示付き。無料、ブラウザ内で処理。

  • ブラウザ内で処理
  • データはブラウザ外に出ません
  • 無料 · 登録不要
「デコード」で直ちに実行します。ツール内にフォーカスがある場合は Ctrl/⌘+Enter も同じ動作です。3 パートの Base64URL 形式に合う入力は 300 ミリ秒後にも自動処理します。その他の入力のエラーは「デコード」で確認できます。
「サンプルを読み込む」は入力を置き換え、John Doe、iat 1516239022、exp 1893456000 を含む HS256 トークンを直ちにデコードします。
「クリア」、またはツール内にフォーカスがある状態の Ctrl/⌘+L で、トークン・結果・状態を消去し、待機中の自動デコードを取り消します。
ドットで区切られた 3 つの Base64URL パートを貼り付けます。Header と Payload は UTF-8 として読み取り、パディングの省略を受け付けます。署名が空のトークンも表示できます。トークンは保存・送信されません。

デコードでは署名を検証しません。「valid」は、この端末の時計で有効期限を過ぎていないことだけを示します。

デコード結果 Header と Payload は強調表示した JSON です。それぞれの「コピー」は日付注記を含めず、空白 2 個のインデントで JSON をコピーします。Signature は生の Base64URL 文字列で、署名検証は行いません。
時刻クレーム Payload の数値の exp・iat・nbf に UTC の日付を付記します。同名のネストしたフィールドも対象です。値の単位は秒です。exp だけに端末の時計に基づく valid または EXPIRED を付けます。署名検証ではありません。

デコードすると Header、Payload、生の Signature がここに表示されます。

詳しいガイドを読む JWTデコード完全ガイド:JSON Web Tokenの仕組みとセキュリティ
例・詳しい説明・よくある質問 実際の出力つきの例、ほかのツールとの違い、よくある質問。

例:LINE ログインの ID トークンを読む

LINE Developers の「IDトークンからプロフィール情報を取得する」によると、LINE ログインの ID トークンは JWT で、ウェブログインでは HS256(検証用の鍵はチャネルシークレット)、ネイティブアプリや LINE SDK、LIFF アプリでは ES256 で署名されます。下のトークンは、このページに載っているペイロードの例をそのまま使い、デモ用の文字列 demo-channel-secret で HS256 署名したものです。実際のチャネルとは関係ありません。

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwczovL2FjY2Vzcy5saW5lLm1lIiwic3ViIjoiVTEyMzQ1Njc4OTBhYmNkZWYxMjM0NTY3ODkwYWJjZGVmIiwiYXVkIjoiMTIzNDU2Nzg5MCIsImV4cCI6MTUwNDE2OTA5MiwiaWF0IjoxNTA0MjYzNjU3LCJub25jZSI6IjA5ODc2NTRhc2RmIiwiYW1yIjpbInB3ZCJdLCJuYW1lIjoiVGFybyBMaW5lIiwicGljdHVyZSI6Imh0dHBzOi8vc2FtcGxlX2xpbmUubWUvYUJjZGVmZzEyMzQ1NiJ9.5bqWZz1LSji2XkaXdR0_FS3Q_9E7Ocl9GF-B848uw70

Payload には次の JSON が表示されます(「コピー」でも同じ内容がコピーされ、日付注記は含まれません)。

{
  "iss": "https://access.line.me",
  "sub": "U1234567890abcdef1234567890abcdef",
  "aud": "1234567890",
  "exp": 1504169092,
  "iat": 1504263657,
  "nonce": "0987654asdf",
  "amr": [
    "pwd"
  ],
  "name": "Taro Line",
  "picture": "https://sample_line.me/aBcdefg123456"
}

exp の横には Thu, 31 Aug 2017 08:44:52 GMT — EXPIRED、iat の横には Fri, 01 Sep 2017 11:00:57 GMT と表示されます。日本時間に直すと、有効期限は 2017 年 8 月 31 日 17:44:52、生成時刻は 9 月 1 日 20:00:57 です。ドキュメントの例の値では、有効期限が生成時刻より約 26 時間前になっています。デコーダーは値の前後関係を検査しないので、こうした不自然さは日付を見て自分で気づく必要があります。

同じページには、LINE プラットフォームから直接受け取ったものでない ID トークンは、サーバーで検証するよう書かれています。検証用のエンドポイント(https://api.line.me/oauth2/v2.1/verify)も用意されています。このツールで中身を見られても、トークンが本物かどうかはわかりません。

例:日本語のクレームと日本時間

社内システムのトークンに日本語の氏名や役職が入っている例です。デモ用の秘密鍵 zerotool-demo-secret-ja で署名しました。exp は日本時間 2026 年 10 月 5 日 18:00 です。

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJ1c2VyLTAwNDIiLCJuYW1lIjoi5bGx55Sw5aSq6YOOIiwicm9sZSI6IuW6l-iIl-euoeeQhuiAhSIsImV4cCI6MTc5MTE5MDgwMH0.gq6FePfJmLKXKvgYkH3wmwbW8UegjMT3Hed2yipfQOE
{
  "sub": "user-0042",
  "name": "山田太郎",
  "role": "店舗管理者",
  "exp": 1791190800
}

日本時間の 10 月 5 日 9:00 に開くと、exp の横は Mon, 05 Oct 2026 09:00:00 GMT — valid です。GMT の 09:00 に 9 時間足した 18:00 が日本時間の期限です。18:00 を過ぎてから開くと EXPIRED に変わります。日本語が文字化けしないのは、Base64URL をバイト列に戻してから UTF-8 として読むためです(閉じた環境以外でやり取りする JSON は UTF-8 にすると RFC 8259 §8.1 で決まっています)。

貼り付けでよくある失敗

リクエストヘッダーを行ごとコピーすると、トークンの前に Authorization: Bearer まで入ります。この形のまま「デコード」を押すと、状態欄に Base64URL デコードに失敗しました。 と表示されます。eyJ から始まる部分だけを貼り付けてください。空白を含むので、300 ミリ秒後の自動デコードも動きません。

暗号化された JWE は 5 つの部分からなり、鍵がないと中身を読めません(RFC 7516 §3)。5 つの部分がある入力では 無効な JWT:3 つのパートが必要です。実際: 5. と表示されます。

制限

  • トークンの途中の改行と、その前後の空白・タブは無視します。ログやメールで折り返されたトークンもそのままデコードでき、状態欄には デコードしました。 と表示されます。Header や Payload の途中にあるそれ以外の空白・タブはデコード失敗になります。
  • 日付を表示するのは、値が数値(秒)の exp・iat・nbf だけです。ネストしたオブジェクトの同名フィールドにも付きます。元の数値はそのまま表示し、日付注記は秒単位までです。ミリ秒の値を入れると、数万年先の日付になります。
  • 「valid」「EXPIRED」、署名欄の「not verified」、「(unable to parse)」はどの言語のページでも英語です。
  • デコードはできても JSON でない部分は「(unable to parse)」と表示されます。
  • 署名は検証しません。サーバー側では、発行元の鍵で署名を検証したうえで exp・nbf・iss・aud を確認してください(RFC 8725 §3)。
  • トークンはどこにも保存しません。JWT はログインの資格情報そのものであることが多いため、このページは解析・広告のスクリプトを読み込みません。

JWTについて

JWT はウェブアプリケーションの認証・認可で広く使われています。ユーザーがログインするとサーバーが JWT を発行し、クライアントはその後のリクエストで JWT を Authorization ヘッダーに入れて送ります。デバッグ中にトークンの中身(ユーザー ID、ロール、有効期限など)を確かめたいときにこのツールを使います。テスト用に自分でクレームを決めたトークンを作るには JWT ジェネレーター / 署名ツールが使えます。

FAQ

貼り付けた JWT はサーバーに送信・保存されますか?

いいえ。デコードはブラウザ内の JavaScript で行い、トークンをサーバーに送信することも、ブラウザのストレージに保存することもありません。このページは Google Analytics と AdSense を読み込みません。

署名の検証はできますか?

できません。署名の検証には発行元の秘密鍵または公開鍵が必要です。このツールは Header と Payload をデコードして表示し、Signature は生の文字列のまま表示します。クレームの中身を確認する用途に使ってください。

JWT の 3 つの部分は何ですか?

JWT は Base64URL でエンコードした 3 つの部分をドット(.)でつないだ文字列です。Header(署名アルゴリズムとトークンの種類)、Payload(クレーム)、Signature(改ざんされていないかを確かめるための値)です。

Payload の exp は何を表しますか?

exp は有効期限のクレームで、値は秒単位の UNIX 時間です。このツールは元の数値の横に読める日付を表示し、端末の時計と比べて valid または EXPIRED を付けます。

表示される時刻が日本時間より 9 時間早いのはなぜですか?

日付注記は端末のタイムゾーンに関係なく、常に UTC(GMT と表記)で表示します。日本時間は UTC+9 なので 9 時間足して読みます。たとえばサンプルの Thu, 18 Jan 2018 01:30:22 GMT は、日本時間の 2018 年 1 月 18 日 10:30:22 です。valid/EXPIRED の判定は秒数どうしを比べるので、タイムゾーンの影響は受けません。