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로 보이는 등, 보안 우회가 가능하다.
이를 막기 위해 다음과 같은 방법을 사용한다.
- 가장 오른쪽 IP부터 역추적
프록시, 로드 밸런서의 IP가 누적된다는것을 활용하여 직접 제어하고 신뢰할 수 있는 IP(내 인프라의 프록시나 로드 밸런서의 IP)를 제외하며 가장 처음으로 만나는 신뢰할 수 없는 IP를 클라이언트 IP로 인정.
- Proxy count 설정
WAS설정에서 내 인프라 내부의 프록시 개수를 지정하여(뒤에서 부터 n번째 IP만 신뢰) 앞단의 조작된 IP를 걸러낸다.
- Alternative 헤더 사용
AWS 같은 클라우드 환경에서는 아예 조작이 불가능하도록 프록시가 직접 클라이언트 IP를 찍어주는
X-Real-IP,True-Client-IP같은 별도의 헤더를 신뢰하기도 한다.