JWT デコーダー

JWT を貼り付けると、ヘッダーとペイロードを整形した JSON で表示します。exp や iat などの時刻は端末のタイムゾーン(日本なら日本時間)の日時に変換し、期限切れかどうかもリアルタイムで表示します。

このツールは中身をデコードするだけで、署名の検証は行いません。JWT は誰でもデコードできるため、パスワードなどの機密情報を入れないでください。署名が正しいかどうかは、鍵を持つサーバー側で検証する必要があります。

JWT デコーダーの使い方

  1. 「JWT を貼り付け」欄にトークンを入力します。Authorization ヘッダーからコピーした「Bearer 」は自動で取り除きます。
  2. ヘッダー(署名アルゴリズムと種類)とペイロード(クレーム)が整形された JSON で表示されます。
  3. 上部の表示で有効期限内かどうかを、「登録済みクレーム」の表で発行者や対象者、各種日時を確認します。
  4. 試すときは「サンプルを読み込む」を押すと、1 時間後に期限が切れるトークンが表示されます。

JWT の構造

JWT(JSON Web Token、RFC 7519)は、Base64URL でエンコードした 3 つの部分を「.」でつないだ文字列で、「ヘッダー.ペイロード.署名」という構成です。ヘッダーには署名アルゴリズム(HS256 や RS256 など)、ペイロードにはユーザー ID や権限、有効期限などのクレーム、署名には前の 2 つが改ざんされていないことを確かめるための値が入ります。

ヘッダーとペイロードはエンコードされているだけで、暗号化はされていません。トークンを持っていれば誰でも中身を読めるので、パスワードや API の秘密鍵、重要な個人情報をペイロードに入れてはいけません。

exp・iat・nbf など登録済みクレームの意味

RFC 7519 では標準のクレーム名が決められています。iss は発行者(認証サーバー)、sub は主体(多くはユーザー ID)、aud は対象者(トークンを受け取る API)、jti はトークンごとの一意な ID で、再利用攻撃の防止に使われます。

exp(有効期限)、nbf(有効開始日時)、iat(発行日時)は、1970 年 1 月 1 日 0 時(UTC)からの「秒数」です。JavaScript の Date.now() はミリ秒なので、そのまま exp に入れると何万年も先まで有効なトークンになってしまうという不具合がよく起こります。このツールでは元の数値と、日本時間などローカル時刻に変換した日時を並べて表示します。

デコードと署名検証は別物

デコードは「トークンに何が書いてあるか」を見るだけで、「信頼できる発行者が作ったか」を確かめるには署名の検証が必要です。HS256 なら共有の秘密鍵、RS256 や ES256 なら発行者の公開鍵(多くは /.well-known/jwks.json などの JWKS エンドポイントで公開)を使い、Node.js なら jose、Python なら PyJWT などのライブラリで検証します。

ヘッダーの alg が none のトークンには署名がありません。サーバーは必ず拒否する必要があり、これを受け入れてしまうのは初期の JWT ライブラリでよく知られた脆弱性でした。

JWT が使われている場面

Google、Microsoft Entra ID、Auth0、Amazon Cognito、Firebase Authentication などが発行する OpenID Connect の ID トークンや、多くの OAuth 2.0 のアクセストークンが JWT です。API が 401 エラーを返すときは、デコードして aud が API と一致しているか、iss が想定どおりか、期限が切れていないか、必要なスコープやロールが含まれているかを確認すると原因を見つけやすくなります。

よくある質問

本番のトークンを貼り付けても大丈夫ですか?

トークンはブラウザ内だけでデコードされ、どこにも送信されません。ただし有効なアクセストークンは期限が切れるまでパスワードと同じ働きをするため、管理外のサイトに本番のトークンを貼り付けるのは避けるのが無難です。

署名が正しいかどうかも確認できますか?

できません。検証には秘密鍵や公開鍵が必要で、それはサーバー側だけが持つべきものです。このツールではアルゴリズムと署名の値を表示しますが、正しいかどうかの判定は行いません。

exp の数値を日時に変換するには?

exp は 1970 年 1 月 1 日(UTC)からの秒数です。JavaScript なら 1,000 倍して new Date() に渡します。このツールに貼り付ければ、自動で日本時間などローカル時刻の日時に変換して表示します。

「暗号化された JWT(JWE)」と表示されました。

JWE は 5 つの部分からなり、ペイロードが暗号化されているため、復号用の鍵がないと中身を読めません。通常の署名付き JWT(JWS)は 3 つの部分からなります。

「まだ有効ではありません」と表示されるのはなぜですか?

nbf(有効開始日時)が未来の時刻になっています。発行したサーバーの時計が進んでいる場合によく起こるため、多くのライブラリは 30〜60 秒程度の時刻のずれを許容する設定を持っています。

ID トークンとアクセストークンの違いは何ですか?

ID トークン(OpenID Connect)はアプリに「誰がログインしたか」を伝えるためのもので、アクセストークンは API を利用する権限を表すものです。どちらも JWT であることが多いですが、API に送るのはアクセストークンだけにしてください。

最終更新: ソースコードを見る