본문 바로가기

WEB/Nginx

[Nginx]X-Forwarded-For(XFF) 설정

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가 표시됩니다.