기업에서 서버팜을 구축하게 되면 어플리케이션 서버 전에 여러 단계의 라우터나 스위치, 로드발랜서 등등이 구축되어 실제 요청한 사람의 ip를 알기 어려워지게 된다.
소스로 말하자면 아래 값이 로컬이 나오거나 내부 장비의 ip가 찍히는 상황이 생기게 된다.
HttpServletRequest request;
request.getRemoteAddr();
그리하여 실제로 요청한 사람/장비의 ip를 알기 어려워지는데.. 아래와 같이 설정하면 해결할 수 있다.
1. nginx 설정
1-1. nginx map 설정(생략가능)
map은 다음과 같이 $key라는 변수를 받아 $value라는 결과값을 매핑해준다.
아래 코드에서 $key 값이 a라면, $value 값은 1이다.
map $key $value {
a 1;
b 2;
default 0;
}
map 규칙은 위처럼 쓸 수도 있지만, 다른 파일에 분리해 둔 뒤 받아올 수도 있다.
가령 위의 규칙을 map-rule이라는 파일에 아래와 같이 분리하면:
a 1;
b 2;
다음과 같이 파일의 상대 include할 수 있다:
map $key $value {
include PATH/TO/map-rule; # map-rule 파일의 절대 경로
default 0;
}
위 map을 사용하여 아래처럼 clientip 라는 변수에 값을 담는다.
map $http_x_forwarded_for $clientip {
"" $remote_addr;
default $http_x_forwarded_for;
}
1-2. server.location 세팅
clientip를 아래와 같이 세팅한다.
proxy_set_header X-Forwarded-For $clientip;
대략적인 큰 그림은 아래와 같다.
server {
listen 80;
server_name server.abc.com;
server_tokens off;
...
location / {
//여기부터
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $clientip;
여기까지//
proxy_set_header Connection "";
proxy_http_version 1.1;
proxy_pass http://localhost:8200;
}
}
1-3. nginx reload
nginx -s reload
2. 소스 변경
- HttpServletRequestWrapper 를 사용해서 getRemoteAddr 를 상속 -> 별도로 필터 개발 필요
- server.tomcat.remoteip.remote-ip-header 프로퍼티 설정
2번 방식이 더 쉽고 빠르다고 생각하여 적용해본다.
적용하기 전에, 버전 별로 키값이 달라지니 스프링 공식 문서는 꼭 확인해보자.
지금 상황에서 연관있는 값은 아래 값인 것 같다. 기본 값은 없다.
# springboot2.2 버전 이상이면
server.tomcat.remoteip.remote-ip-header=X-FORWARDED-FOR
# 구버전
#server.tomcat.remote-ip-header=X-FORWARDED-FOR
경우에 따라서는 아래 값도 조정해야할 수 있다.
server.tomcat.remoteip.internal-proxies
이 값은 신뢰할 내부 프록시를 매칭하는 값이다. 정규식으로 작성해야하며 기본값은 아래와 같다. 일반적으로는 기본값으로도 사용가능하지만 프로덕션 환경에서 내부 프록시 ip들이 해당 범위를 넘어갈 수도 있으니 확인이 필요하다. 참고로 공백으로 설정하면 모든 프록시를 신뢰한다는 뜻으로 프로덕션 환경에서는 이렇게 설정하면 위험할 수 있으니 주의해야 한다.
- 10/8
- 192.168/16
- 169.254/16
- 127/8
- 등등(공식 문서 확인 필요)
'서버 세팅 & tool > nginx' 카테고리의 다른 글
라이브환경 인증서 교체 (0) | 2024.01.08 |
---|---|
[이슈해결][apache] 304 NOT_MODIFIED (0) | 2023.10.12 |
[nginx] WAF (0) | 2022.03.30 |
[nginx] API gateway (0) | 2022.03.14 |
[nginx] 실전 cors 해결하기 (0) | 2022.03.14 |