サーバー側のセッションレコードは権限変更時に識別子をローテーションし、ログアウトや侵害時にはセッションファミリー全体を取り消し、クッキーに秘密情報を保存せずにアカウントUXで一覧表示と取り消しの証拠を公開します。
パッケージステータス: 参照コンテキストは人間によるレビュー準備完了。契約とテストシナリオは完成していますが、採用実装がそれらを通過したという主張はありません。
決定事項
ブラウザおよびAPIセッションは、不透明なセッションIDをキーとするサーバー側レコードです。クッキーやベアラートークンにはそのIDのみが保存されます。権限変更(パスワード変更、ロール付与、MFA登録、成功したステップアップ)により同一ファミリー内でIDがローテーションされます:前のIDはローテートされ認証できなくなります。現在のデバイスのログアウトはそのレコードをログアウト済みとしてマークします。パスワードリセット成功や侵害報告はファミリー全体を取り消します。アカウントセキュリティビューは生存中のファミリーを最終アクセス証拠とともにリスト表示し、監査行を書き込む取り消しアクションを提供します。
範囲
- ブラウザアプリケーションおよびAPIクライアント向けの作成、ローテーション、アイドルおよび絶対有効期限、ログアウト、ファミリー取り消し、一覧/取り消しUX。
- クッキー属性とクライアント側に保存してはならないもの。
このブロックの外
- リフレッシュトークンのローテーションと再利用検出(関連OAuthリフレッシュパッケージ)。
- ステップアップチャレンジUX(関連MFAパッケージ)およびハッシュ化リセットトークン発行(関連パスワードリセットパッケージ)。
契約
- クライアント秘密は不透明なセッションIDのみ;ユーザーID、テナント、ロール、認証レベルはサーバーレコードに保持。
- ローテーションは同一ファミリー内で新IDを発行し、旧IDは次のリクエストで失敗するようにする。
- ファミリー取り消しはすべての非終端の兄弟を無効化し、それらのIDでの後続リクエストは認証されない。
- 一覧エンドポイントは認証済みユーザーとテナントのセッションのみを返し、ファミリー取り消しに十分な証拠を含み、なりすましに十分な情報は含まない。
- アイドルTTLと絶対TTLはサーバー側で強制され、クッキー提示は既に期限切れのレコードを延長しない。
- 1つのセッションのログアウトはユーザーがファミリー取り消しを選択しない限り兄弟セッションを取り消さない。
実装ガイダンス
- テナント列を持つレコードを永続化し、署名されていないクッキーペイロードから認可しない。ローテーション時は権限変更完了と同じレスポンスで新しいクッキーを設定する。
- 合法的な遷移はstate-machine.mdに記載;ローテーションは新しいfamily_idを開始しない。
障害処理と安全策
- ローテーション中の同時リクエストは旧IDで1回成功する可能性がある;その後のリクエストは失敗し、2つの後継IDが発行されてはならない。
- 取り消し後に監査書き込みが失敗した場合は、取り消しを耐久的に保持し監査を再試行する。
検証と運用
- テストはロール付与時にローテーションし旧クッキーが拒否されることを証明;2つのセッションファミリーを取り消し両方が失敗することを証明。
このパッケージの実行例はフィクスチャと受け入れ契約です。コレクションルートで
python tools/validate.py
を実行してパッケージ構造とメタデータをチェックし、対象リポジトリでシナリオを実装・実行してください。
採用の前提
example.yamlの名前や数値は採用プロファイルであり普遍的なデフォルトではありません。- 採用チームはアクター、データクラス、エラー語彙、所有権を自システムにマッピングする必要があります。