728x90
반응형
문제 인식
기본적으로 HttpServletRequest 를 이용하여 객체 내 함수로 클라이언트 IP를 가져올 수 있다.
기본 클라이언트 IP 를 가져오는 방법은 아래와 같다.
import javax.servlet.http.HttpServletRequest;
request.getRemoteAddr();
하지만 이 코드를 실 운영에서 이용할 경우 문제가 있다.
대부분의 회사에서는 보안 관련 방화벽이나 클라우드로 운영하는 경우가 많은데, 이 경우 클라이언트의 원 IP주소를 가져올 수 없다.
클라이언트가 요청을 하면 Web Server에서 프록시나 로드 밸런서를 통해 WAS에 요청하기 때문에 프록시나 로드 밸런서의 IP 주소를 반환하게 된다. 그래서 원 IP를 못가져오는 현상이 발생한다.
해결
아래와 같이 샘플코드 형식으로 작성하면 클라이언트IP를 가져올 수 있다.
public static String getClientIP(HttpServletRequest request) {
String ip = request.getHeader("X-Forwarded-For");
logger.info("> X-FORWARDED-FOR : " + ip);
if (ip == null) {
ip = request.getHeader("Proxy-Client-IP");
logger.info("> Proxy-Client-IP : " + ip);
}
if (ip == null) {
ip = request.getHeader("WL-Proxy-Client-IP");
logger.info("> WL-Proxy-Client-IP : " + ip);
}
if (ip == null) {
ip = request.getHeader("HTTP_CLIENT_IP");
logger.info("> HTTP_CLIENT_IP : " + ip);
}
if (ip == null) {
ip = request.getHeader("HTTP_X_FORWARDED_FOR");
logger.info("> HTTP_X_FORWARDED_FOR : " + ip);
}
if (ip == null) {
ip = request.getRemoteAddr();
logger.info("> getRemoteAddr : "+ip);
}
logger.info("> Result : IP Address : "+ip);
return ip;
}
X-Forwarded-For (XFF) 헤더는 HTTP 프록시나 로드 밸런서를 통해 웹 서버에 접속하는 클라이언트의 원 IP 주소를 식별하는 표준 헤더로 쓰이고 있다.
그래서 프록시나 로드밸런스 등을 사용할 경우 Apache/Nginx에서 설정이 되어있다는 가정하에 클라이언트의 실제 접속 IP를 가져올 수 있다.
728x90
반응형
'Dev' 카테고리의 다른 글
[Next Step] 자바 웹프로그래밍 2.3 정리 (0) | 2022.08.24 |
---|---|
[Next Step] 자바 웹프로그래밍 2.1,2.2 정리 (0) | 2022.08.22 |
Restful 하다는 것은 뭘까? (0) | 2022.07.18 |
[Spring] 의존성 주입(DI)에 대해 알아보자 - 3 / 의존성 주입 (0) | 2022.03.03 |
[Spring] 의존성 주입(DI) 에 대해 알아보자 - 2 / Bean 설정 (0) | 2022.03.02 |