JWTデコーダー【無料・登録不要】ヘッダー・ペイロードを表示|有効期限を日本時間で確認
JWT(JSON Web Token)を貼り付けるだけで、ヘッダー・ペイロード・署名の 3 つに分けて表示できる無料ツールです。中身の JSON は見やすく整形し、有効期限(exp)や発行日時(iat)は日本時間に変換して、期限が切れているかどうかも判定します。
このツールは署名の検証はしません。中身を読みやすく表示するだけなので、トークンが本物かどうかの確認には使えません。また、入力したトークンはお使いのブラウザの中だけで処理し、サーバーには一切送信しませんが、本番環境で使っている有効なトークンは貼り付けないでください(理由は「JWT を使うときのセキュリティの注意点」で説明します)。
署名は検証していません。このツールは JWT の中身を読みやすく表示するだけです。表示された内容が本物かどうか(改ざんされていないか)の確認にはなりません。
本番環境のトークンは貼り付けないでください。有効なトークンは、パスワードと同じようにそれだけでログインした状態として使えてしまいます。テスト用か、有効期限が切れたトークンで試してください。
色分け表示
ヘッダー(HEADER)
ペイロード(PAYLOAD)
有効期限と発行日時(日本時間)
署名(SIGNATURE)
署名は検証していません。正しい署名かどうかは、鍵を持っているサーバー側で確認する必要があります。
日時は、お使いのパソコンのタイムゾーン設定にかかわらず日本時間(UTC+9)で表示します。入力したトークンはブラウザ内だけで処理し、サーバーへの送信や保存は一切行いません。
使い方
- 入力欄に JWT を貼り付けます。貼り付けると同時にデコード(元の形に戻すこと)され、結果が表示されます。
- 「色分け表示」で、トークンのどこがヘッダー・ペイロード・署名なのかを確認できます。
- 「ヘッダー」と「ペイロード」に、整形した JSON が表示されます。「ヘッダーをコピー」「ペイロードをコピー」でコピーできます。
- 「有効期限と発行日時(日本時間)」で、exp・nbf・iat の日時と、期限が切れているかどうかを確認します。
試しに使ってみたいときは、「サンプルを入れる」を押してください。有効期限の判定は、デコードした時点の時刻で行います。しばらく画面を開いたままにしたときは、「現在時刻で判定し直す」を押すと、今の時刻で判定し直します。
次のような形のまま貼り付けても読み取れます。
- HTTP の Authorization ヘッダーからコピーした「Bearer eyJ…」の形(先頭の「Bearer 」を取り除きます)
- 途中で改行が入ったトークン(改行や空白を取り除きます)
- 前後をダブルクォート「”」で囲んだトークン(引用符を取り除きます)
形式が正しくないときは、「ピリオドで区切られた部分が 2 つしかありません」「ヘッダーが JSON として正しくありません」のように、原因を日本語で表示します。
JWTとは?
JWT(JSON Web Token、「ジョット」と読むこともあります)は、「この利用者は誰か」「いつまで有効か」といった情報を JSON で書き、改ざんを見破れるように署名を付けて 1 つの文字列にしたものです。仕様は RFC 7519 で定められています。
よく使われるのは、Web API のログイン状態の受け渡しです。ログインに成功するとサーバーが JWT を発行し、ブラウザやアプリはそれ以降のリクエストで、HTTP の Authorization ヘッダーに「Bearer トークン」の形で JWT を付けて送ります。サーバーは署名を確かめるだけで、誰からのリクエストかを判断できます。OpenID Connect の ID トークンも JWT の形をしています。
ペイロードに書く 1 つ 1 つの項目を「クレーム」と呼びます。RFC 7519 では、次の 7 つのクレームの名前と意味が決められています(どれも必須ではありません)。
| クレーム | 名前の由来 | 意味 |
|---|---|---|
| iss | Issuer | トークンを発行した者 |
| sub | Subject | トークンの対象(利用者の ID など) |
| aud | Audience | トークンを受け取るべき相手 |
| exp | Expiration Time | 有効期限。この日時以降は受け付けてはいけない |
| nbf | Not Before | この日時より前は受け付けてはいけない |
| iat | Issued At | 発行した日時 |
| jti | JWT ID | トークンを区別するための ID |
exp・nbf・iat の日時は、1970 年 1 月 1 日 0 時 0 分 0 秒(UTC)からの秒数で書きます。これは Unix 時間と呼ばれる数え方で、たとえば 1700000000 は日本時間の 2023 年 11 月 15 日 7 時 13 分 20 秒です。Unix 時間と日時の変換は、「Unix時間変換ツール」でも確認できます。
JWT の構造
JWT は、ピリオド「.」で区切られた 3 つの部分からできています。
ヘッダー.ペイロード.署名
| 部分 | 中身 | 例(デコードしたもの) |
|---|---|---|
| ヘッダー | 署名の方式(alg)やトークンの種類(typ)を書いた JSON | {“alg”:”HS256″,”typ”:”JWT”} |
| ペイロード | 利用者の ID や有効期限などのクレームを書いた JSON | {“sub”:”1234567890″,”exp”:4102412400} |
| 署名 | 「ヘッダー.ペイロード」の文字列に、鍵を使って計算した値 | (バイナリのデータ) |
3 つの部分は、どれも Base64URL という方法で、英数字と「-」「_」だけの文字列に変換されています。Base64URL は、Base64 の「+」を「-」に、「/」を「_」に置き換え、末尾の「=」を省いたもので、URL の中に入れても問題が起きないようにした書き方です。JWT の多くが「eyJ」で始まるのは、ヘッダーが {“alg” のように「{“」と英字で始まる JSON で、これを Base64URL にすると先頭が「eyJ」になるためです。Base64 の仕組みは「Base64とは?」で解説しています。
RFC 7519 に例として載っている次のトークンをこのツールに貼ると、ヘッダーは {“typ”:”JWT”,”alg”:”HS256″}、ペイロードは iss が “joe”、exp が 1300819380(日本時間の 2011 年 3 月 23 日 3 時 43 分 0 秒)と表示され、有効期限切れと判定されます。
eyJ0eXAiOiJKV1QiLA0KICJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJqb2UiLA0KICJleHAiOjEzMDA4MTkzODAsDQogImh0dHA6Ly9leGFtcGxlLmNvbS9pc19yb290Ijp0cnVlfQ.dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk
署名の方式(alg)
ヘッダーの alg には、署名の計算方法を書きます。よく使われるのは次の方式です(RFC 7518)。
| alg | 方式 | 鍵 |
|---|---|---|
| HS256 / HS384 / HS512 | HMAC と SHA-2 | 発行する側と検証する側が、同じ秘密鍵を持つ |
| RS256 / RS384 / RS512 | RSA 署名(RSASSA-PKCS1-v1_5)と SHA-2 | 秘密鍵で署名し、公開鍵で検証する |
| PS256 / PS384 / PS512 | RSA 署名(RSASSA-PSS)と SHA-2 | 秘密鍵で署名し、公開鍵で検証する |
| ES256 / ES384 / ES512 | ECDSA(楕円曲線暗号)と SHA-2 | 秘密鍵で署名し、公開鍵で検証する |
| none | 署名なし | なし(誰でも作れるので、特別に許可した場合以外は受け付けてはいけない) |
5 つに区切られたトークン(JWE)
ピリオドで 5 つに区切られたトークンは、中身を暗号化した JWT(JWE、RFC 7516)です。「ヘッダー.暗号化された鍵.初期化ベクトル.暗号文.認証タグ」の形をしていて、ペイロードは鍵がないと読めません。このツールに貼ると JWE であることを表示し、暗号化されていないヘッダーだけを表示します(復号はしません)。
JWT を使うときのセキュリティの注意点
ペイロードは誰でも読める
署名付きの JWT(3 つの部分のもの)のペイロードは、暗号化されていません。Base64URL は文字の置き換えにすぎず、このツールのように誰でも元に戻せます。パスワードや個人情報など、他人に見られて困る情報はペイロードに入れないでください。
受け取る側は、必ず署名を検証する
ペイロードは誰でも書き換えられます。書き換えを見破れるのは署名だけなので、JWT を受け取るサーバーは、デコードして中身を読むだけでなく、必ず鍵を使って署名を検証してください。検証には、自分で処理を書かずに、広く使われている JWT のライブラリを使うのが安全です。
alg は受け取る側で決めておく
ヘッダーの alg も、送る側が自由に書き換えられます。alg を「none」(署名なし)に書き換えたトークンを受け付けてしまったり、公開鍵で検証するはずの RS256 のトークンを HS256 に書き換えられ、公開鍵を秘密鍵として使って検証してしまったりする攻撃が知られています。JWT の安全な使い方をまとめた RFC 8725 でも、JWT のライブラリは使ってよい alg を利用する側が指定できるようにし、それ以外の alg は使ってはいけないとされています。受け取る側は、使ってよい alg を決めておき、それ以外は受け付けないようにしましょう。
有効期限を短くし、トークンを漏らさない
JWT は、持っている人をその利用者として扱うための文字列なので、盗まれると有効期限が切れるまで悪用されるおそれがあります。exp で有効期限を短めに設定し、exp と nbf を受け取る側で必ず確認してください。また、本番環境のトークンを、ログやチャット、使い方のわからない Web サイトに貼り付けないようにしましょう。このツールは入力内容を送信しませんが、確認に使うのは、テスト用か期限切れのトークンにするのが安全です。
よくある質問
入力したデータは保存されませんか?
保存されません。デコードはすべてお使いのブラウザの中で行われ、サーバーへの送信も保存も行いません。ページを閉じると入力内容は消えます。とはいえ、本番環境の有効なトークンは、どのツールであっても貼り付けないようにするのが安全です。
署名が正しいかどうかは確認できますか?
できません。このツールは署名の検証をしないため、表示された内容が本物かどうか(改ざんされていないか)はわかりません。署名の検証は、鍵を持っているサーバー側で、JWT のライブラリを使って行ってください。
「有効期限内」と表示されれば、使えるトークンですか?
そうとは限りません。このツールの判定は、トークンに書かれた exp と nbf を、お使いのパソコンの現在時刻と比べただけのものです。実際に使えるかどうかは、サーバーでの署名の検証や、発行元(iss)・受け取る相手(aud)の確認、ログアウトなどで無効にされていないかによって決まります。また、パソコンの時計がずれていると、判定もずれます。
日時が 9 時間ずれていませんか?
exp などの値は UTC(世界の基準の時刻)で数えた秒数で、このツールはそれに 9 時間を足した日本時間で表示します。お使いのパソコンのタイムゾーン設定には左右されません。UTC で確認したいときは、値を「Unix時間変換ツール」に貼ると、日本時間と UTC を並べて表示できます。
日本語の入ったペイロードも表示できますか?
表示できます。JWT のヘッダーとペイロードは UTF-8 の文字として扱う決まりなので、このツールも UTF-8 として読み取ります。サンプルのトークンにも、name に「山田太郎」が入っています。
「alg が none です」と表示されました
署名のないトークンです。誰でも中身を自由に書き換えて作れるため、ログインなどの確認には使えません。受け取る側のプログラムで alg が none のトークンを受け付けていないか、確認してください。
関連する記事・ツール
- Base64とは?仕組み・暗号化との違い・よくある使い方をわかりやすく解説
- Base64エンコード・デコードツール【無料・登録不要】日本語・ファイル対応
- JSON整形ツール【無料・登録不要】インデント・圧縮・構文チェック|エラー箇所を日本語で表示
- Unix時間変換ツール【無料・登録不要】タイムスタンプ⇔日本時間・UTC・ISO 8601
- ハッシュ生成(SHA-256 など)