JWTデコーダー
JSON Web Tokenを貼り付けると、ヘッダーとペイロードを整形済みのJSONで表示します。有効期限と発行時刻は日時に変換され、トークンが現在有効かどうかも確認できます。デコードはすべてブラウザ内で行われるため、実際に使用中の認証情報であるトークンも安心して扱えます。
0 文字 · 0 語 · 0 行
0 文字 · 0 語 · 0 行
すべてこのブラウザのタブ内で処理されます。テキストがアップロードされたり保存されたりすることはありません。
登録済みクレーム
RFC 7519 §4.1 で定義されている7つのクレーム名です。すべて任意で、時刻は 1970-01-01 UTC からの秒数です。
| クレーム | 意味 |
|---|---|
iss | 発行者:トークンを作成し署名した主体 |
sub | 主体:トークンの対象となるユーザーまたはエンティティ |
aud | 受信者:トークンの宛先 |
exp | 有効期限:この時刻以降はトークンを拒否 |
nbf | 有効開始時刻:この時刻より前はトークンを拒否 |
iat | 発行時刻:トークンが作成された時刻 |
jti | JWT ID:リプレイ攻撃防止に使う一意の識別子 |
よく使われる alg の値
| alg の値 | 意味 |
|---|---|
HS256 | SHA-256 を使う HMAC。1つの共有秘密鍵で署名と検証を行う |
RS256 | SHA-256 を使う RSA PKCS#1 v1.5 署名。秘密鍵で署名し、公開鍵で検証 |
PS256 | SHA-256 を使う RSA-PSS |
ES256 | P-256 曲線上の ECDSA と SHA-256。署名が短い |
EdDSA | Ed25519 または Ed448 の署名 |
none | 署名なしのトークン。サーバーは拒否すべきです |
JSON Web Tokenの構造
JWTはRFC 7519(2015年5月)で定義されており、英語の「jot」のように発音することが推奨されています。一般的な署名付きの形式は、ドットでつないだ3つのBase64url文字列(header.payload.signature)です。ヘッダーにはalgで署名アルゴリズム(HS256やRS256など)が、kidで鍵IDが指定されていることもあります。ペイロードにはクレームが入ります。クレームはJSONのフィールドで、sub(ユーザー)、iss(発行者)、aud(想定される受信者)、そして1970年1月1日 UTCからの秒数で表されるexp、nbf、iatなどがあります。このデコーダーはこれらをローカル時刻とISO 8601に変換し、トークンが期限切れか、まだ有効でないか、有効期間内かを表示します。
Base64urlはエンコードであって暗号化ではないため、トークンを持っている人なら誰でも、このページと同じようにペイロードを読めます。パスワードやカード番号などの秘密情報は、クレームに入れないでください。ドットで区切られた5つの部分からなるトークンはJWE(暗号化トークン)で、鍵がなければ内容を読めません。その場合はデコーダーがその旨を表示します。Authorizationヘッダーからコピーした先頭の「Bearer 」は自動的に取り除かれます。
ここで署名を検証しない理由
署名は、ヘッダーとペイロードが鍵の保持者によって作られ、その後に改ざんされていないことを証明するものです。検証にはその鍵が必要で、HS256などのHMAC系アルゴリズムでは共有シークレット、RS256、ES256、EdDSAでは発行者の公開鍵を使います。本番の署名シークレットをWebページに貼り付けるのは避けるべきですし、鍵なしでトークンを保証するかのように見せるデコーダーは誤った安心感を与えます。そのため、このツールは署名を表示しますが検証はしません。表示される内容は事実ではなく、トークンが主張している内容として扱ってください。
検証はサーバー側で、メンテナンスされているライブラリを使い、想定するアルゴリズムを固定して行うべきです。過去の代表的な2つの失敗がその理由です。1つはalg「none」を受け入れてしまい、誰でも署名なしのトークンを偽造できる問題。もう1つはアルゴリズム混同で、RS256を想定しているサーバーが、公開鍵をHMACのシークレットとして使うHS256署名を検証させられてしまう問題です。デコーダーはデバッグ用です。プロバイダーがどんなクレームを発行しているかの確認、audの間違いの発見、exp が1分前に過ぎたせいでセッションが失敗したと突き止める、といった用途に向いています。Base64urlの各セグメントをそのまま読みたい場合は、Base64デコーダーをご利用ください。
よくある質問
- 本物のアクセストークンをJWTデコーダーに貼り付けても安全ですか?
- このページでは、トークンがブラウザの外に送信されることはありません。ただし有効なトークンは期限が切れるまでパスワードと同じように使えるため、期限切れやテスト用のトークンを使い、本番のトークンはスクリーンショットやチャットに載せないでください。
- 発行したばかりのトークンが期限切れと表示されるのはなぜですか?
- まず端末の時計を確認してください。アクセストークンの有効期間が数分しかない発行元もあり、ログからコピーしたトークンは見た目より古いことがあります。expを秒ではなくミリ秒で書いた場合は逆に、数千年先の日付になります。
- JWTのペイロードは他人に書き換えられますか?
- 編集して再エンコードすることはできますが、署名が一致しなくなります。正しい鍵とアルゴリズムで署名を検証するサーバーは、改ざんされたトークンを拒否します。
- JWSとJWEの違いは何ですか?
- JWS(RFC 7515)は署名付きで3つの部分からなり、誰でも読めます。JWE(RFC 7516)は暗号化されていて5つの部分からなり、ペイロードを読めるのは鍵の保持者だけです。
- ログアウトするとJWTは無効になりますか?
- それだけではできません。サーバーが拒否リストを持つか、セッション記録を確認しない限り、署名付きJWTはexpまで有効なままです。そのためアクセストークンの有効期間は通常短く設定されます。