diff --git a/.env.example b/.env.example index dab25b2..a8708d4 100644 --- a/.env.example +++ b/.env.example @@ -5,3 +5,7 @@ VITE_API_BASE_URL=http://localhost:8001 # 백엔드 API 키 — 모든 요청에 x-api-key 헤더로 전송 VITE_API_KEY= + +# 'true' 로 설정 시 비-로컬호스트 환경(스테이징/IP 서버 등)에서도 /dev/* 와 /test 라우트 허용 +# 운영(production) 에는 절대 'true' 로 두지 말 것 +VITE_ENABLE_DEV_ROUTES=false diff --git a/src/features/dev/components/DevOnly.tsx b/src/features/dev/components/DevOnly.tsx index f660205..469a0d2 100644 --- a/src/features/dev/components/DevOnly.tsx +++ b/src/features/dev/components/DevOnly.tsx @@ -1,7 +1,11 @@ /** * DevOnly — `/dev/*` 라우트 가드. * - * `window.location.hostname` 이 로컬호스트 계열이 아닐 경우 루트로 리다이렉트. + * 허용 조건: + * - 빌드 시 `VITE_ENABLE_DEV_ROUTES=true` 가 설정된 경우, 또는 + * - `window.location.hostname` 이 로컬호스트 계열인 경우. + * 그 외에는 루트로 리다이렉트. + * * 클라이언트 사이드 가드라 보안 의미보다는 "운영 도메인에서 실수로 노출되는 것 방지" 용도. * 진짜 차단이 필요하면 서버/CDN 레벨에서 경로를 막아야 한다. */ @@ -20,8 +24,12 @@ function isLocalHost(): boolean { return LOCAL_HOSTNAMES.has(window.location.hostname); } +function isDevRoutesEnabled(): boolean { + return import.meta.env.VITE_ENABLE_DEV_ROUTES === 'true'; +} + export default function DevOnly() { - if (!isLocalHost()) { + if (!isDevRoutesEnabled() && !isLocalHost()) { return ; } return ;