JWTデコーダー
JSON Web Tokenをローカルでデコードし、シークレットまたは公開鍵で署名を検証。送信は一切ありません。
エンドポイントを試すために、自分でトークンに署名できます。計算はすべてこのページの中で行われます。
鍵も出来上がったトークンもブラウザーの中だけに残ります。どこにも送信されず、共有リンクにも含まれません。
このトークンを自分のコードで検証しましょう。サンプルはヘッダーのアルゴリズムに合わせて変わります。
JWTデコーダー - JSON Web Tokenをオンラインでデコード
JSON Web Tokenを貼り付けると、このデコーダーがトークンを3つの部分に分解し、ヘッダーとペイロードを読みやすいJSONとして表示します。認証のデバッグ中に出てくる疑問、つまり誰が発行したのか、誰宛てなのか、どのアルゴリズムで署名されているのか、すでに期限切れではないか、といった問いに最短で答えられます。
デコードはすべてブラウザー内で行われます。JWTは生きた資格情報であり、有効なトークンを入手した相手は期限切れまでその主体として振る舞えてしまうため、この点は他のツール以上に重要です。このページに貼り付けた内容がアップロード・記録・保存されることはありません。
JSON Web Tokenとは
JWTはドットでつながれた3つのBase64URLセグメント、header.payload.signatureで構成されます。ヘッダーは署名アルゴリズムを示し、ペイロードはクレーム、つまり発行者がユーザーやクライアントについて主張する内容を運び、署名は最初の2つの部分が鍵の保有者によって作られたことを証明します。ヘッダーとペイロードは暗号化ではなく符号化されているだけなので、誰でも読めます。保護されているのは署名だけです。
このページでJWTをデコードする手順
Authorization: Bearerヘッダー、Cookie、コールバックURL、APIクライアントのいずれかからトークンをコピーします。header.payload.signatureの全体を入力欄に貼り付けます。- デコードをクリックすると2つのJSONオブジェクトが表示されます。
- リクエストが拒否された場合は、まず
exp、次にaudとissを確認します。
このページでできること
入力しながらトークンが読み取られるので、ボタンに手を伸ばす前に両側の欄が埋まります。デコードされたヘッダーとペイロードの下では、各項目が何のためのものかを表で説明し、その上の行がexpとnbfを文に変えます。3日前に期限切れ、58分後に期限切れ、まだ有効ではありません。
- サンプルはデモ用のトークンとそのシークレットを読み込みます。自分のものを貼る前に、検証が通る様子を確かめられます。
- 検証には、シークレット、PEM形式の公開鍵、単体のJWK、JWKS全体のいずれも使えます。発行者の
/.well-known/jwks.jsonが返す文書を貼り付けると、トークンのkidが指す鍵が自動で選ばれ、ページ自身は相変わらずリクエストを一切送りません。さらに想定する発行者と想定するオーディエンスを入力すると、有効な署名もサーバーと同じように確認され、issが違うときやaudに入力値が含まれないときは結果が赤になります。 - トークンを作るは12種類のアルゴリズムのどれでも自分のトークンに署名します。JWTジェネレーターのページはこのタブで開きます。
- コードは、トークンのヘッダーにあるアルゴリズムに合わせて、サーバー側の検証を8つの言語で表示します。
- ほかに2つのページが、このツールを1つの問いに向けて開きます。期限切れかどうかとなぜ拒否されるのかです。
標準クレームとその意味
| クレーム | 意味 | つまずきやすい点 |
|---|---|---|
iss | 発行者。誰がトークンを作ったか | 検証環境のトークンを本番に送ると一致しません |
sub | サブジェクト。通常はユーザーIDやサービスID | 人ではなくクライアント向けに発行したトークンでは空になります |
aud | オーディエンス。受け取るべきAPI | 一見正しいトークンで401が返る最も多い原因です |
exp | UNIXタイムスタンプでの有効期限 | すでに過ぎている、またはサーバーの時刻がずれています |
nbf | この時刻より前は無効 | トークンを数秒早く使ってしまった場合に発生します |
iat | 発行時刻 | 最大有効期間のポリシーや失効ウィンドウの基準になります |
jti | トークンの一意なID | 特定のトークンだけを失効させるときに必要です |
デコードは検証ではありません
ここが最もつまずきやすい点です。トークンを読めば「何を主張しているか」は分かりますが、「その主張が本物か」は分かりません。検証とは、発行者のシークレットまたは公開鍵で署名を再計算して照合し、あわせて有効期限とオーディエンスを確認することです。どんなデコーダーも、偽造されたトークンのペイロードを本物と同じように表示します。したがって、デコード結果だけで認可を判断してはいけません。必ずサーバー側で、保守されているライブラリを使って検証してください。
動かないトークンの切り分け
- 有効そうなトークンで401:
audをAPIの期待値と、issを設定済みの発行者URLと比べます。両方を想定する発行者と想定するオーディエンスに入れて検証を押すと、トークンが実際に持つ値が結果に表示されます。 - すぐ期限切れになる:
expをUNIXタイムスタンプ変換ツールで変換し、手元のPCではなくサーバーの時刻と比較します。 - セグメント不正のエラー:トークンが途中で切れている、経路でURLエンコードされた、コピー時に改行が混入した、のいずれかです。
- 署名検証に失敗する:鍵がローテーションされた、誤ったキーIDを使った、別環境で署名された、といった原因が考えられます。
algがnone:拒否してください。これは署名なしトークンを示す値で、甘い検証を狙う古典的な攻撃です。
守っておきたいセキュリティ習慣
- 個人情報、内部ID、機密情報をペイロードに入れないでください。仕様上、誰でも読めます。
- アクセストークンは短命に保ち、長いセッションにはリフレッシュトークンを使います。
- トークンの送信はHTTPSのみとし、可能な範囲でブラウザーストレージよりsecure・HttpOnly属性のCookieを選びます。
- 署名鍵は計画的にローテーションし、クライアントが追随できるようJWKSエンドポイントで公開します。
- オンラインツールに貼り付けたトークンは漏えいしたものとみなしてください。このツールがどこにも送信しないのは、まさにそのためです。
ブラウザー内でオフライン動作します
デコーダーはクライアントサイドのJavaScriptです。ページを読み込んだあとはネットワーク接続がなくてもトークンをデコードでき、本番の資格情報が端末の外に出ることはありません。
コードやコマンドラインでJWTをデコードする
| 場所 | 方法 |
|---|---|
| JavaScript (npm) | import { jwtDecode } from 'jwt-decode'; jwtDecode(token) - ペイロードのみ、検証なし |
| Python (PyJWT) | 読むだけなら jwt.decode(token, options={'verify_signature': False})、検証するなら鍵を渡す |
| Bash | echo $TOKEN | cut -d. -f2 | tr '_-' '/+' | base64 -d 2>/dev/null - Base64URLはパディングを省くため、短いペイロードでは末尾に == が必要な場合がある |
| ブラウザのコンソール | JSON.parse(atob(token.split('.')[1].replace(/-/g, '+').replace(/_/g, '/'))) |
これらはどれも署名を確認せずにトークンを読みます。デバッグには十分ですが、認可の判断に使うのは誤りです。上のセクションを参照してください。
関連ツール
トークンは複数の形式の交差点にあります。生のセグメントはBase64デコーダーで読み、ペイロードはJSON整形ツールで見やすくし、expやiatはタイムスタンプ変換ツールで日付に直し、URLから取り出したトークンはURLデコードツールで整えられます。