開発ツール

JWTデコーダー【無料・登録不要】ヘッダー・ペイロードを表示|有効期限を日本時間で確認

JWTデコーダー【無料・登録不要】ヘッダー・ペイロードを表示|有効期限を日本時間で確認
engblog-poster

JWT(JSON Web Token)を貼り付けるだけで、ヘッダー・ペイロード・署名の 3 つに分けて表示できる無料ツールです。中身の JSON は見やすく整形し、有効期限(exp)や発行日時(iat)は日本時間に変換して、期限が切れているかどうかも判定します。

このツールは署名の検証はしません。中身を読みやすく表示するだけなので、トークンが本物かどうかの確認には使えません。また、入力したトークンはお使いのブラウザの中だけで処理し、サーバーには一切送信しませんが、本番環境で使っている有効なトークンは貼り付けないでください(理由は「JWT を使うときのセキュリティの注意点」で説明します)。

署名は検証していません。このツールは JWT の中身を読みやすく表示するだけです。表示された内容が本物かどうか(改ざんされていないか)の確認にはなりません。

本番環境のトークンは貼り付けないでください。有効なトークンは、パスワードと同じようにそれだけでログインした状態として使えてしまいます。テスト用か、有効期限が切れたトークンで試してください。

日時は、お使いのパソコンのタイムゾーン設定にかかわらず日本時間(UTC+9)で表示します。入力したトークンはブラウザ内だけで処理し、サーバーへの送信や保存は一切行いません。

使い方

  1. 入力欄に JWT を貼り付けます。貼り付けると同時にデコード(元の形に戻すこと)され、結果が表示されます。
  2. 「色分け表示」で、トークンのどこがヘッダー・ペイロード・署名なのかを確認できます。
  3. 「ヘッダー」と「ペイロード」に、整形した JSON が表示されます。「ヘッダーをコピー」「ペイロードをコピー」でコピーできます。
  4. 「有効期限と発行日時(日本時間)」で、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 つのクレームの名前と意味が決められています(どれも必須ではありません)。

クレーム名前の由来意味
issIssuerトークンを発行した者
subSubjectトークンの対象(利用者の ID など)
audAudienceトークンを受け取るべき相手
expExpiration Time有効期限。この日時以降は受け付けてはいけない
nbfNot Beforeこの日時より前は受け付けてはいけない
iatIssued At発行した日時
jtiJWT 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 / HS512HMAC と SHA-2発行する側と検証する側が、同じ秘密鍵を持つ
RS256 / RS384 / RS512RSA 署名(RSASSA-PKCS1-v1_5)と SHA-2秘密鍵で署名し、公開鍵で検証する
PS256 / PS384 / PS512RSA 署名(RSASSA-PSS)と SHA-2秘密鍵で署名し、公開鍵で検証する
ES256 / ES384 / ES512ECDSA(楕円曲線暗号)と 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 のトークンを受け付けていないか、確認してください。

関連する記事・ツール

ABOUT ME
hr
hr
エンジニアとして働いている hr です。仕事や資格勉強で「こんなツールがあれば」と感じたものを、無料Webツールと解説記事にして発信しています。
記事URLをコピーしました