반응형
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- 위와 동일
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
반응형
'Development > Experiment' 카테고리의 다른 글
[Experiment] MySQL 커넥션풀 부족 현상 (0) | 2020.12.30 |
---|---|
[Experiment] 커넥션 과다 생성 테스트(open files) (0) | 2020.12.30 |
[Experiment] 스레드 과다 생성 테스트(max user processes) (0) | 2020.12.30 |