mcpField
J
jwt-validate

jwt-validate

github.com/jsonwebtokenセキュリティ20634 回インストール29 週間前に更新
リポジトリ

jwt-validate について

jwt-validateは、JWTの構造、クレーム、署名を確認するセキュリティスキルです。最初の検証失敗で停止し、署名検証には想定アルゴリズムとユーザー提供の鍵情報を求めます。

主な機能

  1. 01JWT構造とJSONの検査
  2. 02有効期限と時刻クレームの検証
  3. 03発行者、オーディエンス、サブジェクトの照合
  4. 04シークレット、PEM公開鍵、JWKSによる署名検証
  5. 05アルゴリズムの許可リストと鍵の安全な扱い

活用シーン

  1. 01JWTの期限切れや有効化前の確認
  2. 02発行者、オーディエンス、サブジェクトの期待値との照合
  3. 03提供された鍵を使ったトークン検証
  4. 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 — 重大なセキュリティ上の問題として報告してください。トークンに署名はなく、信頼できません。
  • 鍵が提供されていない場合は、構造とクレームのみを検証してください。次のように明確に伝えてください。「署名は検証されていません — トークンの真正性は不明です。」

コメント