Concept
웹 서버나 웹 어플리케이션 서버(WAS) 앞에 L4 또는 프록시 서버를 두면, 웹 서버는 클라이언트가 직접 연결한 것이 아니라, 프록시 서버를 통해 연결된 것으로 인식합니다. 쉽게 설명하면, 웹 서버는 실제 사용자의 IP 대신 프록시 서버의 IP를 보게 됩니다.
클라이언트 (실제 사용자) ⟶ 프록시 서버 ⟶ 웹 서버
이때 웹 서버가 실제 클라이언트의 IP 주소를 알아내려면 어떻게 해야 할까요? 바로 X-Forwarded-For라는 헤더를 사용하는 것입니다.
X-Forwarded-For란?
X-Forwarded-For (XFF) 헤더는 프록시 서버나 로드 밸런서를 통해 웹 서버에 도달하는 HTTP 요청에서 원래 클라이언트의 IP 주소를 식별하는 데 사용됩니다.
예를 들어, XFF 값이 client, proxy1, proxy2라면
- client는 실제 클라이언트의 IP입니다.
- proxy1, proxy2는 중간에 위치한 프록시 서버들의 IP입니다.
따라서 실제 클라이언트의 IP를 알고 싶다면 XFF 값의 첫 번째 IP (client)를 확인하면 됩니다.
Nginx에서의 XFF 설정 방법
1. 현재 Nginx 버전 및 컴파일 옵션 확인
먼저 현재 실행 중인 Nginx의 버전과 함께 사용된 컴파일 옵션들을 확인합니다. 이를 위해 아래의 명령어를 사용합니다:
nginx -V
이 명령어의 결과로, Nginx의 버전 및 컴파일 옵션들이 출력됩니다.
예를 들면:
nginx version: nginx/1.18.0
built by gcc 7.5.0 (Ubuntu 7.5.0-3ubuntu1~18.04)
configure arguments: --prefix=/etc/nginx --with-http_ssl_module --with-http_realip_module ...
위 예에서 볼 수 있듯이, --with-http_realip_module 이라는 옵션이 포함되어 있으면, http_realip_module이 이미 컴파일에 포함되어 있다는 것을 의미합니다.
2. Nginx 재컴파일 (만약 필요하다면)
만약 --with-http_realip_module 옵션이 포함되어 있지 않다면, Nginx를 이 옵션과 함께 재컴파일해야 합니다.
주의: 재컴파일은 중요한 작업입니다. 운영 환경에서 진행하기 전에 테스트 환경에서 먼저 확인하는 것이 좋습니다.
# 먼저 Nginx 소스 코드를 다운로드합니다.
wget <http://nginx.org/download/nginx-1.18.0.tar.gz>
tar -xzvf nginx-1.18.0.tar.gz
cd nginx-1.18.0
# 컴파일 옵션을 지정하여 Nginx를 컴파일합니다.
./configure --prefix=/etc/nginx --with-http_ssl_module --with-http_realip_module
make
sudo make install
3. Nginx 설정 변경
이제 Nginx의 nginx.conf 파일을 수정하여 X-Forwarded-For 헤더를 올바르게 처리할 수 있도록 설정합니다.
http {
...
set_real_ip_from 127.0.0.1; # 여기에는 프록시 또는 L4 서버의 IP 주소를 입력합니다. 여러 개의 IP를 지정할 수 있습니다.
real_ip_header X-Forwarded-For; # 프록시 서버가 실제 사용자의 IP를 설정하는 HTTP 헤더입니다.
...
}
4. Nginx 재시작
설정 변경 후 Nginx를 재시작합니다.
sudo nginx -s reload
이제 Nginx는 X-Forwarded-For 헤더의 값을 사용하여 실제 클라이언트의 IP 주소를 알아낼 수 있습니다.
Apache에서의 XFF 설정 방법
만약 Apache 웹 서버에서 로그에 실제 클라이언트의 IP를 포함시키고 싶다면, 로그 형식을 아래와 같이 수정하세요:
수정 전:
LogFormat "%h %l %u %t \\\\"%r\\\\" %>s %b" common
수정 후:
LogFormat "%{X-Forwarded-For}i %l %u %t \\\\"%r\\\\" %>s %b" common
이렇게 하면 Apache 로그에 실제 사용자의 IP가 표시됩니다.
'WEB > Nginx' 카테고리의 다른 글
[Nginx]proxy_pass 설정 - 여러 서비스에 도메인 설정하기 (0) | 2023.01.11 |
---|---|
[Nginx]Customizing 301 pages to hide nginx information (0) | 2022.05.05 |
[Nginx]응답 헤더에서 Nginx 정보 제거 - remove response header server (0) | 2022.05.05 |
[Nginx]웹 크롤링 차단(Block bad bots) - http_user_agent (0) | 2022.05.05 |
[Nginx]파일업로드 크기 제한 - client_max_body_size (0) | 2022.05.05 |