클라이언트와 서버의 중간의 로드밸런서나 프록시를 거치면,
서버 접근 로그에는 로드밸런서나 프록시의 IP 주소를 담고있다.
클라이언트의 원 IP를 알기위해서는 X-Forwarded-For (XFF) 헤더가 표준으로 사용된다.
아래의 코드로 Util 소스에서 처리한다.
WebServer, WAS, L4, proxy 종류와 상관없이 clientIP를 가져오기 위해서는 다음과 같은 순서로 IP를 찾아야한다.
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.servlet.http.HttpServletRequest;
public class LogUtil {
private static Logger logger = LoggerFactory.getLogger(LogUtil.class);
/**
* @param request : HttpServletRequest
* @brief 클라이언트 IP 획득
*/
public static String getClientIP(HttpServletRequest request) {
String ip = request.getHeader("X-Forwarded-For");
logger.info(">X-Forwarded-For : {}", ip);
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("Proxy-Client-IP");
logger.info(">Proxy-Client-IP : {}", ip);
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("WL-Proxy-Client-IP");
logger.info(">WL-Proxy-Client-IP : {}", ip);
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("HTTP_CLIENT_IP");
logger.info(">HTTP_CLIENT_IP : {}", ip);
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("HTTP_X_FORWARDED_FOR");
logger.info(">HTTP_X_FORWARDED_FOR : {}", ip);
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getRemoteAddr();
logger.info(">getRemoteAddr : {}", ip);
}
logger.info(">Result: IP Address : {}", ip);
if (ip.indexOf(",") > -1) {
ip = ip.split(",")[0];
}
return ip;
}
}
'IT > JAVA' 카테고리의 다른 글
[Java] Garbage Collection(가비지 컬렉션)이란? (0) | 2022.03.15 |
---|---|
[Java] 자바의 동시성 (Concurrency) (0) | 2022.03.15 |
[JAVA] 객체지향프로그래밍(OOP)란? (0) | 2021.07.12 |
[JAVA] 오버로딩과 오버라이딩의 차이 (0) | 2021.07.12 |
[JAVA] 컬렉션(Collection) (0) | 2021.07.12 |