m moji kit v1.0.9
JWT
検査

JWT デコーダ

JWT (JSON Web Token) を header / payload / signature の 3 部に分解してデコード表示します。標準クレーム (iss / sub / aud / iat / nbf / exp) のラベル補足と有効期限判定にも対応。鍵をクライアントに置けないため署名検証は行いません。

サンプル

注目クレーム

よく使う組み合わせ

→ JSON フォーマッタ JWT → JSON 整形 次へ

こんなときに使う

API レスポンスで返ってきたトークンの中身を確認する

OAuth / OIDC のフローで取得した access_token や id_token の payload を見て、scope や sub が想定通りか確認します。

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

exp(有効期限)切れかチェックする

401 が返るときに、トークンが期限切れなのか別の理由なのかを切り分けます。本ツールは exp を Unix 時刻からローカル時刻に変換して期限切れかも併せて表示します。

ID プロバイダから期待した claim が含まれているか確認する

Auth0 / Cognito / Keycloak などのカスタムクレーム(roles / groups など)が想定通りに乗っているかを目視確認します。

ライブラリ越しではなく直接トークンを見る

認証ライブラリが裏でトークンを取り扱う場合、生のトークン文字列を直接デコードして問題を切り分けます。

アルゴリズム(alg)の確認

header の alg が HS256 / RS256 / ES256 のどれか、あるいは none になっていないかを確認します。none は脆弱性の元になるためアラート対象です。

kid(鍵 ID)から JWKS のどの鍵で検証すべきかを把握する

header の kid を見て、IdP の jwks_uri から対応する公開鍵を引きにいく流れに使えます。

よくあるエラーと対処

ERR JWT は header.payload.signature の 3 部構成です(現在 N 部)
原因
貼り付けた文字列にドット . が 2 個含まれていません。コピーミスや改行混入が原因のことが多いです。
対処
全文を空白・改行を除いた 1 行で貼り直してください。Bearer プレフィックスが付いていれば外します。
ERR デコードエラー: Invalid character
原因
Base64Url のデコードに失敗しています。トークンが改行で切れている、ヘッダや payload に Base64Url 以外の文字が混入している等。
対処
トークンの完全な文字列を貼り直してください。URL エンコードされている場合は事前にデコードします。
ERR exp が期限切れと表示されるが API は通る
原因
サーバ側のクロックスキュー許容(leeway)で許されている、もしくは別のトークンが使われている可能性があります。
対処
実際にリクエストに乗っているトークンを確認してください。SDK のキャッシュやリフレッシュ周期にも要注意です。
ERR payload が JSON として表示されない
原因
Base64Url デコードはできたが、結果が JSON ではないトークン(独自形式)です。
対処
本ツールは標準 JWT を前提としています。仕様(OIDC / RFC 7519)に従っているか確認してください。

CLI / 他言語でやる方法

jq + base64
echo $TOKEN | cut -d. -f2 | base64 -d | jq .

URL-safe を考慮するなら tr '_-' '/+' でパディング補正後にデコード。

Python (PyJWT)
python -c "import jwt; print(jwt.decode(t, options={'verify_signature': False}))"

verify_signature=False で署名検証スキップ。

Node.js (jsonwebtoken)
node -e "console.log(require('jsonwebtoken').decode(token, {complete: true}))"

decode は検証なし。検証は verify を使う。

よくある質問

署名検証はできますか?
できません。検証には鍵が必要で、それをブラウザに置くと漏洩リスクがあるため意図的に行いません。サーバー側のライブラリ(jsonwebtoken / PyJWT など)で検証してください。
JWT はどう構造化されていますか?
header.payload.signature の 3 部構成で、各部分が Base64Url エンコードされています。header と payload は JSON、signature はバイナリ署名です。
どんなアルゴリズムが alg に来ますか?
代表は HS256(HMAC + SHA-256)、RS256(RSA + SHA-256)、ES256(ECDSA + SHA-256)。none は署名なしで脆弱性の元です。
iat / nbf / exp の単位は?
Unix 時刻(秒)です。ミリ秒ではありません。本ツールは ISO 8601 とローカル時刻に変換して表示します。
audience(aud)が配列のときは?
RFC 7519 で aud は文字列または文字列配列のどちらでも許可されています。本ツールはそのまま JSON 形式で表示します。
貼ったトークンが第三者に渡る心配はありますか?
本ツールはブラウザ内で完結し、トークンをサーバーへ送信しません。ただし他人と画面共有しているときや、ブラウザ拡張がページ内容を読み取れる場合のリスクには注意してください。
JWE(暗号化された JWT)には対応していますか?
未対応です。JWE は復号鍵が必要なので、ブラウザでは扱えません。署名のみの JWS 構造に対応しています。
リフレッシュトークンも JWT ですか?
実装次第です。OAuth 仕様上はリフレッシュトークンの形式は規定されていません。サーバー実装によっては JWT のこともあれば、不透明な ID のこともあります。

もっと深く知る

公式ドキュメント / 仕様

学習サイト / 記事

※ Amazon へのリンクはアフィリエイトリンク(Amazon アソシエイト)を含みます。

関連ツール