본문 바로가기
공부/프로그래밍

[java] 요청한 IP주소 받기(nginx proxy 환경, AWS ELB 등)

by demonic_ 2021. 7. 2.
반응형

AWS의 ELB 나 NGINX로 proxy 로 연결되어 있는 경우라면 IP를 그냥받으면 ELB나 nginx가 설치되어 있는 IP 주소를 받는다. Java 에서 getRemoteAddr() 을 통해 받을 때 그렇다

public String getIp(HttpServletRequest request) {
    String ip = request.getRemoteAddr();
    log.info("> getRemoteAddr : "+ip);
    return ip;
}

 

 

해서 이 문제를 해결하려면 request 에 X-Forwarded-For 값이 담겨있어야 한다.

 

nginx를 쓰는 경우라면 다음처럼 설정해줘야 한다.

http {
... 
    set_real_ip_from   127.0.0.1;
    real_ip_header  X-Forwarded-For;
    
    location / {
        proxy_pass [연결할 url 주소];
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Host $http_host;
    }
...
}

 

AWS의 ELB를 사용한다면 저 설정이 되어 있다.

 

관련문서:

https://aws.amazon.com/ko/premiumsupport/knowledge-center/elb-capture-client-ip-addresses/

 

ELB를 기반으로 하는 웹 서버 로그에서 클라이언트 IP 주소 캡처

웹 서버에 Elastic Load Balancing(ELB)을 사용 중이며 웹 서버 액세스 로그에서 로드 밸런서의 IP 주소를 볼 수 있습니다. 이 IP 주소 대신 클라이언트 IP 주소를 캡처하려면 어떻게 해야 합니까?

aws.amazon.com

 

 

이제 JAVA 쪽에 다음처럼 사용한다

public String getIp(HttpServletRequest request) {
    String ip = request.getHeader("X-Forwarded-For");
    log.info("> X-Forwarded-For : " + ip);

    if (ip == null) {
        ip = request.getHeader("X-FORWARDED-FOR");
        log.info("> X-FORWARDED-FOR : " + ip);
    }
    // X-FORWARDED-FOR 가 비어있다면 요청한 IP를 로드
    if (ip == null) {
        ip = request.getRemoteAddr();
        log.info("> getRemoteAddr : "+ip);
    }
    log.info("> Result : IP Address : "+ip);

    return ip;    
}

 

 

끝.

반응형

댓글