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 |