Middleware 가 모든 요청의 진입점. 라우트별 decorator 가 아니라 여기에 auth 두는 게 — 새 라우트에 잊을 수 없어. 새 엔드포인트가 기본으로 게이트 상속; public 만들려면 명시적 opt-in.
체크 순서가 중요해
Public 먼저 (싸, DB hit 없음), 그다음 killswitch (PIN 비활성), 그다음 bypass (싸), 그다음 blacklist (DB hit 한 번, hit 시 즉시 return), 그다음 session check (가장 느림), 그다음 login redirect. 알려진 bad IP 의 403 이 session lookup 보다 비용 적어.
진짜 client IP 얻기
reverse proxy 뒤면 request.client.host 가 실제 client 가 아니라 proxy 의 IP 보여. X-Forwarded-For 헤더 필요 — 근데 알려진 proxy 한테서만 신뢰.