概要
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.yml の http://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 の内容を検証している
概要
DeepSec の診断で、
/api/healthが unauthenticated health check として安定して利用できないことが検出されました。この Issue は同一根本原因の以下 2 件をまとめています。
src/app/api/health/route.tssrc/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 3src/lib/supabase/proxy.ts: lines 47, 48, 56, 59, 60compose.prod.ymlのhttp://127.0.0.1:3000/api/healthhealthcheckother-healthcheck-auth-mismatch,other-healthcheck-blocked修正案
/api/healthを proxy matcher から除外する、または exact match の public path allowlist に追加する/login//registerの判定はstartsWithではなく exact path 判定を優先する受け入れ条件
/api/healthが 200 と{ "status": "ok" }を返す/api/healthが/loginへ redirect されない