アップロードなし, 100%ローカル, アカウントなし

ハウツー

JWTを漏らさずにデコードする方法

JSON Web Tokenには実際のデータが入っています。発行先のユーザー、付与されるスコープ、有効期限などです。これを適当なオンラインデコーダーに貼り付けるのは、そのデータと、多くの場合まだ有効なセッションを、自分の管理外のサーバーに渡すことを意味します。下のデコーダーは完全にブラウザ内で動作するため、トークンの中身を読み、期限切れかどうかを確認し、シークレットがわかればHMAC署名を検証できます。しかもタブから一度もネットワーク通信を出すことなく行えます。

手順

  1. JWTデコーダーを開き、トークンを入力欄に貼り付けます。JWTはドットでつながれた3つのBase64Urlの塊、つまりヘッダー、ペイロード、署名です。Bearerプレフィックスを付けても付けなくても貼り付けられ、ツールはどちらの形式でも構造を読み取り、形式が誤っていればすぐに知らせます。
  2. デコードされたヘッダーとペイロードを読みます。ヘッダーには署名アルゴリズム(例えばHS256やRS256)と、存在する場合はキーIDが表示されます。ペイロードにはクレームが並びます。トークンの対象者(sub)、発行者(iss)、各種タイムスタンプです。ツールは数値のiat、nbf、expフィールドを読みやすい日付に変換し、トークンがまだ有効か、すでに期限切れかを示します。
    ヘッダーのアルゴリズムと、読みやすい発行日・有効期限が付いたペイロードのクレームを表示するデコード済みJWT
  3. トークンがHS256を使っていて共有シークレットを持っているなら、それを検証欄に貼り付けてVerifyをクリックします。ツールはヘッダーとペイロードに対してHMACを再計算し、署名と比較するので、トークンが本物か改ざんされたかがわかります。RS256やES256のトークンでは、署名に手元にない秘密鍵を使うため、ツールはクレームを確認しますが署名を検証したとは主張しません。
    共有シークレットが入力されたHMAC検証欄と、HS256トークンの有効な署名バッジ

トークンを適当なサイトに絶対貼り付けてはいけない理由

JWTは暗号化されていません。ヘッダーとペイロードはBase64Urlでエンコードされているだけで、トークンを受け取った者は誰でも中身のすべてのクレームを読めます。メール、ユーザーID、ロール、内部フラグなどです。そのトークンが期限切れでないアクセストークンなら、それを持つ者は再利用して、期限が切れるまであなたになりすませます。有効なトークンをホスト型デコーダーに貼り付けると、それらすべてがそのサーバーのログに送られます。アップロードせず自分のマシンでトークンをデコードすることが、見られる範囲を広げずに中身を確認する唯一の方法です。デコード中にネットワークパネルを開けば、通信がゼロであることを確認できます。

署名でわかること、わからないこと

署名は、誰かがクレームを書き換えてそのまま通すことを防ぐものです。HS256トークンでは同じシークレットで署名と検証を行うため、シークレットがわかればここでトークンが本物であることを完全に確認できます。RS256やES256トークンでは、秘密鍵がトークンに署名し、対応する公開鍵だけが検証できます。秘密鍵は発行者から出ないため、クライアント側のツールはクレームを読めても、その公開鍵なしには署名を誠実に証明できません。署名が検証鍵の所有者によってチェックされるまで、デコードされたペイロードは発行者による主張であって証明ではないと扱ってください。シークレットを個別にハッシュ化したり比較したりするなら、このサイトのハッシュジェネレーターもローカルで動作します。

JWTの構造と各部分が示す情報

JWTはドットで区切られた3つのBase64urlエンコードセグメント(ヘッダー、ペイロード、署名)で構成されます。ヘッダーはトークンタイプ("JWT")とアルゴリズムを宣言します。最も一般的なのはHS256(HMAC-SHA-256、共有シークレット)またはRS256(RSA-SHA-256、公開/秘密鍵ペア)です。ペイロードは`sub`(サブジェクト、通常はユーザーID)、`iat`(発行日時のUnixタイムスタンプ)、`exp`(有効期限のUnixタイムスタンプ)、`aud`(対象オーディエンス)、ロールやスコープなどカスタムアプリケーションクレームを持ちます。Base64urlは暗号化ではありません。`+`を`-`に、`/`を`_`に置き換え、パディングを省略したURL安全なBase64の変形です。生のトークン文字列を持つ人は誰でも署名鍵なしにヘッダーとペイロードをデコードできます。署名セグメントのみが検証に鍵を必要とします。これが、外部のオンラインデコーダに稼働中の本番トークンを貼り付けることがセキュリティリスクとなる理由です。トークンの`exp`がまだ未来であり、サービスが入力をログに記録する場合、そのトークンが表すセッションが侵害される可能性があります。

このガイドで使うツール

よくある質問

デコードするとき、トークンはどこかのサーバーに送信されますか?

いいえ。デコーダーはトークンを分割し、ヘッダーとペイロードをBase64Urlデコードして、メモリ上に表示します。任意のHMACチェックにはブラウザ内蔵のWeb Crypto APIを使います。ネットワーク上を何も流れません。これはJWTが個人データとまだ有効なセッションを含むことが多いため重要です。デコード中にブラウザのネットワークパネルを開けば、リクエストが一切出ていないのがわかります。

このツールはRS256やES256の署名を検証できますか?

完全にはできませんし、できるふりもしません。HS256は署名と検証の両方に1つの共有シークレットを使うので、そのシークレットを貼り付ければツールがブラウザ内で署名を確認できます。RS256とES256は署名に秘密鍵、検証に別の公開鍵を使います。ツールはクレームと有効期限を読み取り検証しますが、チェックできない署名を主張することはしません。それらのトークンは、公開鍵を持つサービス側で検証してください。

出典