Developer Log
Computer Science

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

HTTP 헤더중 하나로 원래의 IP 주소를 식별하기 위한 표준 헤더이다.

형식은 다음과 같다.

X-Forwarded-For: client, proxy1, proxy2

원본의 요청 IP와 그뒤 거치는 프록시, 로드 밸런서의 IP가 헤더에 누적되는 형태이다.

이 헤더를 통해 접속하는 IP를 알수있다.

하지만 결국 헤더이며 이는 임의로 조작이 가능하다.

IP 식별을 위해 XFF의 첫번째 IP를 검증없이 신뢰한다면 실제와 다른 IP로 인식할 수 있다.

공격자가 처음부터 요청을 보낼 때 헤더에 가짜 IP를 넣을 수 있다.

X-Forwarded-For: [가짜_IP], [실제_공격자_IP]

이 요청이 프록시, 로드벨런서를 거치면 최종적으로 다음의 형태로 변한다

X-Forwarded-For: [가짜_IP], [실제_공격자_IP], [로드밸런서_IP]

이 때 서버가 맨 앞의 IP를 검증없이 신뢰한다면 화이트리스트로 등록된 IP로 보이는 등, 보안 우회가 가능하다.

이를 막기 위해 다음과 같은 방법을 사용한다.

  1. 가장 오른쪽 IP부터 역추적

    프록시, 로드 밸런서의 IP가 누적된다는것을 활용하여 직접 제어하고 신뢰할 수 있는 IP(내 인프라의 프록시나 로드 밸런서의 IP)를 제외하며 가장 처음으로 만나는 신뢰할 수 없는 IP를 클라이언트 IP로 인정.

  1. Proxy count 설정

    WAS설정에서 내 인프라 내부의 프록시 개수를 지정하여(뒤에서 부터 n번째 IP만 신뢰) 앞단의 조작된 IP를 걸러낸다.

  1. Alternative 헤더 사용

    AWS 같은 클라우드 환경에서는 아예 조작이 불가능하도록 프록시가 직접 클라이언트 IP를 찍어주는 X-Real-IP , True-Client-IP 같은 별도의 헤더를 신뢰하기도 한다.