使い方
- トークン全体を貼り付けます。トークンは、ドットで区切られた 3 つの Base64URL 部分で構成されています。
- デコードされたヘッダーとペイロードを確認します。exp、iat、nbf の各クレームは日時で表示され、トークンが期限切れまたは有効期間前の場合は警告が表示されます。
- 署名を検証するには「署名を検証」を開き、HS256、HS384、HS512 の場合は共有シークレットを入力し、RS、PS、ES 系のアルゴリズムの場合は PEM 形式の公開鍵を貼り付けます。
- 発行者、対象者、主体の各クレームが、アプリケーションで想定している値と一致しているか確認します。
JWT の構造
JSON Web Token(RFC 7519)は、ドットで区切られた 3 つの部分 header.payload.signature で構成されます。ヘッダーとペイロードは、パディングなしの Base64URL でエンコードされた JSON オブジェクトです。そのため、トークンはほぼ必ず eyJ で始まります。これは先頭の {" をエンコードした形です。署名は、最初の 2 つの部分に対して、トークン内の文字列をそのまま使って計算されます。
- ヘッダー:
algに署名アルゴリズムが入り、通常は"typ": "JWT"も含まれます。鍵を識別するkidが入っていることもよくあります。 - ペイロード:ユーザーが誰か、誰がトークンを発行したか、いつ期限が切れるかといったクレームです。
- 署名:ヘッダーとペイロードが改ざんされていないことを証明する、HMAC、RSA、または ECDSA の署名です。
5 つの部分からなるトークンは暗号化された JWE で、復号鍵がなければ内容を読むことはできません。
登録済みクレーム
| クレーム | 名前 | 意味 |
|---|---|---|
iss | 発行者(Issuer) | トークンを作成し、署名した者 |
sub | 主体(Subject) | トークンが対象とする主体(通常はユーザー ID) |
aud | 対象者(Audience) | トークンの利用先となるサービス |
exp | 有効期限(Expiration Time) | これ以降はトークンを拒否しなければならない時刻 |
nbf | 有効開始日時(Not Before) | これより前はトークンを拒否しなければならない時刻 |
iat | 発行日時(Issued At) | トークンが作成された時刻 |
jti | JWT ID | リプレイの検出に使われる一意の識別子 |
時刻は NumericDate 値で、1970 年 1 月 1 日(UTC)からの経過秒数を表します。ミリ秒ではありません。このデコーダーは時刻を読みやすい日時で表示し、お使いのデバイスの時計と比較します。
デコードは検証ではありません
ペイロードはエンコードされているだけで暗号化されていないため、JWT は誰でもデコードできます。パスワードなどの秘密情報は決して入れないでください。信頼性は、正しい鍵で署名を確認することによってのみ得られます。トークンを受け付けるサーバーは、さらに次の対策も行う必要があります。
- 想定しているアルゴリズムだけを許可し、署名なしのトークンを示す
"alg": "none"は拒否します。 - HMAC と RSA のどちらを使うかをトークンのヘッダーに決めさせてはいけません。そうしないと、攻撃者がサーバーの公開鍵を HMAC のシークレットとして使い、偽造したトークンに署名できてしまいます。
- リクエストのたびに
exp、nbf、iss、audを確認します。
このページの検証機能(任意)は、ブラウザに組み込まれた Web Crypto API を使用します。デコードも検証もお使いのデバイス上で行われ、何もアップロードされません。一般的な原則として、信頼できない Web サイトに本番環境の署名鍵や有効なトークンを貼り付けることは絶対に避けてください。
よくある質問
このデコーダーに JWT を貼り付けても安全ですか?
トークンはブラウザ内の JavaScript でデコード・検証され、サーバーに送信されることはありません。ただし、有効期限内のトークンは、それを持っている人にとってパスワードと同じように機能します。スクリーンショットやログを共有する際は、テスト用または期限切れのトークンを使うことをおすすめします。
シークレットキーがなくても JWT をデコードできますか?
はい。ヘッダーとペイロードは Base64URL でエンコードされた単なる JSON なので、鍵がなくても読めます。シークレットや公開鍵が必要なのは、署名を検証するときだけです。
トークンが期限切れと表示されるのはなぜですか?
exp クレームの時刻が、お使いのデバイスの現在時刻より前になっているためです。トークンがまだ有効なはずであれば、システムの時計と、発行者が設定したトークンの有効期間を確認してください。どの署名アルゴリズムを検証できますか?
共有シークレットを使う HS256、HS384、HS512 と、PEM 形式の公開鍵を使う RS256、RS384、RS512、PS256、PS384、PS512、ES256、ES384、ES512 です。
"alg": "none" とはどういう意味ですか?
RFC 7518 で定義されている、署名が空の保護されていない JWT であることを示します。このようなトークンは誰でも作成・改変できるため、署名付きトークンを想定しているサーバーは必ず拒否しなければなりません。