[IHS/Liberty] WAS에서 실제 Client IP가 보이지 않을 때 해결 방법 (X-Forwarded-For 설정)
WebSphere Liberty와 IBM HTTP Server(IHS)를 연동하여 운영하다 보면, WAS 접근 로그나 애플리케이션 내부에서 실제 클라이언트 IP(Client IP) 대신 웹 서버(IHS)의 IP가 찍히는 현상을 자주 마주하게 됩니다.
보통 mod_remoteip를 먼저 떠올리지만, 네트워크 구성(DSR, L4 설정 등)에 따라 해당 모듈만으로는 해결되지 않는 경우가 있습니다.
오늘은 IHS에서 물리적인 연결 IP(REMOTE_ADDR)를 강제로 헤더에 할당하고, Liberty에서 이를 신뢰하도록 설정하여 실제 사용자 IP를 완벽하게 가져오는 방법을 공유합니다.
1. 원인 분석
기본적으로 WAS는 자신과 TCP 연결을 맺은 대상의 IP를 Client IP로 인식합니다.
- Flow: Client → IHS → WAS
- Problem: WAS 입장에서 직접 연결된 대상은 IHS이므로, 별도 설정이 없으면 IHS IP를 클라이언트로 판단합니다.
이를 해결하려면 HTTP 헤더(X-Forwarded-For)를 통해 IP를 전달해야 하며, 아래 두 가지 조건이 충족되어야 합니다.
- IHS (Sender): 접속한 클라이언트의 실제 IP를 헤더에 확실히 심어서 보낼 것.
- Liberty (Receiver): "IHS가 보낸 헤더는 믿을 수 있다"고 신뢰 설정을 할 것.
2. IHS (Web Server) 설정
mod_remoteip가 복잡하게 얽혀 작동하지 않거나 L4에서 헤더를 넘겨주지 않는 상황이라면, mod_rewrite와 mod_headers를 조합해 "지금 붙은 IP"를 강제로 헤더에 주입하는 것이 가장 확실합니다.
httpd.conf (VirtualHost 설정)
<VirtualHost *:80>
ServerName your.service.com
# 1. Rewrite 엔진 활성화
RewriteEngine on
# 2. 현재 접속한 실제 IP(REMOTE_ADDR)를 환경변수 'CLIENT_IP'에 저장
RewriteRule ^(.*) - [E=CLIENT_IP:%{REMOTE_ADDR},L]
# 3. 환경변수에 담긴 IP를 X-Forwarded-For 헤더에 덮어쓰기 (Set)
# 기존 값을 무시하고, IHS가 식별한 IP로 강제 설정하여 신뢰성 확보
RequestHeader set X-Forwarded-For %{CLIENT_IP}e
# (선택) HTTPS 통신임을 WAS에 알리기 위한 헤더
# RequestHeader set X-Forwarded-Proto "https"
</VirtualHost>
Point: RequestHeader set을 사용하여 헤더를 재작성(Overwrite)함으로써, 중간 단계에서 변조되거나 누락된 IP 정보를 IHS가 인식한 정확한 물리적 IP로 보정해서 WAS로 보냅니다.
3. WebSphere Liberty (WAS) 설정
Liberty는 보안상의 이유로 신뢰하지 않는 프록시가 보낸 헤더는 무시하는 것이 기본 정책입니다. IHS가 헤더를 잘 보내줘도, Liberty 설정(server.xml)에서 IHS를 "신뢰하는 통로"로 등록하지 않으면 적용되지 않습니다.
server.xml 설정
<httpDispatcher> 태그를 사용하여 IHS 서버의 IP를 신뢰 목록에 추가합니다.
<server description="My Liberty Server">
<!-- ... 기존 설정들 ... -->
<!--
trustedHeaderOrigin: X-Forwarded-For 등 일반 헤더를 신뢰할 IP 목록
trustedSensitiveHeaderOrigin: SSL 관련 등 민감한 헤더를 신뢰할 IP 목록
값: IHS(Web Server)의 IP 주소를 쉼표(,)로 구분하여 입력
-->
<httpDispatcher trustedHeaderOrigin="192.168.0.10, 192.168.0.11"
trustedSensitiveHeaderOrigin="192.168.0.10, 192.168.0.11" />
</server>
주의: 테스트 시 * (전체 허용)를 사용할 수도 있으나, 운영 환경(Production)에서는 보안을 위해 반드시 연동된 웹 서버의 IP만 명시하는 것을 권장합니다.
4. 결과 확인 및 요약
설정 적용(IHS 재기동, Liberty 동적 반영) 후, WAS의 접근 로그나 애플리케이션 로직을 확인하면 결과가 달라집니다.
- IHS: 접속자의
REMOTE_ADDR을X-Forwarded-For헤더에 Set 해서 전송. - Liberty: 지정된 IP(IHS)에서 온 요청임을 확인하고 헤더를 신뢰.
- Result:
request.getRemoteAddr()대신 헤더 값을 참조하여 실제 Client IP 획득 성공.
네트워크 구성이 복잡하거나 L4 설정 권한이 없을 때, IHS단에서의 명시적 헤더 Rewrite와 Liberty의 신뢰 IP 등록 조합은 가장 강력하고 확실한 해결책이 됩니다.