From 4092f5e8b40e3041bf2399c6459c2ae206ee2de5 Mon Sep 17 00:00:00 2001 From: htlee Date: Mon, 16 Feb 2026 23:50:41 +0900 Subject: [PATCH] =?UTF-8?q?fix(auth):=20=EB=A1=9C=EA=B7=B8=EC=9D=B8=20IP?= =?UTF-8?q?=EB=A5=BC=20X-Forwarded-For=20=ED=97=A4=EB=8D=94=EC=97=90?= =?UTF-8?q?=EC=84=9C=20=EC=B6=94=EC=B6=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Nginx 리버스 프록시 환경에서 getRemoteAddr()가 127.0.0.1 반환하는 문제 수정. X-Forwarded-For → X-Real-IP → getRemoteAddr() 순서로 폴백. Co-Authored-By: Claude Opus 4.6 --- .../java/com/gcsc/guide/auth/AuthController.java | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/gcsc/guide/auth/AuthController.java b/src/main/java/com/gcsc/guide/auth/AuthController.java index a4975b7..8e10675 100644 --- a/src/main/java/com/gcsc/guide/auth/AuthController.java +++ b/src/main/java/com/gcsc/guide/auth/AuthController.java @@ -24,7 +24,6 @@ import lombok.extern.slf4j.Slf4j; import java.util.HashSet; import java.util.List; -import java.util.Set; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.security.core.Authentication; @@ -85,7 +84,7 @@ public class AuthController { activityService.recordLogin( userWithRoles.getId(), - httpRequest.getRemoteAddr(), + resolveClientIp(httpRequest), httpRequest.getHeader("User-Agent")); String token = jwtTokenProvider.generateToken( @@ -143,4 +142,16 @@ public class AuthController { newUser.updateLastLogin(); return userRepository.save(newUser); } + + private String resolveClientIp(HttpServletRequest request) { + String xff = request.getHeader("X-Forwarded-For"); + if (xff != null && !xff.isBlank()) { + return xff.split(",")[0].trim(); + } + String realIp = request.getHeader("X-Real-IP"); + if (realIp != null && !realIp.isBlank()) { + return realIp.trim(); + } + return request.getRemoteAddr(); + } }