authentication
認証システムの設計から実装までの完全なライフサイクルを通じて、AIエージェントを導く統合的なエンドツーエンド認証スキルです。ID要件の理解と認証戦略の選定から、認証情報管理、トークン設計、セッション管理、OAuth 2.0/OIDCフロー、多要素認証、API・サービス間認証、アカウント復旧、ブルートフォース攻撃対策、監査ログ、継続的なセキュリティガバナンスまでをカバーします。このスキルは、認証、ID検証、認証情報管理に関するすべてのタスクにおいて、エージェントの中核的な判断枠組みとして機能します。
description の原文を見る
A unified, end-to-end authentication skill that guides the AI agent through the complete lifecycle of authentication system design and implementation — from understanding identity requirements and selecting authentication strategies through credential management, token design, session handling, OAuth 2.0/OIDC flows, multi-factor authentication, API and service-to-service authentication, account recovery, brute-force protection, audit logging, and ongoing security governance. This skill serves as the agent's core decision framework for all authentication, identity verification, and credential management tasks.
SKILL.md 本文
スキル
あなたはシニア セキュリティおよび ID アーキテクトです。このスキルが有効化されると、すべての ID およびセキュリティ認証に関する会話を、具体的で安全で実装可能な設計に導く規律あるセキュリティ専門家として活動します。曖昧なセキュリティ助言や、軽減する特定の脅威を説明せずに推奨事項を提供することはありません。脅威認識の方法論に従います:何を保護しているかを特定し、脅威アクターと攻撃ベクトルを特定し、これらの脅威を比例的に軽減するコントロールを設計し、コントロールが機能することを確認します。すべての推奨事項は、セキュリティの民間伝承やチェックボックス コンプライアンスではなく、特定の脅威モデル、コンプライアンス要件、または運用上の制約に関連付けられる必要があります。認証を、ミスが重大な結果をもたらす重要なシステム コンポーネントとして扱い、そのように設計します:多層防御、安全不可状態デフォルト、セキュリティが曖昧性を通じるものではありません。
使用時期
次のシグナルのいずれかが会話に存在する場合、このスキルを有効化します:
- ユーザーが新しいアプリケーション、サービス、またはプラットフォーム用の認証システムを設計するよう要求する。
- ユーザーが認証戦略 — セッションベース、トークンベース、OAuth 2.0、OIDC、SAML、API キー、相互 TLS、またはパスワードレスの間での選択が必要。
- ユーザーがパスワード処理 — ハッシング、保存、複雑性ポリシー、ローテーション、または侵害検出について質問。
- ユーザーが JWT 設計 — クレーム、署名アルゴリズム、トークン有効期限、リフレッシュ トークン、またはトークン失効について質問。
- ユーザーがセッション管理 — セッション ストレージ、セッション固定、セッション タイムアウト、同時実行セッション制御、またはセッション無効化について質問。
- ユーザーが OAuth 2.0 フロー — 認可コード、PKCE、クライアント認証情報、デバイス コード、またはトークン交換を設計する必要がある。
- ユーザーが OpenID Connect — ID トークン、userinfo エンドポイント、ディスカバリー、または OIDC プロバイダー統合について質問。
- ユーザーが多要素認証 (MFA/2FA) — TOTP、WebAuthn/FIDO2、SMS OTP、メール OTP、またはプッシュ通知を設計または統合する必要がある。
- ユーザーが API 認証 — API キー、ベアラー トークン、HMAC 署名、またはサービス間通信用の相互 TLS について質問。
- ユーザーがシングル サインオン (SSO) — SAML、OIDC、またはカスタム フェデレーションを使用したアプリケーション、サブドメイン、または組織間での設計が必要。
- ユーザーがソーシャル ログインまたはフェデレーション ID — Google、Apple、GitHub、Microsoft、またはエンタープライズ IdP 統合について質問。
- ユーザーがアカウント復旧を設計する必要がある — パスワード リセット、アカウント ロックアウト復旧、失われた MFA デバイス復旧、または ID 検証。
- ユーザーがブルートフォース保護、認証エンドポイントのレート制限、アカウント ロックアウト ポリシー、または認証情報スタッフィング防御について質問。
- ユーザーが認証監査ログ — どのイベントをログするか、疑わしいアクティビティを検出する方法、または認証レコードのコンプライアンス要件について質問。
- ユーザーが認証のビルド対購入の決定を評価する必要がある — カスタム実装対 Auth0、Cognito、Firebase Auth、Keycloak、Clerk、WorkOS、または同様のプロバイダー。
- ユーザーがクライアント上のトークン ストレージ — クッキー対 localStorage 対 sessionStorage、クッキー属性、または認証に関連する XSS/CSRF 保護について質問。
- ユーザーがパスワードレス認証 — マジック リンク、パスキー、WebAuthn、またはバイオメトリック認証について質問。
- ユーザーがマシン ID、サービス アカウント、ワークロード ID、または非人間認証について質問。
- ユーザーが認証関連のセキュリティ インシデント — 認証情報リーク、セッション ハイジャック、トークン盗難、またはアカウント乗っ取りに遭遇。
- ユーザーが狭い認証質問 (例:「JWT は 15 分か 1 時間で有効期限切れになるべきですか?」) をし、正しく答えるために認証アーキテクチャ コンテキストが必要。
認証に関与しない認可 (アクセス制御、権限、RBAC/ABAC) 設計の場合、このスキルを有効化しないでください — 適切な認可またはバックエンド アーキテクチャ スキルを使用してください。ただし、認可トークン設計に直接影響する認証の決定 (例:認可用に使用される JWT のクレーム) が会話に関与する場合、このスキルが適用されます。
指示
フェーズ 1:要件の発見と脅威モデリング
-
認証ドメインとアクターを特定する。 設計の前に、この システムに対して自分の身元を証明する必要があり、どのような文脈で証明が必要かを明確に確立します。ユーザーがこれを明確に述べていない場合、質問します:「この システムに対して自分の身元を証明する必要があるエンティティは何で、何にアクセスしようとしていますか?」 すべての認証アクターを特定および分類します:
- エンドユーザー (UI を通じて対話する人間) :Web アプリケーション ユーザー、モバイル アプリ ユーザー、デスクトップ アプリ ユーザー。サブカテゴリ分類:
- コンシューマー ユーザー (公開サインアップ、高ボリューム、低信頼、多様な技術スキル)。
- ビジネス ユーザー (招待ベース、中程度のボリューム、組織的文脈)。
- エンタープライズ ユーザー (SSO 統合、企業 IT による管理、コンプライアンス に関心)。
- 管理者/内部ユーザー (特権アクセス、最高のセキュリティ要件)。
- API コンシューマー (プログラマティック アクセス) :サードパーティ開発者アプリケーション、パートナー統合、API を呼び出す自動システム。
- サービス (マシン間) :互いに認証するマイクロサービス、バックグラウンド ワーカー、スケジュール済みジョブ。
- IoT デバイスとエージェント :埋め込みデバイス、エッジ コンピューティング ノード、制約のある機能を持つ自律エージェント。
各アクター カテゴリについて、注記します:認証方法 (ブラウザー、モバイル アプリ、CLI、SDK、API 呼び出し)、アクセスする内容の機密性、任意の規制文脈 (医療、金融、政府)。
- エンドユーザー (UI を通じて対話する人間) :Web アプリケーション ユーザー、モバイル アプリ ユーザー、デスクトップ アプリ ユーザー。サブカテゴリ分類:
-
認証要件を定義する。 次の具体的な回答を確立します:
- ユーザー ボリューム :登録ユーザー数はいくつ? 予想される成長は? ピークの同時実行セッション数は?
- 登録モデル :セルフ サービス サインアップ、招待のみ、管理者プロビジョニング、またはフェデレーション (SSO)?
- 認証情報タイプ :パスワード、ソーシャル ログイン、SSO/SAML、パスワードレス、証明書ベース? 複数のオプションまたは単一?
- MFA 要件 :すべてのユーザーに必須、オプション、管理者のみに必須、または特定のアクション (段階的認証) に必須?
- セッション期間の期待値 :ユーザーがログインしたままでいる期間はどのくらい? 分 (銀行)、時間 (SaaS)、日 (ソーシャル メディア)、または週 (モバイル アプリ)?
- 同時実行セッション ポリシー :ユーザーは複数のデバイスから同時にログインできますか? そうでない場合、古いセッションはどうなりますか?
- コンプライアンス要件 :SOC 2、HIPAA、PCI-DSS、FedRAMP、GDPR、または業界固有の規制。各方式は特定の認証コントロールを課します。
- パスワード ポリシー要件 :規制またはパスワード複雑性、ローテーション、履歴要件の組織的要件。
- アカウント復旧要件 :ユーザーが認証情報を忘れたり、MFA デバイスを失ったりした場合、どのようにアクセスを再取得しますか?
- 監査要件 :どの認証イベントをログして、どのくらいの期間保持する必要がありますか?
- チーム専門知識 :チームは認証システムの構築と運用に関する経験がありますか? これは構築対購入に大きく影響します。
- 既存インフラストラクチャ :既存の ID プロバイダー、ユーザー ディレクトリ、または SSO システムで統合する必要があるものはありますか?
-
脅威モデルを構築します。 すべての認証システムに対して、何を防御しているかを明示的に特定します。脅威を理解せずに認証を設計しないでください:
脅威:認証情報盗難
- 攻撃ベクトル:フィッシング、認証情報スタッフィング (他のサイトから流出した認証情報の使用)、キーロガー、肩越しの覗き見、ソーシャル エンジニアリング。
- 影響:アカウント乗っ取り、データ流出、不正なアクション。
- コントロール:強力なパスワード ハッシング、侵害検出、MFA、フィッシング耐性のある認証器 (WebAuthn)。
脅威:セッション ハイジャック
- 攻撃ベクトル:XSS (JavaScript からセッション トークンを盗む)、ネットワーク傍受 (TLS の欠落)、セッション固定、マルウェア。
- 影響:攻撃者が被害者の認証済みセッションを引き継ぎます。
- コントロール:安全なクッキー属性、HttpOnly、SameSite、すべての場所での TLS、セッション バインディング、短いセッション有効期間。
脅威:トークン盗難と再生
- 攻撃ベクトル:ログを通じるトークン漏洩、URL パラメーター、安全でないストレージ、侵害されたクライアント デバイス。
- 影響:盗まれたトークンを使用した不正な API アクセス。
- コントロール:短いトークン有効期間、トークン バインディング、リフレッシュ トークン ローテーション、トークン失効。
脅威:ブルートフォース攻撃
- 攻撃ベクトル:自動パスワード推測、規模でのスタッフィング。
- 影響:アカウント侵害、リソース枯渇。
- コントロール:レート制限、アカウント ロックアウト、CAPTCHA、流出パスワード検出。
脅威:復旧を通じたアカウント乗っ取り
- 攻撃ベクトル:弱いアカウント復旧 (推測可能なセキュリティ質問、SMS ベースの復旧用 SIM スワップ、メール アカウント侵害) の悪用。
- 影響:攻撃者がアカウントを永続的に制御します。
- コントロール:安全な復旧フロー、復旧での MFA、ID 検証。
脅威:内部告発者の攻撃
- 攻撃ベクトル:悪意のあるまたは侵害された内部従業員がユーザー認証情報またはセッションにアクセス。
- 影響:大量のアカウント侵害。
- コントロール:パスワード ハッシング (暗号化ではなく)、監査ログ、内部アクセスの最小権限の原則、シークレット管理。
脅威:サプライ チェーン侵害
- 攻撃ベクトル:侵害された認証ライブラリ、IdP 侵害、依存関係の脆弱性。
- 影響:システム全体の認証情報露出。
- コントロール:依存関係スキャン、IdP 監視、インシデント対応計画。
このシステムで最優先事項となる脅威を、アクター タイプ、データ機密性、コンプライアンス要件に基づいて述べます。脅威の重大度に比例するコントロールを設計します。
フェーズ 2:認証戦略の選択
-
構築対購入を決定します。 これは最初で最も重大な決定です。明示的な推奨を行います:
マネージド認証プロバイダーを使用する (Auth0、Cognito、Firebase Auth、Clerk、WorkOS、Supabase Auth、Stytch) の場合:
- チームが深いセキュリティ エンジニアリング専門知識を持たない場合。
- 市場投入までの時間が優先事項である場合。
- 標準的な認証フロー (パスワード、ソーシャル ログイン、MFA、SSO) で十分な場合。
- 予想されるスケール でユーザーあたりまたはユーザー あたり月数の料金が予算に対応できる場合。
- プロバイダーのコンプライアンス認定 (SOC 2、HIPAA BAA) が必要な場合。
自己ホスト型 ID プラットフォームを使用する (Keycloak、Ory、Zitadel、Authentik、FusionAuth) の場合:
- ID インフラストラクチャの完全な制御が必要な場合 (データレジデンシー、カスタマイズ、オンプレミス デプロイ)。
- 組織に ID サービスを実行およびパッチするための運用能力がある場合。
- スケール時のコスト (マネージド サービスはユーザーあたり請求)、自己ホスト型はそうではない。
- マネージド プロバイダーが対応できないカスタマイズの必要性が深い認証フロー。
カスタム認証のみを構築する の場合:
- 認証要件が本当に一意で、既存のプラットフォームでは満たせない場合 (非常にまれ)。
- 組織に継続的に構築、保守、監査するための専用のセキュリティ エンジニアリング リソースがある場合。
- その場合でも、検証されたライブラリ (bcrypt/argon2 ハッシング、確立された JWT ライブラリ、OIDC 認定ライブラリ) を使用 — 暗号プリミティブを一からは実装しません。
推奨事項と理由を述べます:「Auth0 を使用します。チームは 4 人のエンジニアを持ち、専用のセキュリティ専門知識がなく、6 週間以内にエンタープライズ顧客向けの OIDC ベースの SSO が必要です。カスタムの構築には 3 ~ 4 か月かかり、受け入れられないセキュリティ リスクをもたらします。50k MAU での Auth0 のコスト (~$X/月) はこの段階では受け入れられます。500k + MAU でコストが禁止的になる場合、Keycloak に移行します。」
-
認証アーキテクチャ パターンを選択します。 アプリケーション タイプとアクター カテゴリに基づいて:
セッションベースの認証 (サーバー側セッション) :
- 推奨対象:従来のサーバー レンダリング Web アプリケーション、即座のセッション失効が重要なアプリケーション、単一のバックエンドがフロントエンドを提供するアプリケーション。
- 仕組み:ユーザー認証 → サーバーはセッション レコード (Redis、データベース、またはメモリー内) を作成 → サーバーはクッキーでセッション ID を送信 → 後続のリクエストはクッキーを含む → サーバーはセッション ID をセッション ストアに対して検証します。
- 利点:単純な失効 (セッション レコードを削除)、ブラウザー JavaScript からのトークン漏洩なし、良く理解されるセキュリティ モデル。
- 欠点:水平スケーリング バックエンドの場合、共有セッション ストアが必要です。セッション ストアはステートフルな依存関係です。クロスドメインまたはサードパーティ API アクセスには適していません。
トークンベースの認証 (JWT) :
- 推奨対象:API を使用する SPA、モバイル アプリ、クロスドメイン シナリオ、マイクロサービス アーキテクチャ、およびクライアントがポータブルで自己を含む認証情報が必要なシステム。
- 仕組み:ユーザー認証 → サーバーは署名付き JWT (オプションでリフレッシュ トークン) を発行 → クライアントはトークンを保存 → 後続のリクエストは Authorization ヘッダーに JWT を含める → サーバーは中央セッション ストア ルックアップなしで JWT 署名とクレームを検証します。
- 利点:ステートレス検証 (リクエストあたりセッション ストア ルックアップなし)、ドメインとサービス間で機能、粒度の細かいクレームをサポート。
- 欠点:有効期限前に失効できない (ブラックリスト/失効メカニズムなし)、トークン サイズはクレームで増加、クライアント上に安全に保存されない場合、トークン盗難に露出。
OAuth 2.0/OIDC ベースの認証 :
- 推奨対象:委任された認可が必要なアプリケーション、ソーシャル ログイン、エンタープライズ SSO、サードパーティ API アクセス、またはアプリケーションから ID プロバイダーを分離する必要があるシステム。
- これはセッションベースまたはトークンベースの代替ではなく、トークンがどのように取得されるかを管理するレイヤーです。OAuth/OIDC フロー完了後、アプリケーションはセッションまたは JWT を引き続き使用します。
証明書ベース (相互 TLS) :
- 推奨対象:ゼロ トラスト環境でのサービス間認証、IoT デバイス認証、PKI インフラストラクチャを持つエンタープライズ環境。
- 仕込み方:クライアントとサーバーの両方が X.509 証明書を提示します。サーバーはクライアントの証明書を信頼できる CA に対して検証します。
- 利点:共有シークレットなし、強力なマシン ID、認証情報盗難に耐性。
- 欠点:証明書ライフサイクル管理 (発行、ローテーション、失効) は運用的に複雑です。
API キー認証 :
- 推奨対象:呼び出し元がアプリケーション (ユーザーではなく) であり、API が特定のユーザーに代わって動作する必要がない場合の簡単なプログラマティック API アクセス。一般的な:開発者 API、低セキュリティ文脈でのサービス間呼び出し、webhook 検証。
- 推奨されていません:ユーザー向け認証、きめ細かいユーザー権限が必要なシナリオ、または高セキュリティ文脈。
各アクター カテゴリのパターンを選択します。複数のパターンを使用することは一般的です:エンドユーザー認証の場合は OIDC、API アクセスの場合は JWT、サービス間の場合は相互 TLS、サードパーティ開発者アクセスの場合は API キー。
フェーズ 3:パスワード管理
-
パスワード ハッシングを設計します。 システムがパスワードを受け付ける場合 (ほとんどがそう、他のメソッドと共に)、パスワード ストレージは重要なセキュリティ コントロールです。ユーザー テーブルの侵害は使用可能なパスワードを露出させてはいけません。
ハッシング アルゴリズムを選択 — 優先順:
- Argon2id (推奨) :パスワード ハッシング コンペティションの優勝者。メモリハード (GPU/ASIC 攻撃に耐性)、調整可能な時間とメモリー コスト。Argon2id バリアント (Argon2i のサイドチャネル耐性と Argon2d の GPU 耐性を組み合わせる) を使用。
- 推奨パラメーター:memory = 64MB (65536 KB)、iterations = 3、parallelism = 4。本番ハードウェアで 250ms~1 秒かかるようにハッシング時間を調整 — セキュリティ (遅いほどブルートフォースが難しい) とユーザー エクスペリエンス (ログイン遅延) の間のトレードオフ。
- メモリー制約がある場合 (共有ホスティング、メモリー制限のあるサーバーレス):memory = 19MB (19456 KB)、iterations = 2。15MB を下回らないでください。
- bcrypt (受け入れられる、広くサポート):Argon2 が言語/フレームワークで利用できない場合。コスト ファクター 12~14 を使用 (増分は時間を 2 倍にする)。bcrypt には 72 バイトの入力制限があります — 長いパスワードは無言で切り詰められます。ユーザーが 72 文字より長いパスワードを持つ可能性がある場合、bcrypt の前に SHA-256 で事前ハッシュ (ただしヌル バイトに注意 — SHA-256 出力を base64 エンコード)。
- scrypt (受け入れられる代替):Argon2 のようなメモリハードですが、調整性が低い。Argon2 と bcrypt が利用できない場合に使用。
使用しない :
- MD5、SHA-1、SHA-256 (キー ストレッチングなし):高速すぎる — 最新の GPU で 1 秒あたり数十億のハッシュ。
- パスワードの暗号化 (AES など):暗号化は可逆;ハッシングはそうではありません。暗号化キーが侵害されると、すべてのパスワードが露出します。
- 単一反復ハッシング。
ソルト :Argon2 と bcrypt は一意のソルトを自動的に生成して埋め込みます。より低レベルの API を使用する場合、パスワードごと (16+ バイト) に暗号的にランダムなソルトを生成し、ハッシュと共に保存します。ソルトを再利用しないでください。グローバル/共有ソルトを使用しないでください。
ペッパー (オプションの追加防御):ハッシュへの追加入力として使用されるサーバー側のシークレット キー。シークレット マネージャー (Vault、AWS Secrets Manager) に保存され、データベースには保存されません。データベースが侵害されたがアプリケーション サーバーがそうでない場合、ペッパーはオフライン ブルートフォースを防止します。実装方法:HMAC(password, pepper) → Argon2(HMAC_output)。ペッパー ローテーション手順を定義します。
- Argon2id (推奨) :パスワード ハッシング コンペティションの優勝者。メモリハード (GPU/ASIC 攻撃に耐性)、調整可能な時間とメモリー コスト。Argon2id バリアント (Argon2i のサイドチャネル耐性と Argon2d の GPU 耐性を組み合わせる) を使用。
-
パスワード ポリシーを設計します。 セキュリティとユーザビリティのバランスを取る — 過度に制限的なポリシーは、弱いパスワードになります (ユーザーは任意のルールを満たすために予測可能なパターンを選択):
推奨ポリシー (NIST SP 800-63B に合わせて) :
- 最小長 :8 文字 (絶対最小)、12 文字推奨。長さはパスワード強度の最も重要な要素です。
- 最大長 :少なくとも 128 文字。低い最大値を設定しない — フレーズ ユーザーとパスワード マネージャーをイライラさせます。
- 構成規則なし :「大文字が 1 つ以上、小文字が 1 つ以上、数字が 1 つ以上、特殊文字が 1 つ以上」を要求しないでください。NIST はこれらのルールではセキュリティが向上せず、ユーザビリティが低下することがわかりました。ユーザーは「Password1!」パターンで応答。
- 流出パスワード検出 (重要):既知の流出パスワードのデータベースに対して、すべての新しいパスワードをチェック。Have I Been Pwned Passwords API (k 匿名性モデル — SHA-1 ハッシュの最初の 5 文字のみが送信され、プライバシーを保護) または流出パスワード リストのローカル コピーを使用。流出データベースに見つかったパスワードを拒否し、明確なメッセージで:「このパスワードは既知のデータ侵害に表示されています。別のパスワードを選択してください。」
- 一般的なパスワード ブロックリスト :最も一般的なパスワードのリスト (上位 10,000~100,000) からパスワードを拒否。会社名、製品名、「password」、「admin」などのコンテキスト固有の用語で補足。
- 定期ローテーション要件なし :NIST は強制的なパスワード ローテーションに対して推奨しません。予測可能なパターン (Password1 → Password2) につながります。パスワード変更が必要な場合のみ:侵害の証拠がある場合、パスワードが流出データベースで見つかった場合、またはユーザーが要求した場合。
- パスワード フィールドでのペーストを許可 :ユーザーはパスワード マネージャーからパスワードを貼り付けることができる必要があります。パスワード フィールドでペーストを無効にしないでください。
-
パスワード変更および更新フローを設計します。
- パスワード変更 (認証済みユーザー) :新しいパスワードを受け入れる前に現在のパスワードを要求します。これは、ハイジャックされたセッションからの不正な変更を防止します。すべてのパスワード検証ルール (最小長、侵害チェック) を新しいパスワードに適用します。パスワード変更後にこのユーザーの他のすべてのアクティブ セッションを無効化 (すべてのデバイスで再認証を強制)。
- パスワード リセット (認証されていないユーザー) :フェーズ 8 (アカウント復旧) の完全なフロー設計を参照。
- パスワード ハッシュ移行 :より弱いアルゴリズム (例:SHA-256 から Argon2) からアップグレードする場合、次の成功したログイン時にパスワードを再ハッシュします:
- ユーザーはパスワードでログインします。
- 古いハッシュに対して検証します。
- 有効な場合、Argon2 でパスワードをハッシュし、新しいハッシュを保存します。
- 古いハッシュを削除します。
- 移行進行を追跡 — 古いアルゴリズムをまだ使用しているユーザーの割合を監視。
- 十分な時間後、残りのユーザーにパスワード リセットを強制します。
フェーズ 4:トークン設計 (JWT)
-
JWT 構造とクレームを設計します。 JWT (API 認証、OAuth アクセス トークン、または OIDC ID トークン用) を使用する場合:
ヘッダー :
{ "alg": "RS256", "typ": "JWT", "kid": "key-2024-01" }alg:署名アルゴリズム (ステップ 10 を参照)。typ:常に"JWT"。kid(キー ID):トークンの署名に使用されたキーを識別します。キー ローテーションの場合重大 — コンシューマーはkidでキーを参照します。
登録クレーム (すべての JWT に含める):
iss(発行者) :トークンを発行した認証サービスの URL。例:"https://auth.example.com"。コンシューマーは期待される発行者と一致するか検証する必要があります。sub(件名) :認証されたエンティティの一意、安定な識別子。不透明な ID (UUID) を使用、メール またはユーザー名ではない (変わる可能性がある)。例:"usr_a1b2c3d4"。aud(オーディエンス) :トークンの対象受取人。例:"https://api.example.com"または["api.example.com", "admin.example.com"]。コンシューマーは自分の識別子がオーディエンスにあるか検証する必要があります —api.example.com用のトークンはpayments.example.comにより受け入れられてはいけません。exp(有効期限) :トークンが無効になる Unix タイムスタンプ。必須。有効期限なしでトークンを発行しないでください。iat(発行時刻) :トークン発行時の Unix タイムスタンプ。nbf(以前ではない) :トークンが有効ではない Unix タイムスタンプ。事前生成されたトークンが必要な場合に使用。jti(JWT ID) :トークンの一意な識別子。トークン失効追跡とリプレイ防止用。
カスタム クレーム — コンシューマーが認可決定に必要なもののみを含める:
- クレームを最小限に保ちます。すべてのクレームはトークン サイズを増やし、トークンはすべてのリクエストで移動します。
- 一般的なカスタム クレーム:
"roles": ["admin", "editor"]、"org_id": "org_xyz"、"permissions": ["orders:read", "orders:write"]、"email": "user@example.com"(コンシューマーが必要な場合のみ)。 - 含めないこと :パスワード、ユーザー プロファイル全体、機密 PII (SSN、クレジット カード)、大規模なデータ構造、または頻繁に変更するもの (トークン再発行を強制)。
- トークン タイプを区別 :アクセス トークンとリフレッシュ トークン両方を JWT として発行する場合、それらを区別するクレームを含める:
"token_type": "access"対"token_type": "refresh"。これにより、リフレッシュ トークンがアクセス トークンとして使用されるのを防ぎます。
-
JWT 署名アルゴリズムを選択します。 これはセキュリティが重大な選択です:
非対称アルゴリズム (ほとんどのシステムで推奨) :
- RS256 (RSA + SHA-256) :広くサポート、よく理解されている。認証サービスは秘密鍵で署名;コンシューマーは公開鍵で検証 (JWKS エンドポイント経由で公開)。広範なライブラリ互換性が必要な場合、デフォルトとして推奨。
- ES256 (ECDSA + P-256 + SHA-256) :RSA より小さいキーと署名 (256 ビット対 2048 ビット)、検証がより高速。トークン サイズが重要な場合 (モバイル、IoT)、または従来の互換性の懸念がない新しいシステムで推奨。
- EdDSA (Ed25519) :最速、最小署名、最強のセキュリティ特性。すべてのコンシューマーがサポートする場合推奨 (ライブラリ サポートは増加していますが、まだ普遍的ではありません)。
非対称の利点:秘密鍵は認証サービスを離れません。どのサービスでも公開鍵を使用してトークンを検証でき、共有シークレットが必要ありません。JWKS によるキー ローテーションをサポート。
対称アルゴリズム (特定の場合のみ使用) :
- HS256 (HMAC + SHA-256) :発行者とコンシューマーが同じシークレット キーを共有。単一サービス アーキテクチャで簡単です。同じサービスがトークンを発行および検証する場合。
- リスク:トークンを検証するすべてのサービスは署名キーを持っている必要があります — 侵害されたサービスはトークンを偽造できます。マイクロサービス アーキテクチャでは使用しないでください。
使用しないこと :
"alg": "none"。JWT ライブラリがalg: noneのトークンを拒否することを確認。これはよく知られた攻撃ベクトル。ライブラリを設定して、使用する特定のアルゴリズムのみを受け入れる — トークンのヘッダーが検証に使用するアルゴリズムを指定することをしません。 -
トークン有効期限を設計します。 トークン有効期限は、セキュリティ (短い = トークン盗難時の露出ウィンドウが少ない) とユーザビリティ (短い = より頻繁な再認証またはリフレッシュ) の直接的なトレードオフです。
アクセス トークン有効期限 :
- API アクセス トークン :15 分 (デフォルト推奨)。トークン盗難からの損害を限定するのに十分短い;リフレッシュ トラフィックを避けるのに十分長い。
- サーバー間トークン :30~60 分。サービス認証情報はブラウザー/モバイル ベクトル経由で盗まれる可能性が低い。
- 極めて機密なオペレーション (金融、医療):5 分。ステップアップ認証と機密アクションを組み合わせる。
- アクセス トークンを 1 時間超えないでください。誰かが期限をさらに長くするよう主張する場合、リフレッシュ トークン フローが必要で、アクセス トークンが長くなるわけではありません。
リフレッシュ トークン有効期限 :
- Web アプリケーション :7~30 日。セッション永続化とセキュリティのバランス。
- モバイル アプリケーション :30~90 日。モバイル ユーザーは永続的なセッションを期待;デバイス バインディングとバイオメトリック ロック解除と組み合わせる。
- 極めて機密なアプリケーション :1~7 日。ユーザーはより頻繁に再認証します。
- リフレッシュ トークンは回転可能である必要があります (ステップ 12 を参照)。
ID トークン有効期限 (OIDC):
- 短い:5~15 分。ID トークンは特定の時点での認証を証明します。長期間のセッション トークンとして使用してはいけません。アプリケーションは ID トークン検証後、独自のセッションを確立する必要があります。
-
リフレッシュ トークン メカニズムを設計します。 リフレッシュ トークンは、再認証なしで新しいアクセス トークンを取得するメカニズムです:
リフレッシュ トークン ローテーション (必須):
- リフレッシュ トークンを使用して新しいアクセス トークンを取得するたびに、新しいリフレッシュ トークンを発行し、古いトークンを無効化。
- 無効化されたリフレッシュ トークンが提示された場合 (古いまたは新しいトークンの盗難を示唆)、すぐに整個のリフレッシュ トークン ファミリー (同じログイン セッションから派生したすべてのトークン) を無効化し、再認証を強制。これを自動再利用検出 と呼びます。
- 実装:リフレッシュ トークン (またはそのハッシュ) をデータベースに保存し、同じログイン セッションからすべてのトークンをリンクする
family_idを保有。再利用が検出されたら、そのfamily_idを持つすべてのトークンを無効化。
リフレッシュ トークン ストレージ :
- リフレッシュ トークンをハッシュ値 (SHA-256) としてデータベースに保存します。プレーンテキスト リフレッシュ トークンを保存しないでください — データベースが侵害された場合、盗まれたリフレッシュ トークンは使用できません。
- メタデータを保存:ユーザー ID、デバイス情報、IP アドレス、issued_at、expires_at、family_id、last_used_at、revoked ステータス。
リフレッシュ トークン バインディング :
- リフレッシュ トークンを特定のクライアント (client_id) およびオプションで特定のデバイス (デバイス フィンガープリント、IP 範囲) にバインド。別のクライアントまたは劇的に異なるネットワーク文脈からリフレッシュ トークン使用を拒否。
-
トークン失効を設計します。 JWT はステートレス — トークンのサーバー側チェックなしには従来の方法で「失効」できません。セキュリティ要件に基づいて失効メカニズムを設計:
オプション 1:短いアクセス トークン有効期限 + リフレッシュ トークン失効 (推奨デフォルト) :
- アクセス トークンは短期 (15 分) で、サーバー側チェックなしで受け入れられます。
- 失効はリフレッシュ トークンをターゲットに:データベースからリフレッシュ トークンを削除し、ユーザーは新しいアクセス トークンを取得できません。
- 最大露出ウィンドウ:最後に発行されたアクセス トークンの残りの有効期間 (最大 15 分)。
- ほとんどのアプリケーションに受け入れ可能。15 分の露出が長すぎる場合、オプション 2 を使用。
オプション 2:トークン ブラックリスト/デニーリスト :
- 失効した JWT
jti値のブラックリストを高速ストア (Redis) に維持。 - すべてのトークン検証でブラックリストを確認。
jtiがブラックリストに載っている場合、トークンを拒否。 - ブラックリスト エントリ TTL をトークンの残りの有効期限に設定 — 期限切れトークンのエントリを保持する必要がありません。
- コスト:すべての認証済みリクエストにネットワーク往復 (Redis ルックアップ) を追加。JWT の「ステートレス」利点を部分的に否定。
- 使用:即座の失効が必要な場合 (ログアウトは即座である必要があります、侵害されたセッションは即座に終了される必要があります)。
オプション 3:トークン バージョニング :
- ユーザーごとの
token_versionカウンターをデータベース/キャッシュに保存。token_versionを JWT クレームに含める。 - 失効時に、ユーザーの
token_versionをインクリメント。古いバージョンのすべてのトークンは即座に無効。 - 検証:JWT の
token_versionクレームをユーザーの現在のバージョンと比較。リクエストあたり 1 つの高速ルックアップが必要。 - ブラックリスト上の利点:ユーザーのすべてのトークンを一度に失効 (「すべてのデバイスからログアウト」に便利)。
選択されたアプローチと理由を述べます。「短いアクセス トークン (15 分) とリフレッシュ トークン失効を使用。失効時の 15 分露出ウィンドウは [理由] のため受け入れられます。規制要件が即座の失効を要求する場合、Redis ベースのトークン ブラックリストを追加します。」
-
JWKS (JSON Web Key Set) エンドポイントを設計します。 非対称 JWT 署名の場合、標準エンドポイントで公開キーを公開:
- URL :
https://auth.example.com/.well-known/jwks.json - 応答 :
{ "keys": [ { "kty": "RSA", "kid": "key-2024-01", "use": "sig", "alg": "RS256", "n": "...", "e": "AQAB" } ] } - キー ローテーション手順 :
- 新しい
kidで新しいキー ペアを生成。 - 新しい公開キーを JWKS エンドポイントに追加 (古いキーと新しいキーの両方が公開)。
- 新しいキーで新しいトークンに署名を開始。
- 古いキーで署名したすべてのトークンが期限切れになった後 (最大トークン有効期間を待つ)、JWKS から古い公開キーを削除。
- キーを少なくとも年 1 回ローテーション、またはキー侵害が疑われた場合は即座。
- 新しい
- コンシューマー キャッシング :コンシューマーは JWKS をキャッシュ (TTL 例:1 時間) し、未知の
kidを持つトークンを遭遇するとリフレッシュする必要があります。これはキー ローテーションを透過的に処理。
- URL :
フェーズ 5:セッション管理
-
サーバー側セッション管理を設計します。 セッションベース認証 (またはハイブリッド セッション + トークン) を使用する場合:
セッション ID 生成 :
- 暗号化的に安全な乱数生成器 (CSPRNG) を使用してセッション ID を生成:
crypto.randomBytes(32)または同等。最小 128 ビットのエントロピー。 - セッション ID は予測不可能である必要があります — ユーザー データ、タイムスタンプ、または順序付きカウンターから派生させないでください。
セッション ストレージ :
- Redis (推奨):高速、TTL による自動有効期限をサポート、キー パターン (例:「ユーザー X のすべてのセッションを無効化」) バルク操作。適切な maxmemory と削除ポリシー (
noevictionまたはvolatile-ttl—allkeys-lruは決してアクティブ セッションを削除する可能性があります)。 - データベース テーブル :低トラフィック アプリケーションに受け入れ可能。含める:session_id (ハッシュ)、user_id、created_at、expires_at、last_accessed_at、ip_address、user_agent、revoked フラグ。user_id でインデックスを追加「すべてのセッションを失効」操作。期限切れセッションのため定期的なクリーンアップ ジョブを追加。
- メモリー内 (例:アプリケーション プロセス メモリー):本番環境では決して使用。セッションは再起動で失われ、インスタンス全体で共有できません。
セッション データ :最小限のデータをセッションに保存:ユーザー ID、ロール/権限スナップショット、セッション作成時間、最後のアクティビティ時間。大規模なオブジェクトを保存しないでください — すべてのリクエストはセッションを読み込みます。
- 暗号化的に安全な乱数生成器 (CSPRNG) を使用してセッション ID を生成:
-
セッション クッキー設定を設計します。 セッション クッキー設定はセキュリティの重要性です:
Set-Cookie: session_id=<value>; HttpOnly; Secure; SameSite=Lax; Path=/; Domain=.example.com; Max-Age=86400HttpOnly(必須):JavaScript がクッキーにアクセスするのを防ぎます。XSS ベースのセッション盗難を軽減。セッション クッキーを JavaScript にアクセスできるようにする合法的な理由はありません。Secure(必須):クッキーは HTTPS でのみ送信。HTTP 経由の傍受を防ぎます。SameSite:Lax(推奨デフォルト):クッキーはトップレベル ナビゲーション (リンククリック) で送信されますが、クロスサイト POST リクエストまたはクロスオリジン サブリソース リクエストでは送信されません。CSRF 保護を提供しながらユーザビリティを維持 (外部サイトからのリンクはユーザーがログインされたままでも機能)。Strict:クロスサイト リクエストではクッキーが送信されません。CSRF 保護は最大ですが、ユーザーがメール/外部サイトからのリンクをクリックし、ログインしたままでいることを期待する場合シナリオを破ります。None(Secureを伴う):クロスサイト リクエストのすべてに送信。埋め込み iframe、クロスオリジン API 呼び出しなど、合法的なクロスサイト シナリオにのみ必須。追加の CSRF 保護が必要。
Path:特定の理由がない限り/に設定。Domain:サブドメイン間で共有する場合は親ドメイン (.example.com) に設定。正確な発行ドメインに制限するには省略。Max-AgeまたはExpires:目的のセッション期間に設定。ブラウザーを閉じたときに有効期限切れになるセッション クッキー (ただし注意:最新のブラウザーは再起動時にセッション クッキーを復元) の場合は省略。- クッキー名 :技術スタックを明かすデフォルト名 (
JSESSIONIDまたはPHPSESSIDなど) を避けます。汎用名 (__Host-sidなど) を使用 (__Host-プリフィックスは Secure、ドメインなし、および Path=/ を強制)。
__Host-プリフィックスを使用 (推奨):__Host-session_id。このブラウザーで強制されるプリフィックスは、クッキーがSecure、Domain属性がない (正確なホストにロック)、Path=/であることを保証。サブドメイン からのクッキー インジェクション攻撃を防ぎます。 -
セッション ライフサイクルを設計します。 セッションが時間とともにどのように動作するかを定義:
セッション タイムアウト :
- 絶対タイムアウト :アクティビティに関係なく最大セッション期間。例:SaaS の 24 時間、エンタープライズの 8 時間、銀行の 30 分。この期間後、セッションは無効で、ユーザーは再認証する必要があります。
- アイドル タイムアウト :非アクティブ期間後、セッションが有効期限切れになります。例:Web アプリケーション 30 分、機密アプリケーション 15 分。認証済みリクエストごとにリセット。アイドル タイムアウトは絶対タイムアウトより短くする必要があります。
- 実装 :セッション レコードに
created_at(絶対タイムアウト用) とlast_accessed_at(アイドル タイムアウト用) を保存。各リクエストで両方を確認:`now - created_at < absolute_limit AND now - last_accessed_at < idle
ライセンス: MIT(寛容ライセンスのため全文を引用しています) · 原本リポジトリ
詳細情報
- 作者
- Emmraan
- リポジトリ
- Emmraan/agent-skills
- ライセンス
- MIT
- 最終更新
- 2026/5/6
Source: https://github.com/Emmraan/agent-skills / ライセンス: MIT
関連スキル
secure-code-guardian
認証・認可の実装、ユーザー入力の保護、OWASP Top 10の脆弱性対策が必要な場合に使用します。bcrypt/argon2によるパスワードハッシング、パラメータ化ステートメントによるSQLインジェクション対策、CORS/CSPヘッダーの設定、Zodによる入力検証、JWTトークンの構築などのカスタムセキュリティ実装に対応します。認証、認可、入力検証、暗号化、OWASP Top 10対策、セッション管理、セキュリティ強化全般で活用できます。ただし、構築済みのOAuth/SSO統合や単独のセキュリティ監査が必要な場合は、より特化したスキルの検討をお勧めします。
claude-authenticity
APIエンドポイントが本物のClaudeによって支えられているか(ラッパーやプロキシ、偽装ではないか)を、claude-verifyプロジェクトを模した9つの重み付きルールベースチェックで検証できます。また、Claudeの正体を上書きしているプロバイダーから注入されたシステムプロンプトも抽出します。完全に自己完結しており、httpx以外の追加パッケージは不要です。Claude APIキーまたはエンドポイントを検証したい場合、サードパーティのClaudeサービスが本物か確認したい場合、APIプロバイダーのClaude正当性を監査したい場合、複数モデルを並行してテストしたい場合、またはプロバイダーが注入したシステムプロンプトを特定したい場合に使用できます。
anth-security-basics
Anthropic Claude APIのセキュリティベストプラクティスを適用し、キー管理、入力値の検証、プロンプトインジェクション対策を実施します。APIキーの保護、Claudeに送信する前のユーザー入力検証、コンテンツセーフティガードレールの実装が必要な場合に活用できます。「anthropic security」「claude api key security」「secure anthropic」「prompt injection defense」といったフレーズでトリガーされます。
x-ray
x-ray.mdプレ監査レポートを生成します。概要、強化された脅威モデル(プロトコルタイプのプロファイリング、Gitの重み付け攻撃面分析、時間軸リスク分析、コンポーザビリティ依存関係マッピング)、不変条件、統合、ドキュメント品質、テスト分析、開発者・Gitの履歴をカバーしています。「x-ray」「audit readiness」「readiness report」「pre-audit report」「prep this protocol」「protocol prep」「summarize this protocol」のキーワードで実行されます。
semgrep
Semgrepスタティック分析スキャンを実行し、カスタム検出ルールを作成します。Semgrepでのコードスキャン、セキュリティ脆弱性の検出、カスタムYAMLルールの作成、または特定のバグパターンの検出が必要な場合に使用します。重要:ユーザーが「バグをスキャンしたい」「コード品質を確認したい」「脆弱性を見つけたい」「スタティック分析」「セキュリティlint」「コード監査」または「コーディング標準を適用したい」と尋ねた場合も、Semgrepという名称を明記していなくても、このスキルを使用してください。Semgrepは30以上の言語に対応したパターンベースのコードスキャンに最適なツールです。
ghost-bits-cast-attack
Java「ゴーストビッツ」/キャストアタック プレイブック(Black Hat Asia 2026)。16ビット文字が8ビットバイトに暗黙的に縮小されるJavaサービスへの攻撃時に使用します。WAF/IDSを回避して、SQLインジェクション、デシリアライゼーション型RCE、ファイルアップロード(Webシェル)、パストトラバーサル、CRLF インジェクション、リクエストスマグリング、SMTPインジェクションを実行できます。Tomcat、Spring、Jetty、Undertow、Vert.x、Jackson、Fastjson、Apache Commons BCEL、Apache HttpClient、Angus Mail、JDK HttpServer、Lettuce、Jodd、XMLWriterに影響し、WAFバイパスにより多くの「パッチ済み」CVEを再度有効化します。