JWT デコーダーの使い方
- 「JWT を貼り付け」欄にトークンを入力します。Authorization ヘッダーからコピーした「Bearer 」は自動で取り除きます。
- ヘッダー(署名アルゴリズムと種類)とペイロード(クレーム)が整形された JSON で表示されます。
- 上部の表示で有効期限内かどうかを、「登録済みクレーム」の表で発行者や対象者、各種日時を確認します。
- 試すときは「サンプルを読み込む」を押すと、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 に送るのはアクセストークンだけにしてください。
最終更新: ソースコードを見る