본문 바로가기
Web

[XFF] 클라이언트 IP 가져오기 (X-Forwarded-For)

by 소라둥이 2020. 4. 14.

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

- 웹 서버나 WAS 앞에 L4 같은 Load balancers 나 Proxy server, caching server 등의 장비가 있을 경우 웹서버는 Proxy server 나 장비IP에서 접속한 것으로 인식

따라서 웹서버는 실제 클라이언트 IP가 아닌 앞단에 있는 Proxy서버 IP를 요청한 IP로 인식하고, Proxy장비 IP 로 웹로그를 남김

이 때 웹 서버에서는 X-Forwarded-For HTTP Hearder에 있는 클라이언트 IP를 찾아 실제 요청한 클라이언트 IP를 알 수 있고, 웹로그에도 실제 요청한 클라이언트 IP를 남김
콤마를 구분자로 Client와 Proxy IP 가 들어가게 되므로 첫번째 IP 를 가져오면 클라이언트를 식별

클라이언트 IP ⟶ Proxy 서버 및 장비 ⟶ 웹 서버

X-Forwarded-For: client, proxy1, proxy2

 

 

 

 웹 어플리케이션을 개발 시 Client ip 를 식별할 필요가 있다면 먼저 저 헤더가 있는지 확인한 후에 없으면 getRemoteAddr() 로 IP 를 얻으면 간단하지만 표준을 지키지 않는 것들이 있다.

WebServer, WAS, L4, proxy 종류에 상관없이 client IP 를 잘 가져오기를 바란다면 다음과 같은 순서로 IP 를 얻어내야 한다.

 

        String ip = request.getHeader("X-Forwarded-For");
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  
            ip = request.getHeader("Proxy-Client-IP");  
        }  
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  
            ip = request.getHeader("WL-Proxy-Client-IP");  
        }  
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  
            ip = request.getHeader("HTTP_CLIENT_IP");  
        }  
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  
            ip = request.getHeader("HTTP_X_FORWARDED_FOR");  
        }  
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  
            ip = request.getRemoteAddr();  
        }

'Web' 카테고리의 다른 글

[HTTP] PUT, PATCH 차이점  (0) 2020.04.07
[HTTP] 커넥션 관리  (0) 2020.04.02
동일출처정책과 CORS 그리고 해결 방법  (1) 2020.03.02