728x90
Spring | request.getRemoteAddr() 로 IP가 추적되지않을 때
Proxy환경에서 Client IP 얻기
내용 및 소스코드는 하단 참고 링크에서 인용하여 제가 이해한 방식으로 정리하여 작성하였습니다.
혹 내용에 오류가 있다면 피드백주시면 바로 확인해보겠습니다.
request.getRemoteAddr() 으로 추적되지않는 IP
Spring API 서버에서 호출한 클라이언트의 IP를 얻기위해 위 구문을 이용하였지만
중간 L4 Load balancers / 프록시서버 등이 개입되면서
위 request.getRemoteAddr() 등으로 IP를 얻을경우 L4 또는 Proxy IP를 얻게되고 원하는 클라이언트의 IP가 얻어지지않는다.
HttpServletRequest 클래스의 getRemoteAddr 함수는 클라이언트의 IP를 가져오지만
로드밸런싱을 통하거나 프록시 서버를 거치게되면 해당 LB IP 또는 프록시 IP를 전달하게됩니다.
해결방안
만약 만들고 있는 웹 어플리케이션이 WebServer, WAS, L4, proxy 종류에 상관없이 client IP 를 잘 가져오기를 바란다면 다음과 같은 순서로 IP 를 얻어내야 한다.
X-Forwarded-For 헤더부터 검증한 뒤 하나씩 검증하며 내려가는 절차입니다.
X-Forwarded-For -> Proxy-Client-IP -> WL-Proxy-Client-IP -> HTTP_CLIENT_IP -> HTTP_X_FORWARDED_FOR
CODE
String ip = request.getHeader("X-Forwarded-For");
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("Proxy-Client-IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("WL-Proxy-Client-IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("HTTP_CLIENT_IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("HTTP_X_FORWARDED_FOR");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getRemoteAddr();
}
참고
728x90
728x90
'Dev > [JAVA] Spring, Jpa ...' 카테고리의 다른 글
Spring | class file has wrong version 61.0, should be 52.0 오류 (0) | 2024.08.29 |
---|---|
Intellij Community | Spring boot Gradle 프로젝트 생성하기 (0) | 2024.08.27 |
Spring | SNAPSHOT / M / RC / GA(RELEASE) 버젼 차이점 (0) | 2024.08.26 |
[JAVA] 자바(Java) 화폐 단위 콤마 찍기 (###,###) / 자바숫자 포맷변경 (0) | 2023.08.24 |