본문 바로가기
기록/Java&Spring&Eclipse

[Java] 클라이언트의 원 IP 주소 가져오기

by 자임 2022. 10. 31.

찾아봤던 거 기록

 


보안 관련해서 방화벽이나 클라우드로 운영하는 경우 클라이언트의 원 IP주소를 가져올 수 없다.
출처 : https://linked2ev.github.io/java/2019/05/22/JAVA-1.-java-get-clientIP/

 

try{
String clientIp = request.getHeader("HTTP_X_FORWARDED_FOR");
if(   clientIp == null
   || clientIp.length() == 0
   || clientIp.toLowerCase().equals("unknown")){
  clientIp = request.getHeader("REMOTE_ADDR");
}

if(   clientIp == null
   || clientIp.length() == 0
   || clientIp.toLowerCase().equals("unknown")){
clientIp = request.getRemoteAddr();
}


X-Forwarded-For(XFF) 란?
XFF는 HTTP Header 중 하나로 HTTP Server에 요청한 Client의 IP를 식별하기 위한 표준이다.

 

X-Forwarded-For 헤더에는 프록시와 같은 아이피도 들어있지만 맨 첫번째에 실제 클라이언트의 아이피가 들어가 있기 때문에 클라이언트의 아이피를 확인할 때 먼저 X-Forwarded-For헤더가 있는지 확인한 후 없을 경우에 위의 코드에서 사용한 request.getRemoteAddr()로 IP를 얻으면 됩니다.
출처 : https://admm.tistory.com/80


WAS는 보통 2차 방화벽 안에 있고 Web Server 를 통해 client 에서 호출되거나 cluster로 구성되어 load balancer 에서 호출되는데 이럴 경우에서 getRemoteAddr() 을 호출하면 웹서버나 load balancer의 IP 가 나옴
위와 같은 문제를 해결하기 위해 사용되는 HTTP Header 인 X-Forwarded-For 값을 확인해서 있으면 이걸 사용하고 없으면 getRemoteAddr() 사용
출처 : https://www.lesstif.com/java/spring-client-ip-18220218.html


=>
'HTTP_X_FORWARDED_FOR'나 'REMOTE_ADDR' 헤더가 있을 경우 이걸 사용하고, 없으면 getRemoteAddr()를 사용해 IP를 가져온다.

 

....