JSP에서 클라이언트의 IP 주소를 얻는 방법은 request.getRemoteAddr()입니다. 이 방법은 대부분의 경우에 효과적입니다. 그러나 Apache, Squid와 같은 역방향 프록시 소프트웨어를 통해서는 클라이언트의 실제 IP 주소를 얻을 수 없습니다. 역방향 프록시 소프트웨어를 사용하는 경우 request.getRemoteAddr() 메서드를 사용하여 얻은 IP 주소는 클라이언트의 실제 IP가 아닌 127.0.0.1 또는 192.168.1.110입니다.
프록시를 거친 후 클라이언트와 서비스 사이에 중간 계층이 추가되므로 서버는 클라이언트의 IP를 직접 얻을 수 없으며, 서버 측 애플리케이션은 전달된 요청의 주소를 클라이언트에 직접 반환할 수 없습니다. 그러나 전달된 요청의 HTTP 헤더 정보에는 X-FORWARDED-FOR 정보가 추가됩니다. 원래 클라이언트 IP 주소와 원래 클라이언트가 요청한 서버 주소를 추적하는 데 사용됩니다. index.jsp/에 액세스할 때 실제로 서버의 index.jsp 파일에 액세스하는 것은 브라우저가 아닙니다. 대신 프록시 서버가 먼저 index.jsp에 액세스하고 프록시 서버는 액세스된 결과를 브라우저에 반환합니다. 프록시 서버가 index.jsp에 액세스하기 때문에 index.jsp의 request.getRemoteAddr() 메서드를 통해 얻은 IP는 실제로 클라이언트의 IP 주소가 아닌 프록시 서버의 주소입니다.
따라서 클라이언트의 실제 IP 주소를 얻기 위한 방법 1을 생각해 낼 수 있습니다.
공개 문자열 getRemortIP(HttpServletRequest 요청) {
if (request.getHeader("x-forwarded-for") == null) {
return request.getRemoteAddr();
}
return request.getHeader("x-forwarded-for");
}
클라이언트의 실제 IP 주소를 얻는 방법 2:
공개 문자열 getIpAddr(HttpServletRequest 요청) {
String ip = request.getHeader("x-forwarded-for");
if(ip == null || ip.length() == 0 || "알 수 없음".equalsIgnoreCase(ip)) {
ip = request.getHeader("프록시-클라이언트-IP");
}
if(ip == null || ip.length() == 0 || "알 수 없음".equalsIgnoreCase(ip)) {
ip = request.getHeader("WL-Proxy-Client-IP");
}
if(ip == null || ip.length() == 0 || "알 수 없음".equalsIgnoreCase(ip)) {
ip = request.getRemoteAddr();
}
IP를 반환;
}
그런데 다중 레벨 역방향 프록시가 전달되면 X-Forwarded-For의 값은 단지 하나가 아니라 일련의 IP 값이 되는데, 어느 것이 실제 클라이언트의 실제 IP일까요?
대답은 X-Forwarded-For에서 알 수 없는 첫 번째 유효한 IP 문자열을 가져오는 것입니다. 좋다:
X 전달 대상: 192.168.1.110, 192.168.1.120, 192.168.1.130, 192.168.1.100
사용자의 실제 IP는 192.168.1.110입니다.