반응형

X-Forwarded-For

X-Forwarded-For란?

  • 프록시나 로드 밸런서를 통해 들어온 요청에서 클라이언트의 원 IP 주소를 확인하기 위해 사용하는 헤더값
  • nginx를 Proxy로 앞단에 두고 Tomcat을 뒷단에 둘 경우 별도 설정 없이 Tomcat에서는 Client IP를 알 수가 없다.
  • nginx에서 X-Forwarded-For 헤더값을 설정하도록 하여 Tomcat에서 Client IP를 확인할 수 있다.
  • X-Forwarded-For 헤더값은 조작이 가능하기 때문에 애플리케이션에서 Client IP 값으로 어떠한 작업(ex. ACL 체크)이 필요할 경우 올바르게 동작하지 않을 수 있다.

예제

TestController
@RestController
class TestController {
    private val logger = LoggerFactory.getLogger(javaClass)

    @GetMapping("/api/test")
    fun test(request: HttpServletRequest) {
        logger.info("remoteAddr : {}, remoteHost : {}", request.remoteAddr, request.remoteHost)
    }
}
application.properties
server.tomcat.remoteip.remote-ip-header=X-Forwarded-For
nginx.conf
server {
    listen       80;

    location / {
        proxy_pass http://192.168.56.12:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}
정상 케이스
curl --location --request GET 'http://192.168.56.12/api/test'
remoteAddr : 192.168.56.1, remoteHost : 192.168.56.1
X-Forwarded-For 값을 조작한 케이스
curl --location --request GET 'http://192.168.56.12/api/test' \
--header 'X-Forwarded-For: 3.3.3.3'
remoteAddr : 3.3.3.3, remoteHost : 3.3.3.3

X-Real-IP

X-Real-IP란?

  • X-Forwarded-For와 동일하게 애플리케이션에서 Client IP를 확인하기 위해 사용하는 헤더값을 말한다.
  • X-Forwarded-For와 다르게 헤더값을 변조할 수 없다.
  • 여러 Proxy를 거치는 경우라면 애플리케이션에서 확인한 Client IP는 이전 Proxy 서버의 IP가 될 수 있어 네트워크 상황을 고려해서 적절하게 사용해야 한다.

예제

TestController
  • 위와 동일
application.properties
server.tomcat.remoteip.remote-ip-header=X-Real-IP
nginx.conf
server {
    listen       80;

    location / {
        proxy_pass http://192.168.56.12:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}
정상 케이스
curl --location --request GET 'http://192.168.56.12/api/test'
remoteAddr : 192.168.56.1, remoteHost : 192.168.56.1
X-Real-IP 값을 조작한 케이스
curl --location --request GET 'http://192.168.56.12/api/test' \
--header 'X-Real-IP: 3.3.3.3'
remoteAddr : 192.168.56.1, remoteHost : 192.168.56.1
반응형

+ Recent posts