Skip to content

[DeepSec] /api/health が認証プロキシでリダイレクトされヘルスチェックが不安定になる #47

@TkymHrt

Description

@TkymHrt

概要

DeepSec の診断で、/api/health が unauthenticated health check として安定して利用できないことが検出されました。

この Issue は同一根本原因の以下 2 件をまとめています。

  • src/app/api/health/route.ts
  • src/lib/supabase/proxy.ts

影響

health handler 自体は { "status": "ok" } を返しますが、global な Next proxy matcher が /api/health にも適用され、updateSession/login/register のみを public path として扱っています。

そのため、未認証の Docker healthcheck や load balancer healthcheck が /api/health にアクセスした際、期待する JSON ではなく /login へリダイレクトされる可能性があります。healthcheck 側が redirect を追従すると、ログインページを取得しているだけなのに成功扱いになるおそれもあります。

対象

  • src/app/api/health/route.ts: line 3
  • src/lib/supabase/proxy.ts: lines 47, 48, 56, 59, 60
  • 関連: compose.prod.ymlhttp://127.0.0.1:3000/api/health healthcheck
  • DeepSec severity: BUG
  • Confidence: high / medium
  • Slug: other-healthcheck-auth-mismatch, other-healthcheck-blocked

修正案

  • /api/health を proxy matcher から除外する、または exact match の public path allowlist に追加する
  • /login / /register の判定は startsWith ではなく exact path 判定を優先する
  • Docker healthcheck は redirect を成功扱いしないようにし、期待する health JSON を検証する

受け入れ条件

  • 未認証リクエストで /api/health が 200 と { "status": "ok" } を返す
  • /api/health/login へ redirect されない
  • container healthcheck が redirect ではなく health response の内容を検証している

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions