JWT / authentication error guide

JWTの認証エラーを、期限・対象・署名に分けて確認する

decodeしたpayloadを認証済みと誤解しないよう、exp・issuer・audience・署名・構文の境界を一つずつ見ます。

decodeと認証を分ける

headerとpayloadが読めても、署名が正しいとは限りません。署名検証にはサービスが信頼する鍵・アルゴリズム設定が必要で、issuerとaudienceも受け側の契約と照合します。

header.payload.signature
exp / iat  → 時間の主張
iss         → 発行者の契約
aud         → 対象サービスの契約
	signature   → decodeとは別の検証
境界確認すること
exp / iat期限切れ・未来の発行時刻を、署名検証とは別に確認する。
iss発行者が受け側の許可したissuerと一致するか確認する。
audtokenの対象が、そのサービスのaudience契約と一致するか確認する。
署名未検証のdecode結果は認証材料にしない。JWKS取得や鍵推測を行わない。
構文3区切り・base64url・JSONの不正はfail-closedで扱う。

秘密を入力しない

本番のJWT、refresh token、cookie、署名秘密鍵をこのガイドへ貼り付けないでください。サポートへ共有する場合は、fixtureや完全に無害化した例で、値の中身を確認票に含めません。

このガイドと既存のinspectorは端末内でdecodeするだけです。署名検証・JWKS・失効確認・外部送信は行いません。

レビューケース

case判定確認
expired-or-futureattentionexp/iatの時間だけを確認し、署名検証済みとは言わない。
issuer-audiencemismatchissとaudをサービスの契約と照合する。
signature-unverifiedreject-as-authdecode結果を認証済みと扱わず、鍵・アルゴリズム設定の担当へ戻す。
malformed-tokenreject構文やJSONが不正なら成功扱いしない。

安全なfixtureで確認する

header・payload・期限の表示だけを端末内で確認する場合は既存のJWT inspectorを使います。このガイドは認証の代わりではなく、エラー分類と共有範囲の確認票です。

日本語のJWT inspector / English inspector