From c4973224aa6745f93d96fa2c0c033fffaef6a7e9 Mon Sep 17 00:00:00 2001 From: king Date: Sun, 24 May 2026 18:15:00 +0900 Subject: [PATCH] =?UTF-8?q?feat(auth):=20X-Service-Token=20=ED=97=A4?= =?UTF-8?q?=EB=8D=94=EB=A1=9C=20=EC=84=9C=EB=B9=84=EC=8A=A4=20=EA=B0=84=20?= =?UTF-8?q?=ED=98=B8=EC=B6=9C=20=EC=9A=B0=ED=9A=8C=20=ED=97=88=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit OMS 의 반품 신청 같은 서버-서버 호출은 사용자 세션이 없으므로 AuthGuard 가 401 로 막아왔다. INTERNAL_SERVICE_TOKEN env 가 설정돼 있고 요청 헤더 X-Service-Token 이 같은 값이면 세션 검사를 우회한다. 보안: NPM 의 /corm/ location 블록에서 외부에서 들어온 X-Service-Token 헤더를 proxy_set_header X-Service-Token ""; 로 strip 해야 외부에서 토큰 추측 공격 방지. --- .env.example | 7 +++++++ main.py | 8 ++++++++ 2 files changed, 15 insertions(+) diff --git a/.env.example b/.env.example index fe53503..3f6d680 100644 --- a/.env.example +++ b/.env.example @@ -54,6 +54,13 @@ SESSION_NAME_KEY=user_name MAIN_LOGIN_URL=https://dbx.no1king.freeddns.org/login MAIN_LOGOUT_URL=https://dbx.no1king.freeddns.org/logout +# ===== 서비스 간 호출 인증 ===== +# OMS 가 반품 신청을 보낼 때 X-Service-Token 헤더로 이 값을 보낸다. +# CORM 의 AuthGuard 가 해당 헤더가 이 값과 일치하면 세션 검사 우회. +# OMS 의 .env 와 동일한 값으로 박을 것. +# NPM 은 외부에서 들어온 이 헤더를 strip 해야 한다 (보안). +INTERNAL_SERVICE_TOKEN=__paste-same-value-as-dbx-orderlist__ + # ============================================ # Docker network # ============================================ diff --git a/main.py b/main.py index 1fb269f..6cfc428 100644 --- a/main.py +++ b/main.py @@ -85,6 +85,14 @@ class AuthGuardMiddleware(BaseHTTPMiddleware): if path == prefix or path.startswith(prefix): return await call_next(request) + # 서비스 간 호출 — X-Service-Token 헤더가 일치하면 세션 없이도 통과. + # NPM 은 외부에서 들어온 이 헤더를 빈 값으로 strip 해야 한다 (보안). + service_token = os.getenv("INTERNAL_SERVICE_TOKEN", "") + if service_token: + incoming_token = request.headers.get("x-service-token", "") + if incoming_token and incoming_token == service_token: + return await call_next(request) + email = request.session.get(SESSION_USER_KEY) if email: return await call_next(request)