본문 바로가기
서버 인프라, 백엔드/웹서버 (Nginx)

Nginx : X-Forwarded-For(XFF) 헤더를 통해 IP 로그 남기기

by 번데기 개발자 2024. 6. 13.
반응형

 

Nginx의 기본 로그 포맷 

 

Nginx에서는 기본적으로 IP에 대한 아래와 같이  기본적으로 정의되어 있는 combined 로그 포맷으로 로그를 남겨줍니다. 

 

127.0.0.1 - frank [10/Oct/2000:13:55:36 -0700] "GET /apache_pb.gif HTTP/1.0" 200 2326 "http://www.example.com/start.html" "Mozilla/4.08 [en] (Win98; I ;Nav)"

 

해당 로그 포맷은 보통 아래와 같은 규칙에 따라 표현됩니다.

 

log_format combined '$remote_addr - $remote_user [$time_local] "$request" '
                    '$status $body_bytes_sent "$http_referer" '
                    '"$http_user_agent"';

 

  • `$remote_addr`: 클라이언트의 IP 주소
  • `$remote_user`: 클라이언트의 사용자 이름 (RFC 1413)
  • `$time_local`: 로컬 시간과 타임존
  • `$request`: 요청의 첫 번째 줄 (예: "GET / HTTP/1.1")
  • `$status`: HTTP 응답 코드
  • `$body_bytes_sent`: 클라이언트에게 전송된 바이트 수 (헤더 제외)
  • `$http_referer`: 참조 페이지 (Referer) 헤더
  • `$http_user_agent`: 사용자 에이전트 (User-Agent) 헤더

 

 

위와 같이 로그를 남기면 기본적으로 동작하는 것처럼 보이지만, 실제로 Nginx의 Access 로그에 기록된 IP 주소는 프록시 서버의 주소일수도 있습니다. 이는 Nginx가 프록시 서버나 로드밸런서의 뒤에 배치된 경우에 자주 발생하는데요, 기본적으로 Nginx는 클라이언트의 실제 IP주소가 아닌 가장 가까운 프록시 서버의 IP를 로그에 기록하게 됩니다.

 

보통 최종 클라이언트의 IP를 알아내는 것은 보안 및 로그 분석에 중요한데요, 클라이언트의 실제 IP 주소를 기록하기 위해서는 X-Forwarded-For (XFF) 헤더를 사용해야 합니다.

 

 

 X-Forwarded-For(XFF) 헤더란?

 

X-Forwarded-For 헤더는 HTTP의 헤더 중 하나로, 맨 처음 접속한 클라이언트의 원래 IP 주소를 식별하기 위해 사용되는데요, 주로 프록시 서버나 로드 밸런서를 통해 웹 서버에 접근할때 실제 클라이언트의 IP 주소를 전달하기 위해 주로 사용됩니다.

 

X-Forwarded-For 헤더는 보통 다음과 같이 표현됩니다.

 

X-Forwarded-For: <client1>, <proxy1>, <proxy2>

 

  • `<client1>` 은 원래 클라이언트의 IP 주소를 나타냅니다.
  • `<proxy1>, <proxy2>` 는 요청을 거쳐간 프록시 서버들의 IP 주소들을 나타냅니다. 

 

 

Nginx에서 X-Forwarded-For(XFF) 헤더로 로그 남기기

 

Nginx에서는 기본적으로 제공되는 로그 형식 이외의 커스텀한 로그 포맷을 설정하여 로그를 남길수도 있습니다.

 

이때 `$http_x_forwarded_for` 변수를 통해 최초 접속한 클라이언트의 IP 정보에 대한 로그를 남길 수 있습니다.

 

 

http {
    log_format main '$http_x_forwarded_for - $remote_user [$time_local] '
                    '"$request" $status $body_bytes_sent '
                    '"$http_referer" "$http_user_agent"';
    access_log /var/log/nginx/access.log; # 기본 로그 (combined 형식)
    access_log /var/log/nginx/ip.log main; # 클라이언트 IP 주소가 포함된 로그 

    server {
        ...
    }
}

 

 

위에서는 main이라는 커스텀한 로그 포멧을 만들고 ip.log 라는 이름으로 로그를 남기도록 설정하였습니다.

 

203.0.113.195 - john [21/Jun/2024:15:30:00 +0000] "GET /index.html HTTP/1.1" 200 1234 "http://example.com" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"

 

 

실제로 설정해서 살펴보면 첫 번째 주소가 프록시 주소가 아닌 클라이언트의 IP가 찍히는 것을 확인할 수 있습니다.

 

 

 

마무리

 

오늘은 Nginx를 통해 클라이언트의 IP를 남기는 방법에 대해 알아보았습니다.

 

그냥 구글링 해서 실무에 적용하는 것보다 글로 남기는 게 더 기억에 오래 남는 것 같습니다.
(XFF 헤더에 대해서도 조금 자세히 알게 되었구요. :) )

 

다음에도 Nginx 설정에 대한 유용한 정보가 있으면 공유드리도록 하겠습니다.!

반응형