JP-Hosting, Apache 환경에서 X-FORWARDED-FOR 설정 방법
안녕하세요.
JP-Hosting 입니다.
이번 글에서는 Linux 서버에서 Apache 웹 서버를 사용하는 경우,
access_log에 실제 접속자 IP가 기록되도록
XFF 로그 설정을 적용하는 방법을 안내 드리겠습니다.
웹서버 로그에 실제 방문자 IP가 아닌
프록시 서버 IP가 기록될 수 있습니다.
이 경우 Apache 로그 포맷에
X-Forwarded-For 값을 추가하면
로그에서 실제 접속자 IP를 확인할 수 있습니다.
적용 대상
이 글은 아래 환경을 기준으로 합니다.
- Linux 서버
- Apache 웹서버 사용 환경
- access_log에서 실제 접속자 IP를 확인하고 싶은 경우
CentOS 계열에서는 보통 Apache 서비스명이 httpd이며,
Ubuntu 계열에서는 보통 apache2를 사용합니다.
1. Apache 설정 파일 확인
먼저 Apache 설정 파일을 확인합니다.
CentOS 계열에서는 보통 아래 파일을 사용합니다.
/etc/httpd/conf/httpd.conf
Ubuntu 계열에서는 보통 아래 파일을 사용합니다.
/etc/apache2/apache2.conf
또는 사이트별 VirtualHost 설정 파일에서
별도 로그 포맷을 사용하는 경우도 있습니다.
예시 경로는 아래와 같습니다.
/etc/httpd/conf.d/
/etc/apache2/sites-available/
서버 환경마다 설정 파일 위치가 다를 수 있으므로,
현재 사용 중인 Apache 설정 구조를 먼저 확인해야 합니다.
2. 기존 LogFormat 설정 확인
Apache 설정 파일에서 LogFormat 항목을 찾습니다.
보통 아래와 비슷한 설정이 있습니다.
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
여기서 %h는 Apache가 직접 확인한 접속 IP를 의미합니다.
하지만 프록시를 사용하는 경우,
이 %h 값에는 실제 방문자 IP가 아닌
프록시 서버 IP가 기록될 수 있습니다.
3. X-Forwarded-For 값을 로그에 기록하도록 수정
기존 LogFormat의 %h 부분을
%{X-Forwarded-For}i로 변경합니다.
수정 전:
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
수정 후:
LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
이렇게 설정하면 Apache access_log의 첫 번째 항목에
X-Forwarded-For 값이 기록됩니다.
즉, 프록시에서 실제 접속자 IP를 XFF 헤더로 전달하고 있다면
로그에서 실제 접속자 IP를 확인할 수 있습니다.
4. CustomLog 설정 확인
LogFormat을 수정했더라도,
실제 access_log가 해당 포맷을 사용하고 있어야 합니다.
아래와 같이 combined 포맷을 사용하는지 확인합니다.
CustomLog "logs/access_log" combined
또는 도메인별 VirtualHost 설정에서
별도 로그 파일을 사용하는 경우 아래와 같은 설정이 있을 수 있습니다.
<VirtualHost *:80>
ServerName example.com
CustomLog logs/example-access_log combined
</VirtualHost>
이 경우 해당 VirtualHost의 CustomLog가
수정한 로그 포맷을 사용하고 있는지 확인해야 합니다.
만약 다른 포맷명을 사용하고 있다면,
해당 포맷도 별도로 수정해야 합니다.
5. Apache 설정 문법 확인
설정을 수정한 뒤에는 바로 재 시작 하기 전에
Apache 설정 문법을 먼저 확인합니다.
apachectl configtest
정상이라면 아래와 비슷한 메시지가 표시됩니다.
Syntax OK
오류가 표시된다면
오타, 따옴표, 설정 위치 등을 다시 확인해야 합니다.
6. Apache 재시작
설정 문법에 문제가 없다면 Apache를 재시작합니다.
CentOS 계열:
systemctl restart httpd
Ubuntu 계열:
systemctl restart apache2
구형 환경에서는 아래 명령어를 사용하는 경우도 있습니다.
service httpd restart
service apache2 restart
7. access_log 확인
설정 적용 후 access_log를 확인합니다.
CentOS 계열 기본 로그 경로:
tail -f /var/log/httpd/access_log
Ubuntu 계열 기본 로그 경로:
tail -f /var/log/apache2/access.log
도메인 별 로그를 별도로 사용하는 경우에는
VirtualHost에 설정된 access_log 파일을 확인해야 합니다.
정상적으로 적용되었다면 로그 첫 번째 항목에
실제 접속자 IP 또는 XFF 값이 기록됩니다.
예시:
123.123.123.123 - - [01/Jan/2026:12:00:00 +0900] "GET / HTTP/1.1" 200 1234 "-" "Mozilla/5.0"
주의사항
위 설정은 Apache access_log에 XFF 값을 기록하기 위한 설정입니다.
즉, 로그에서 실제 접속자 IP를 확인하기 위한 설정이며,
Apache 자체가 실제 접속자 IP를 클라이언트 IP로 인식하게 만드는 설정과는 다를 수 있습니다.
예를 들어 아래와 같은 기능은
여전히 프록시 서버 IP 기준으로 동작할 수 있습니다.
- Apache 접근 제한
- IP 기반 차단 설정
- 보안 모듈
-
애플리케이션의
REMOTE_ADDR확인 -
.htaccess의 IP 제한
이러한 기능까지 실제 접속자 IP 기준으로 처리하려면
Apache의 mod_remoteip 설정이 추가로 필요할 수 있습니다.
또한 XFF 헤더는 요청 헤더 값이기 때문에,
운영 환경에서는 신뢰할 수 있는 프록시를 통해 전달된 값인지 확인하는 것이 중요합니다.
마무리
Apache 환경에서 프록시를 사용하면
access_log에 실제 접속자 IP가 아닌
프록시 서버 IP가 기록될 수 있습니다.
이 경우 LogFormat에
%{X-Forwarded-For}i 값을 추가하면
로그에서 실제 접속자 IP를 확인할 수 있습니다.
다만 이 설정은 로그 기록을 위한 설정이며,
Apache가 실제 접속자 IP를 내부적으로 인식하게 하는 설정과는 구분해야 합니다.
이 글이 문제 시 삭제 처리 하겠습니다.