jwt-validate について
jwt-validateは、JWTの構造、クレーム、署名を確認するセキュリティスキルです。最初の検証失敗で停止し、署名検証には想定アルゴリズムとユーザー提供の鍵情報を求めます。
主な機能
- 01JWT構造とJSONの検査
- 02有効期限と時刻クレームの検証
- 03発行者、オーディエンス、サブジェクトの照合
- 04シークレット、PEM公開鍵、JWKSによる署名検証
- 05アルゴリズムの許可リストと鍵の安全な扱い
活用シーン
- 01JWTの期限切れや有効化前の確認
- 02発行者、オーディエンス、サブジェクトの期待値との照合
- 03提供された鍵を使ったトークン検証
- 04署名未検証を明示したトークンの検査
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ jsonwebtoken/ jwt-skills --skill jwt-validateインストール後、Claude Code で/jwt-validateを入力して読み込まれたか確認します。
詳細
JWT の検証
JWT の署名を確認し、クレームを検証します。トークンが真正で、有効期限内であり、構造上問題がないことを確認します。
検証の順序
次の順序で確認します。最初の失敗が見つかった時点で停止し、報告してください。
1. 構造
- ドットで区切られた部分が正確に 3 つあり、それぞれが有効な base64url である
- ヘッダーとペイロードを有効な JSON として解析できる
- ヘッダーに
algが含まれており、algがnoneではない(明示的に想定されている場合を除く)
2. クレーム
expは未来の時刻である必要があります(有効期限までの時間、または期限切れからの経過時間を報告してください)nbfは過去または現在の時刻である必要がありますiatは過去の時刻である必要があります。30 日以上前の場合は警告してくださいiss、aud、sub— ユーザーが期待値を指定した場合、一致する必要があります- すべての時刻チェックで、60 秒のクロックスキュー許容範囲を設けてください
3. 署名
ユーザーからシークレット、PEM 公開鍵、または JWKS URI の提供が必要です。シェルの履歴に残らないよう、シークレットとトークンは必ずインラインの環境変数で渡してください。
Node.js(推奨):
まず、jose が利用可能であることを確認します。不足している場合は、グローバルにインストールしてください。
node --input-type=module -e "await import('jose')" 2>/dev/null || npm install -g jose
次に、トークンを検証します。
JWT_TOKEN='the.jwt.here' JWT_SECRET='user-provided-secret' node --input-type=module -e "import {jwtVerify} from 'jose'; try { const {payload}=await jwtVerify(process.env.JWT_TOKEN, new TextEncoder().encode(process.env.JWT_SECRET), {algorithms:['HS256'],clockTolerance:60}); console.log('VALID'); console.log(JSON.stringify(payload,null,2)); } catch(e) { console.log('INVALID:',e.message); }"
Python:
JWT_TOKEN='the.jwt.here' JWT_SECRET='user-provided-secret' python3 -c "
import jwt,json,os
try:
d=jwt.decode(os.environ['JWT_TOKEN'],os.environ['JWT_SECRET'],algorithms=['HS256'],leeway=60)
print('VALID'); print(json.dumps(d,indent=2))
except Exception as e: print(f'INVALID: {e}')
"
JWKS による検証(Node.js):
JWT_TOKEN='the.jwt.here' JWKS_URI='https://example.auth0.com/.well-known/jwks.json' node --input-type=module -e "import {jwtVerify,createRemoteJWKSet} from 'jose'; try { const {payload}=await jwtVerify(process.env.JWT_TOKEN, createRemoteJWKSet(new URL(process.env.JWKS_URI)), {algorithms:['RS256']}); console.log('VALID'); console.log(JSON.stringify(payload,null,2)); } catch(e) { console.log('INVALID:',e.message); }"
シークレットまたは鍵が提供されていない場合は、構造とクレームのみを検証し、署名が検証されていないことを明確に伝えてください。
出力形式
## JWT Validation Report
Structure: PASS
Claims: PASS — exp 2025-06-15T12:00:00Z (expires in 2h)
Signature: PASS — RS256, key kid "abc123"
Result: VALID
失敗時:
## JWT Validation Report
Structure: PASS
Claims: FAIL — exp 2024-01-15T12:00:00Z (expired 6 months ago)
Signature: SKIPPED
Result: INVALID — token expired
セキュリティルール
- 検証時にトークンの
algヘッダーを決して信頼しないでください。 必ず、ユーザーが期待するアルゴリズム、または提供された鍵の種類に対応するアルゴリズムを使用してください。ヘッダーを信頼すると、攻撃者が RS256 を HS256 に切り替え、公開鍵を HMAC シークレットとして使って署名するアルゴリズム混同攻撃が可能になります。 - 検証呼び出しでは、
algorithmsを明示的な許可リストとして必ず指定してください。algorithms: [decoded.header.alg]は決して渡さないでください。 - シークレットやトークンをコマンドライン引数に直接渡さないでください。 環境変数を使用してください。引数はシェルの履歴や
psの出力から見えてしまいます。 alg: none— 重大なセキュリティ上の問題として報告してください。トークンに署名はなく、信頼できません。- 鍵が提供されていない場合は、構造とクレームのみを検証してください。次のように明確に伝えてください。「署名は検証されていません — トークンの真正性は不明です。」
コメント
Markdown 対応