본문 바로가기
WAS/JBOSS_WILDFLY

30. JBoss X-Forwarded-For(XFF) 설정

by coldplayer83 2026. 1. 16.
728x90
반응형

[구성]

JBCS - JBoss7(proxy) - stream(망연계) - JBoss6

 

[현상]

1) JBoss7(proxy)에서 request dump의 header 값의 XFF 확인 시 client ip 출력

2) JBoss7(proxy) - stream(망연계)의 tcpdump 확인 시 header값의 XFF가 JBCS의 ip가 출력됨

3) JBoss6에서 request dump의 header값의 XFF 확인 시 jbcs의 ip가 출력됨

=> JBoss7(proxy)에서 stream(망연계)로 넘어가면서 header값의 XFF ip가 변경됨

 


 

JBCS(Apache) 서버의 XFF 설정이 되어 있다는 전제하에 JBoss 설정 필요

 

apache 서버 XFF 설정 방법)

https://coldplayer83.tistory.com/193

 

24. X-Forwarded-For(XFF) 설정

http://www.chlux.co.kr/bbs/board.php?bo_table=board02&wr_id=104 클럭스클럭스, S/W 프로젝트www.chlux.co.kr XFF : HTTP Header 중 하나로 HTTP Server 에 요청한 clinet 의 IP 를 식별하기 위한 사실상의 표준 웹 서버나 WAS 앞에

coldplayer83.tistory.com

 

JBoss7(proxy) 서버의 standalone-ha.xml에 다음과 같이 설정

<host name="default-host" alias="localhost">
    <access-log pattern="%h %l X-Forwarded-For: %{i,X-Forwarded-For} %u %t %r %s %b %S %I %T"/>
    <filter-ref name="preserve-x-forwarded"/>
    <filter-ref name="requestDumperExpression"/>
    <http-invoker http-authentication-factory="application-http-authentication"/>
</host>

<filters>
	<expression-filter name="preserve-x-forwarded" expression="set(attribute='%{i,Original-X-Forwarded-For}', value='%{i,X-Forwarded-For}')"/>
	<expression-filter name="requestDumperExpression" expression="dump-request"/>
</filters>

 

✅ access-log
%h : 실제 접속한 peer IP (보통 바로 앞 프록시 IP)
%{i,X-Forwarded-For} : 헤더에 담긴 클라이언트 IP 체인
로그에서 프록시 IP vs 실제 클라이언트 IP 비교 가능

 

preserve-x-forwarded
요청에 들어온 X-Forwarded-For 값을 Original-X-Forwarded-For라는 새 헤더로 복사
이후 단계(다음 프록시, WAS, 로그)에서 XFF가 덮어써져도 원본 XFF 추적 가능
👉 다단 프록시 구조에서 매우 좋은 설정

requestDumperExpression
요청 헤더/파라미터를 서버 로그에 덤프
문제 분석용 (운영 환경에서는 로그 과다 주의)

 

순서대로 설정해야 함

<filter-ref name="preserve-x-forwarded"/>
<filter-ref name="requestDumperExpression"/>

 

먼저 XFF 보존 -> 그 다음 요청 덤프

=> dump-request 로그에 Original-X-Forwarded-For 포함됨

 


 

[ Client ]
   |
   |  (1) 최초 요청
   |  REMOTE_ADDR = 203.0.113.10
   |  X-Forwarded-For = (없음)
   v
┌────────────────────┐
│ JBCS (Apache)      │
│ Front Web Server   │
└────────────────────┘
   |
   |  (2) XFF 생성
   |  X-Forwarded-For = 203.0.113.10
   |  REMOTE_ADDR = 10.0.0.1
   v
┌────────────────────┐
│ JBoss7             │
│ Reverse Proxy      │
│ (Undertow)         │
└────────────────────┘
   |
   |  (3) XFF 보존 + 전달
   |  Original-X-Forwarded-For = 203.0.113.10
   |  X-Forwarded-For = 203.0.113.10, 10.0.0.2
   |  REMOTE_ADDR = 10.0.0.2
   v
┌────────────────────┐
│ Stream / 망연계    │
│ (L4/L7 Proxy)      │
└────────────────────┘
   |
   |  (4) XFF append
   |  X-Forwarded-For =
   |    203.0.113.10, 10.0.0.2, 172.16.0.5
   |  REMOTE_ADDR = 172.16.0.5
   v
┌────────────────────┐
│ JBoss6 / JBoss WAS │
│ Application Server │
└────────────────────┘

 


 

Backend JBoss 서버 Request Dump 확인

- Client IP: 192.168.22.1
- JBCS Apache IP: 192.168.22.30
- JBoss Proxy IP: 192.168.22.21
- JBoss backend IP: 192.168.22.31

# JBCS Apache 에서 backend WAS 컨텍스트 호출시 JBoss backend 서버의 Request Dump 의 해더 정보에 X-Forwarded-For, Original-X-Forwarded-For 의 IP 가 Client IP: 192.168.22.1(테스트 서버 kvm 환경의 Gateway) 인 것 을 확인


• Backend JBoss 서버 Request Dump 정보

==============================================================
2026-01-09 04:18:28,682 INFO  [io.undertow.request.dump] (default task-1)
----------------------------REQUEST---------------------------
               URI=/welcome/
 characterEncoding=null
     contentLength=0
       contentType=null
            header=Accept=*/*
            header=X-Forwarded-Server=192.168.22.30      <—  JBCS Apache IP
            header=User-Agent=curl/7.76.1
            header=X-Forwarded-Proto=http
            header=X-Forwarded-Port=80
            header=X-Forwarded-For=192.168.22.1         <--  Client IP
            header=Original-X-Forwarded-For=192.168.22.1      <-- Client IP
            header=Content-Length=0
            header=Host=192.168.22.30
            header=X-Forwarded-Host=(null)
            locale=[]
            method=GET
          protocol=HTTP/1.1
       queryString=
        remoteAddr=/192.168.22.21:49178         <-- JBoss reverse Proxy IP
         remoteHost=192.168.22.21                 <-- JBoss reverse Proxy IP
            scheme=http
              host=192.168.22.30
        serverPort=8081
          isSecure=false
--------------------------RESPONSE--------------------------
     contentLength=24
       contentType=text/html;charset=ISO-8859-1
            cookie=JSESSIONID=B_TmJbN2kUsrkFTo2gdS6FCEZggoPdFB_BniAXsC.AP_name10; domain=null; path=/welcome
            header=Connection=keep-alive
            header=X-Powered-By=JSP/2.3
            header=Set-Cookie=JSESSIONID=B_TmJbN2kUsrkFTo2gdS6FCEZggoPdFB_BniAXsC.AP_name10; path=/welcome
            header=Content-Type=text/html;charset=ISO-8859-1
            header=Content-Length=24
            header=Date=Fri, 09 Jan 2026 09:18:28 GMT
            status=200

==============================================================
728x90
반응형