diff --git a/src/main/java/com/eactive/eai/rms/bat/manage/rule/inter/BatInterfaceController.java b/src/main/java/com/eactive/eai/rms/bat/manage/rule/inter/BatInterfaceController.java index 3a74467..7131dcd 100644 --- a/src/main/java/com/eactive/eai/rms/bat/manage/rule/inter/BatInterfaceController.java +++ b/src/main/java/com/eactive/eai/rms/bat/manage/rule/inter/BatInterfaceController.java @@ -33,9 +33,9 @@ import com.eactive.eai.rms.common.login.SessionManager; import com.eactive.eai.rms.common.spring.LocaleMessage; import com.eactive.eai.rms.common.util.CamelCaseUtil; import com.eactive.eai.rms.common.util.CommonUtil; +import com.eactive.eai.rms.common.util.IpUtil; import com.eactive.eai.rms.common.vo.JsonPageVo; import com.eactive.eai.rms.onl.common.sql.BatInterfaceSqlService; -import com.eactive.eai.util.IpUtil; import com.eactive.eai.rms.onl.loader.service.TransactionLoaderService; @Controller diff --git a/src/main/java/com/eactive/eai/rms/common/acl/audit/adapter/in/web/AuditLogInterceptor.java b/src/main/java/com/eactive/eai/rms/common/acl/audit/adapter/in/web/AuditLogInterceptor.java index 641d0a3..2fe1393 100644 --- a/src/main/java/com/eactive/eai/rms/common/acl/audit/adapter/in/web/AuditLogInterceptor.java +++ b/src/main/java/com/eactive/eai/rms/common/acl/audit/adapter/in/web/AuditLogInterceptor.java @@ -14,7 +14,7 @@ import com.eactive.eai.rms.common.acl.audit.port.in.IsAuditableUsecase; import com.eactive.eai.rms.common.acl.audit.port.in.SaveAuditLogUseCase; import com.eactive.eai.rms.common.login.LoginVo; import com.eactive.eai.rms.common.util.CommonConstants; -import com.eactive.eai.util.IpUtil; +import com.eactive.eai.rms.common.util.IpUtil; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; diff --git a/src/main/java/com/eactive/eai/rms/common/acl/user/UserManController.java b/src/main/java/com/eactive/eai/rms/common/acl/user/UserManController.java index f70bc89..4f36429 100644 --- a/src/main/java/com/eactive/eai/rms/common/acl/user/UserManController.java +++ b/src/main/java/com/eactive/eai/rms/common/acl/user/UserManController.java @@ -28,9 +28,9 @@ import com.eactive.eai.rms.common.acl.user.ui.UserUISearch; import com.eactive.eai.rms.common.base.BaseAnnotationController; import com.eactive.eai.rms.common.datasource.DataSourceTypeManager; import com.eactive.eai.rms.common.login.SessionManager; +import com.eactive.eai.rms.common.util.IpUtil; import com.eactive.eai.rms.common.vo.GridResponse; import com.eactive.eai.rms.data.entity.onl.unifbwk.UnifBwkTpService; -import com.eactive.eai.util.IpUtil; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; diff --git a/src/main/java/com/eactive/eai/rms/common/acl/user/util/UserRegistUtilController.java b/src/main/java/com/eactive/eai/rms/common/acl/user/util/UserRegistUtilController.java index 21c8a31..c961af0 100644 --- a/src/main/java/com/eactive/eai/rms/common/acl/user/util/UserRegistUtilController.java +++ b/src/main/java/com/eactive/eai/rms/common/acl/user/util/UserRegistUtilController.java @@ -5,7 +5,7 @@ import com.eactive.eai.rms.common.base.BaseAnnotationController; import com.eactive.eai.rms.common.datasource.DataSourceType; import com.eactive.eai.rms.common.datasource.DataSourceTypeManager; import com.eactive.eai.rms.common.login.SessionManager; -import com.eactive.eai.util.IpUtil; +import com.eactive.eai.rms.common.util.IpUtil; import com.fasterxml.jackson.databind.ObjectMapper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; diff --git a/src/main/java/com/eactive/eai/rms/common/logging/RequestParameterLoggingAspect.java b/src/main/java/com/eactive/eai/rms/common/logging/RequestParameterLoggingAspect.java index c776ebd..c1d7a7d 100644 --- a/src/main/java/com/eactive/eai/rms/common/logging/RequestParameterLoggingAspect.java +++ b/src/main/java/com/eactive/eai/rms/common/logging/RequestParameterLoggingAspect.java @@ -16,8 +16,8 @@ import com.eactive.eai.rms.common.datasource.DataSourceContextHolder; import com.eactive.eai.rms.common.datasource.DataSourceType; import com.eactive.eai.rms.common.datasource.DataSourceTypeManager; import com.eactive.eai.rms.common.login.SessionManager; +import com.eactive.eai.rms.common.util.IpUtil; import com.eactive.eai.rms.common.util.StringUtils; -import com.eactive.eai.util.IpUtil; @Aspect @Component diff --git a/src/main/java/com/eactive/eai/rms/common/logging/UserAccessLogger.java b/src/main/java/com/eactive/eai/rms/common/logging/UserAccessLogger.java index d817927..b9282d0 100644 --- a/src/main/java/com/eactive/eai/rms/common/logging/UserAccessLogger.java +++ b/src/main/java/com/eactive/eai/rms/common/logging/UserAccessLogger.java @@ -5,7 +5,7 @@ import javax.servlet.http.HttpServletRequest; import org.apache.log4j.Logger; import com.eactive.eai.rms.common.login.SessionManager; -import com.eactive.eai.util.IpUtil; +import com.eactive.eai.rms.common.util.IpUtil; public class UserAccessLogger { private static final Logger ACCESS_LOGGER = Logger.getLogger("ACCESS_LOGGER"); diff --git a/src/main/java/com/eactive/eai/rms/common/login/MainController.java b/src/main/java/com/eactive/eai/rms/common/login/MainController.java index 4e5125e..f9cac15 100644 --- a/src/main/java/com/eactive/eai/rms/common/login/MainController.java +++ b/src/main/java/com/eactive/eai/rms/common/login/MainController.java @@ -32,11 +32,11 @@ import org.springframework.web.servlet.View; import com.eactive.eai.common.seed.Seed; import com.eactive.eai.data.converter.LocalDateTimeFormatters; import com.eactive.eai.rms.common.context.MonitoringContext; -import com.eactive.eai.util.IpUtil; import com.eactive.eai.rms.common.datasource.DataSourceType; import com.eactive.eai.rms.common.datasource.DataSourceTypeManager; import com.eactive.eai.rms.common.interceptor.InterceptorSkipController; import com.eactive.eai.rms.common.logging.UserAccessLogger; +import com.eactive.eai.rms.common.util.IpUtil; import com.eactive.eai.rms.common.spring.LocaleMessage; import com.eactive.eai.rms.common.util.CommonConstants; import com.eactive.eai.rms.data.entity.man.monitoringProperty.service.MonitoringPropertyService; diff --git a/src/main/java/com/eactive/eai/rms/common/util/IpUtil.java b/src/main/java/com/eactive/eai/rms/common/util/IpUtil.java new file mode 100644 index 0000000..f8c2b5b --- /dev/null +++ b/src/main/java/com/eactive/eai/rms/common/util/IpUtil.java @@ -0,0 +1,73 @@ +package com.eactive.eai.rms.common.util; + +import javax.servlet.http.HttpServletRequest; + +import org.apache.commons.lang3.StringUtils; + +/** + * IP 주소 관련 유틸리티 클래스 + * + * 프록시(OHS, WebLogic 등)를 통해 들어온 요청의 실제 클라이언트 IP를 추출합니다. + */ +public class IpUtil { + + /** + * HttpServletRequest에서 실제 클라이언트 IP를 추출합니다. + * 프록시(OHS, WebLogic 등)를 통해 들어온 요청의 경우 프록시 헤더를 확인하여 실제 클라이언트 IP를 반환합니다. + * + * 확인하는 헤더 순서: + * 1. X-Forwarded-For (가장 일반적인 프록시 헤더) + * 2. Proxy-Client-IP + * 3. WL-Proxy-Client-IP (WebLogic 전용 헤더) + * 4. HTTP_X_FORWARDED_FOR + * 5. request.getRemoteAddr() (fallback) + * + * @param request HttpServletRequest 객체 + * @return 실제 클라이언트 IP 주소 + */ + public static String getClientIp(HttpServletRequest request) { + if (request == null) { + return "unknown"; + } + + String ip = request.getHeader("X-Forwarded-For"); + + if (StringUtils.isBlank(ip) || "unknown".equalsIgnoreCase(ip)) { + ip = request.getHeader("Proxy-Client-IP"); + } + + if (StringUtils.isBlank(ip) || "unknown".equalsIgnoreCase(ip)) { + ip = request.getHeader("WL-Proxy-Client-IP"); + } + + if (StringUtils.isBlank(ip) || "unknown".equalsIgnoreCase(ip)) { + ip = request.getHeader("HTTP_X_FORWARDED_FOR"); + } + + if (StringUtils.isBlank(ip) || "unknown".equalsIgnoreCase(ip)) { + ip = request.getRemoteAddr(); + } + + // X-Forwarded-For 헤더에 여러 IP가 쉼표로 구분되어 있을 경우 첫 번째 IP만 사용 + if (ip != null && ip.indexOf(",") > 0) { + ip = ip.substring(0, ip.indexOf(",")).trim(); + } + + return ip; + } + + /** + * IP 주소가 유효한 IPv4 형식인지 검증합니다. + * + * @param ip 검증할 IP 주소 + * @return 유효한 IPv4 형식이면 true, 아니면 false + */ + public static boolean isValidIp(String ip) { + if (StringUtils.isBlank(ip)) { + return false; + } + + String ipPattern = "(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}"; + return ip.matches(ipPattern); + } +} diff --git a/src/main/java/com/eactive/eai/rms/onl/manage/adapter/adapter/AdapterController.java b/src/main/java/com/eactive/eai/rms/onl/manage/adapter/adapter/AdapterController.java index 8baf6e8..3897bfb 100644 --- a/src/main/java/com/eactive/eai/rms/onl/manage/adapter/adapter/AdapterController.java +++ b/src/main/java/com/eactive/eai/rms/onl/manage/adapter/adapter/AdapterController.java @@ -36,10 +36,10 @@ import com.eactive.eai.rms.common.datasource.DataSourceType; import com.eactive.eai.rms.common.datasource.DataSourceTypeManager; import com.eactive.eai.rms.common.login.SessionManager; import com.eactive.eai.rms.common.spring.LocaleMessage; +import com.eactive.eai.rms.common.util.IpUtil; import com.eactive.eai.rms.common.util.MonitoringSyncAgent; import com.eactive.eai.rms.common.vo.GridResponse; import com.eactive.eai.rms.data.entity.onl.adapter.AdapterGroupService; -import com.eactive.eai.util.IpUtil; import com.eactive.eai.rms.onl.loader.service.HistoryService; import com.eactive.eai.rms.onl.loader.service.TransactionLoaderService; import com.eactive.eai.rms.onl.manage.adapter.adapter.ui.AdapterExportData; diff --git a/src/main/java/com/eactive/eai/rms/onl/manage/rule/layout/LayoutManController.java b/src/main/java/com/eactive/eai/rms/onl/manage/rule/layout/LayoutManController.java index 36aaf8a..7711a6c 100644 --- a/src/main/java/com/eactive/eai/rms/onl/manage/rule/layout/LayoutManController.java +++ b/src/main/java/com/eactive/eai/rms/onl/manage/rule/layout/LayoutManController.java @@ -50,10 +50,10 @@ import com.eactive.eai.rms.common.datasource.DataSourceTypeManager; import com.eactive.eai.rms.common.login.SessionManager; import com.eactive.eai.rms.common.spring.LocaleMessage; import com.eactive.eai.rms.common.util.CommonUtil; +import com.eactive.eai.rms.common.util.IpUtil; import com.eactive.eai.rms.common.vo.GridResponse; import com.eactive.eai.rms.common.vo.JsonPageVo; import com.eactive.eai.rms.common.vo.SimpleResponse; -import com.eactive.eai.util.IpUtil; import com.eactive.eai.rms.onl.common.exception.BizException; import com.eactive.eai.rms.onl.loader.service.HistoryService; import com.eactive.eai.rms.onl.loader.service.TransactionLoaderService; diff --git a/src/main/java/com/eactive/eai/rms/onl/manage/rule/transform/TransformController.java b/src/main/java/com/eactive/eai/rms/onl/manage/rule/transform/TransformController.java index 260a572..3055d55 100644 --- a/src/main/java/com/eactive/eai/rms/onl/manage/rule/transform/TransformController.java +++ b/src/main/java/com/eactive/eai/rms/onl/manage/rule/transform/TransformController.java @@ -33,9 +33,9 @@ import com.eactive.eai.rms.common.spring.BaseController; import com.eactive.eai.rms.common.spring.LocaleMessage; import com.eactive.eai.rms.common.util.CamelCaseUtil; import com.eactive.eai.rms.common.util.CommonUtil; +import com.eactive.eai.rms.common.util.IpUtil; import com.eactive.eai.rms.common.vo.JsonPageVo; import com.eactive.eai.rms.onl.common.exception.BizException; -import com.eactive.eai.util.IpUtil; import com.eactive.eai.rms.onl.loader.service.HistoryService; import com.eactive.eai.rms.onl.loader.service.TransactionLoaderService; import com.google.gson.Gson; diff --git a/src/main/java/com/eactive/eai/rms/onl/manage/rule/transform2/Transform2Controller.java b/src/main/java/com/eactive/eai/rms/onl/manage/rule/transform2/Transform2Controller.java index 864b692..28cb813 100644 --- a/src/main/java/com/eactive/eai/rms/onl/manage/rule/transform2/Transform2Controller.java +++ b/src/main/java/com/eactive/eai/rms/onl/manage/rule/transform2/Transform2Controller.java @@ -33,11 +33,11 @@ import com.eactive.eai.rms.common.datasource.DataSourceTypeManager; import com.eactive.eai.rms.common.login.SessionManager; import com.eactive.eai.rms.common.spring.BaseController; import com.eactive.eai.rms.common.spring.LocaleMessage; +import com.eactive.eai.rms.common.util.IpUtil; import com.eactive.eai.rms.common.vo.GridResponse; import com.eactive.eai.rms.common.vo.SimpleResponse; import com.eactive.eai.rms.onl.common.exception.BizException; import com.eactive.eai.rms.onl.common.exception.EMSRuntimeException; -import com.eactive.eai.util.IpUtil; import com.eactive.eai.rms.onl.loader.service.HistoryService; import com.eactive.eai.rms.onl.loader.service.TransactionLoaderService; import com.eactive.eai.rms.onl.manage.rule.layout.LayoutManService; diff --git a/src/main/java/com/eactive/eai/rms/onl/manage/serviceinfo/eaimsg/EaiMsgController.java b/src/main/java/com/eactive/eai/rms/onl/manage/serviceinfo/eaimsg/EaiMsgController.java index c75b058..f82d825 100644 --- a/src/main/java/com/eactive/eai/rms/onl/manage/serviceinfo/eaimsg/EaiMsgController.java +++ b/src/main/java/com/eactive/eai/rms/onl/manage/serviceinfo/eaimsg/EaiMsgController.java @@ -38,10 +38,10 @@ import com.eactive.eai.rms.common.login.SessionManager; import com.eactive.eai.rms.common.spring.BaseController; import com.eactive.eai.rms.common.spring.LocaleMessage; import com.eactive.eai.rms.common.util.CommonUtil; +import com.eactive.eai.rms.common.util.IpUtil; import com.eactive.eai.rms.common.vo.GridResponse; import com.eactive.eai.rms.data.entity.onl.eaimsg.EAIMessageUISearch; import com.eactive.eai.rms.onl.common.exception.EMSRuntimeException; -import com.eactive.eai.util.IpUtil; import com.eactive.eai.rms.onl.loader.service.HistoryService; import com.eactive.eai.rms.onl.loader.service.TransactionLoaderService; import com.eactive.eai.rms.onl.manage.adapter.adapter.AdapterManService;