티스토리 뷰

반응형

 

 

 

 

 



 

 

SpringBoot

 

 

 

접속자의 로그를 남기려고 HttpServletRequest 의 getRemoteAddr() 을 호출해보았다.

 

public static String getClientIP(HttpServletRequest request) {
	...
    return request.getRemoteAddr();
}

 

 

내가 아는 장비에서 테스트 해보면 ... 뭔가 정확한 ip 주소가 나오지 않았다.

 

 

 

 

그 이유는 getRemoteAddr() 은 직접적인 IP만 반환하며, 

프록시나 로드밸런서 또는 그 외 다른 네트워크 장비를 탄다면 실제 ip 주소를 얻기는 힘들다.

 

 

 

그래서 요청헤더의 정보를 받아 아래와 같이 실제 클라이언트의 ip 를 얻을 수 있다.

 

import javax.servlet.http.HttpServletRequest;

public class IPUtils {

    public static String getClientIP(HttpServletRequest request) {
        String ip = request.getHeader("X-Forwarded-For");
        if (ip != null && !ip.isEmpty() && !"unknown".equalsIgnoreCase(ip)) {
            // X-Forwarded-For에는 여러 IP가 포함될 수 있으므로 첫 번째 IP를 사용
            return ip.split(",")[0];
        }
        ip = request.getHeader("Proxy-Client-IP");
        if (ip != null && !ip.isEmpty() && !"unknown".equalsIgnoreCase(ip)) {
            return ip;
        }
        ip = request.getHeader("WL-Proxy-Client-IP");
        if (ip != null && !ip.isEmpty() && !"unknown".equalsIgnoreCase(ip)) {
            return ip;
        }
        ip = request.getHeader("HTTP_CLIENT_IP");
        if (ip != null && !ip.isEmpty() && !"unknown".equalsIgnoreCase(ip)) {
            return ip;
        }
        ip = request.getHeader("HTTP_X_FORWARDED_FOR");
        if (ip != null && !ip.isEmpty() && !"unknown".equalsIgnoreCase(ip)) {
            return ip;
        }
        // 위 헤더가 모두 없으면 기본적으로 request.getRemoteAddr() 사용
        return request.getRemoteAddr();
    }
}

 

 

 

 

헤더값에 적힌 ip 주소로 찾아내는 것을 확인할 수 있었다.

 

 

물론 변조자가 헤더를 바꿔버리면 그것도 무용지물이긴 하겠지만...

 

 

 

 

 

 



 

 

 

반응형
댓글
반응형
최근에 올라온 글
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Total
Today
Yesterday