From 4d036eafefb6e1512e3270cb0189a00f9e3c0041 Mon Sep 17 00:00:00 2001 From: tkdgusqkr Date: Fri, 14 Aug 2026 00:33:43 +0900 Subject: [PATCH] =?UTF-8?q?fix(preview):=20=ED=8F=89=EB=AC=B8=20HTTP=20?= =?UTF-8?q?=ED=94=84=EB=A6=AC=EB=B7=B0=EC=97=90=EC=84=9C=20=EC=84=B8?= =?UTF-8?q?=EC=85=98=20=EC=BF=A0=ED=82=A4=EA=B0=80=20=EB=B2=84=EB=A0=A4?= =?UTF-8?q?=EC=A7=80=EB=8D=98=20=EB=AC=B8=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `serviceOpsCookieSecure()` 가 `NODE_ENV === "production"` 만 보고 Secure 를 붙였다. 프리뷰는 `next start` 라 NODE_ENV 가 production 으로 고정되는데 :8090 은 평문 HTTP 이므로 브라우저가 세션 쿠키를 그대로 버렸다. 로그인 직후 화면은 한 번 그려지고 이후 모든 요청이 /login 으로 튕겼다 — 운영자에게는 "자원 관리를 누르면 오류" 로 보였다. SERVICE_OPS_COOKIE_INSECURE 로 프리뷰에서만 끌 수 있게 한다. 운영 env 에는 절대 넣지 않는다 — 그쪽은 HTTPS 라 Secure 가 반드시 붙어야 한다. provision 스크립트가 프리뷰 env 를 만들 때만 이 값을 쓴다. Co-Authored-By: Claude Opus 5 --- deploy/scripts/provision-console-preview.sh | 4 ++++ .../lib/services/service-ops-session.ts | 19 +++++++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/deploy/scripts/provision-console-preview.sh b/deploy/scripts/provision-console-preview.sh index 48a92ed0..35a4c462 100644 --- a/deploy/scripts/provision-console-preview.sh +++ b/deploy/scripts/provision-console-preview.sh @@ -147,6 +147,10 @@ else PORT=${WEB_PORT} NODE_ENV=production SERVICE_OPS_API_BASE_URL=http://127.0.0.1:${API_PORT} +# 프리뷰는 평문 HTTP 라 Secure 쿠키가 브라우저에 저장되지 않는다. 그러면 로그인 직후 +# 화면은 보이지만 다음 요청부터 세션이 없어 /login 으로 되돌아간다. +# **운영 env 에는 절대 넣지 않는다.** 프리뷰에 TLS 를 붙이면 이 줄을 지운다. +SERVICE_OPS_COOKIE_INSECURE=true ${map_lines} EOF_WEB log "${WEB_ENV} 작성 (600)" diff --git a/development/frontend/lib/services/service-ops-session.ts b/development/frontend/lib/services/service-ops-session.ts index 2ed6b324..dee4d3c1 100644 --- a/development/frontend/lib/services/service-ops-session.ts +++ b/development/frontend/lib/services/service-ops-session.ts @@ -112,6 +112,25 @@ export async function logoutServiceOpsSession(): Promise { }); } +/** + * 세션 쿠키에 `Secure` 를 붙일지. + * + * 기본은 운영 빌드에서 항상 붙인다. 다만 **평문 HTTP 로 접근하는 프리뷰**에서는 브라우저가 + * Secure 쿠키를 저장하지 않아 로그인 직후 화면은 보이지만 다음 요청부터 세션이 없어 + * `/login` 으로 되돌아간다. 인증이 필요한 QA 자체가 불가능해진다. + * + * `next start` 가 NODE_ENV 를 production 으로 강제하므로 env 에서 지우는 것으로는 풀리지 + * 않는다. 그래서 명시적 옵트아웃을 둔다. + * + * **이 변수는 프리뷰 전용이다.** 설정하지 않으면 운영 동작이 그대로이고, 이름에 + * `INSECURE` 를 넣어 무엇을 포기하는지 드러냈다. 운영 호스트의 env 에는 절대 넣지 않는다 — + * 넣으면 관리자 세션 쿠키가 평문으로 흐른다. + * + * 근본 해결은 프리뷰에 TLS 를 붙이는 것이다. 그때 이 변수를 지운다. + */ function serviceOpsCookieSecure(): boolean { + if (process.env.SERVICE_OPS_COOKIE_INSECURE === "true") { + return false; + } return process.env.NODE_ENV === "production"; }