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 ;