Skip to content

browser session / API proxy の security invariant を機械保証する #48

Description

@koh110

背景

client と backend の間には、browser に backend credential を露出させないための same-origin proxy が存在する。

browser-side request は GET / POST / PUT / DELETE 等を /proxy/api/* へ送り、server-side proxy が session cookie を検証して backend の Authorization header を注入する。

GET も pagination / polling / refresh 等の browser interaction で必要になるため、proxy の正規用途として扱う。

目的

HTTP method に依存せず、browser / proxy / backend の security boundary を機械保証する。

正規の通信経路

Initial server-side request

Server Component / Server Action
      ↓
server API client
      ↓
backend

Browser-driven request

browser
      ↓
same-origin /proxy/api/*
      ↓
session validation
      ↓
Authorization injection
      ↓
backend

proxy は GET を含む browser-driven request をサポートする。

Security invariant

Session cookie

  • HttpOnly
  • production では Secure
  • SameSite=Lax 以上
    -有限の expiry
    -明示的な path

Proxy

  • browser に backend Authorization token を返さない
  • Authorization は server-side proxy でのみ注入する
  • backend URI は server-only config とする
  • arbitrary browser Authorization header をそのまま trust / forward しない
  • forwarding header を allowlist 化する
  • backend response header も必要なものだけ返す
  • session 未認証時は backend を呼ばず 401

CSRF / request semantics

GET / HEAD は read-only request として proxy 可能。

POST / PUT / PATCH / DELETE 等の state-changing request については same-origin / Origin / CSRF policy を定義して検証する。

「GETをproxyで禁止する」ことは本 policy の目的ではない。

Acceptance Criteria

  • proxy GET を正規用途として維持する
  • browser request から backend Authorization を直接指定できない
  • proxy が session cookie から server-side で Authorization を構築する
  • production session cookie が Secure + HttpOnly になることを test する
  • session cookie の SameSite / expiry / path contract を test する
  • mutation request の CSRF policy を定義し test する
  • proxy request / response header forwarding を allowlist 化する
  • unauthenticated request では backend call が発生しないことを test する

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions