Skip to content

design(security): /api/auth/me のアクティブテナント解決を ADR-0016 と整合させ、クライアント永続化方式を文書化 #682

@win2cot

Description

@win2cot

背景

PR #681(Issue #663)で、テナント選択がリロードで消える不具合を web/js/api.js の sessionStorage 永続化で修正した。これは単純バグではなく設計漏れの露出であり、以下 2 点を確定・文書化する。

現状(コード確認済み)

  • MeControlleractiveTenantIdX-Tenant-Id ヘッダから echo するだけで、/api/auth/me は免除パスのため ADR-0016 の自動解決が走らない(コメントにも「自動解決 ADR-0016 は /me では行わない」と明記)。
  • SwitchTenantUseCase は所属検証のみで、アクティブテナントを永続化しない。
  • 結果、アクティブテナントの SSOT はクライアント側(毎リクエストの X-Tenant-Id)。リロードでインメモリが消えると /me がヘッダ無し→activeTenantId=nullindex.html ループ。

ADR-0016 との非整合

ADR-0016 は「�レッダ省略時はサーバが joined_at ASC で初期テナントを自動解決し、フロントはヘッダを省略可能になる」と決定。しかし /me は免除パスで自動解決せず、フロントの遷移ゲート(me.activeTenantId !== null)が明示選択を強制している。ADR-0016 が謳った効果が /me に反映されていない。

論点(本 Issue で決定)

  • 案A(クライアント SSOT を正式採用): X-Tenant-Id 常時送出 + sessionStorage 保持を規約に明記。ADR-0016 サーバ自動解決は防御的フォールバックと位置づけ直す。さらに /me でも自動解決(または最終選択返却)を行えば初回・復帰時にセレクタを飛ばせ、PR chore(web): ブラウザ警告・エラーの撲滅 — favicon / テナント選択 sessionStorage 永続化 (#663) #681 の単一テナント自動選択(F-3)は不要になる。
  • 案B(ADR-0016 を尊重): /me に自動解決を効かせ activeTenantId を joined_at-ASC で返す。ループは発生源で消え、F-3 も冗長になる。

やること

  • 案A / 案B を比較し方針確定
  • ADR-0016 の amendment(または新 ADR)で決定を記録
  • docs/specs/設計規約.md §3.3 と docs/specs/基本設計書.md(712 行: 「Cookie または X-Tenant-Id ヘッダ」)に、アクティブテナントのクライアント永続化方式(sessionStorage)と /meactiveTenantId 仕様を明記
  • 必要なら /me 解決ロジックの実装は別 impl Issue に切り出し

関連

PR #681 / Issue #663 / ADR-0016 / 設計規約 §3.3

Metadata

Metadata

Assignees

No one assigned

    Labels

    area/backendJava / Spring バックエンド実装変更area/docsdocs/ 配下のドキュメント(設計書・規約・ADR 等)変更priority/p2Medium。完了が望ましいが柔軟に判断可task-type:design規約・ADR・設計書の追加/変更タスク

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions