学習(7/18)

2025-07-18
  • 学習
    • 同じポリシーを通過とは?
    • RLSは優れたテナント分離を提供しますが、誤って壊してしまう可能性があります。
  • マイグレーション、クロンジョブ、バックグラウンドワーカー、スーパーユーザーを介して実行されるすべてのクエリが、同じポリシーを通過することを確認してください。「サービス」ユーザーがset_config('tenant_id', …)を実行し忘れると、ガードがバイパスされます。
  • pg_policiesをスキャンし、テーブルにテナントポリシーがない場合にマージをブロックするCIテストを追加してください。
  • PERMISSIVEポリシーと"USING (org_id = current_setting('tenant.id')::uuid)"を好み、BYPASS RLSを禁止してください。
  • アプリの接続でSET ROLEを無効にし、RLSが誤って無効にされないようにしてください。
    • set_configとは?
    • 接続プーラー内でリクエストごとset_config('tenant.id', …, true)を使用してください。
  • asyncpg/SQLAlchemy + pgbouncerを「transaction」プーリングモードで使用している場合、pgbouncerがセッション状態をDISCARDすることに注意してください。set_configを「pre-statement」フックでラップするか、「session」プーリングに切り替えてください。
  • プレーンテキストではなく、tenant.idをUUIDに設定して、整数IDとの混同を避けてください。
    • クッキー認証について
  • 2. 認証 (Clerk) とセッションセキュリティ

  • クッキー認証は問題ありませんが、以下の点を確認してください:
  • 埋め込みウィジェットに応じてSameSite=Strict/Laxを設定。
  • 短期間のセッションクッキーとhttpOnly + secureなリフレッシュクッキーを分離。
  • トークンリプレイを妨げるために、リフレッシュトークンにデバイスバインディングを追加。
    • React CSP ? SRI?
  • Reactビルドに厳格なCSPとサブソース整合性(SRI)を適用する。
    • RLSポリシーにUSING句とWITH CHECK句の両方が必要
    • 検索のためにtrigram GINインデックスを持つ生成列lower(name)を追加
    • RLS検証のためにpgTAPテストまたはpytest-postgresフィクスチャを追加
    • トランザクション管理のためのユニットオブワークパターンが不足
    • ユニットオブワーク (PoEAA) - Martin Fowl