X-Forwarded-For : 클라이언트의 원 IP 주소를 보기위해 X-Forwarded-For 요청 헤더가 사용
다음과 같이 콤마를 구분자로 client 와 proxy IP 가 들어가게 되므로 첫번째 IP 를 가져오면 클라이언트를 식별할 수 있다.
X-Forwarded-For: client, proxy1, proxy2
순차대로 들어오게 되므로 proxy2 가 마지막에 거친 프록시 서버의 ip 주소를 의미함
XFF 는 사실상의 표준이지 정식 RFC 에 포함된게 아니므로 대개는 착실하게 저 헤더를 사용하지만 엉뚱한 헤더를 사용하는 제품들이 있다. - (Proxy-Client-IP, WL-Proxy-Client-IP, HTTP_CLIENT_IP 등등)
WebServer, WAS, L4, proxy 종류에 상관없이 client IP 를 잘 가져오기를 바란다면 다음과 같은 순서로 IP 를 얻어내야 한다.
String accessIp = null;
if (accessIp == null || accessIp.length() == 0 || "unknown".equalsIgnoreCase(accessIp)) {
accessIp = request.getRemoteAddr();
}
if (accessIp == null || accessIp.length() == 0 || "unknown".equalsIgnoreCase(accessIp)) {
accessIp = request.getHeader("Proxy-Client-IP");
}
if (accessIp == null || accessIp.length() == 0 || "unknown".equalsIgnoreCase(accessIp)) {
accessIp = request.getHeader("WL-Proxy-Client-IP");
}
if (accessIp == null || accessIp.length() == 0 || "unknown".equalsIgnoreCase(accessIp)) {
accessIp = request.getHeader("HTTP_CLIENT_IP");
}
if (accessIp == null || accessIp.length() == 0 || "unknown".equalsIgnoreCase(accessIp)) {
accessIp = request.getHeader("HTTP_X_FORWARDED_FOR");
}
if (accessIp == null || accessIp.length() == 0 || "unknown".equalsIgnoreCase(accessIp)) {
accessIp = request.getHeader("X-Real-IP");
}
if (accessIp == null || accessIp.length() == 0 || "unknown".equalsIgnoreCase(accessIp)) {
accessIp = request.getHeader("X-RealIP");
}
if (accessIp == null || accessIp.length() == 0 || "unknown".equalsIgnoreCase(accessIp)) {
accessIp = request.getHeader("REMOTE_ADDR");
}