Summry
본 문서에서는 API를 호출하는 Client의 IP Address를 수집하는 방법을 정리한다.
send me email if you have any questions.
예제 코드
public static String getClientIpAddr(HttpServletRequest request) {
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();
}
return ip;
}
request.getRemoteAddr() 를 사용해서 클라이언트의 아이피를 얻을 수 있는데, 중간에 L4 스위치나 프록시 서버 등이 개입되면서 request.getRemoteAddr()의 내용은 변조될 수 있다.
정확한 IP 주소를 추출하기 위해서는 X-Forwarded-For, WL-Proxy-Client-IP 등의 추가되는 header를 모두 살펴보아야 한다.
- 원래의 정보는 X-Forwarded-For, WL-Proxy-Client-IP 등 추가되는 header에 저장되기 때문
그렇게 차례 차례 검증하면서 내려가면 어떤 장비가 중간에 개입이 되든 정확한 클라이언트의 IP를 추출할 수 있다.
Reference
request.getRemoteAddr()로도 정확한 클라이언트 IP가 추출이 되지 않을 때 해결 방법 - sungmo738
[SpringBoot & Nginx] 클라이언트 IP 수집하기 - Playdev