설명을 위해 아이피를 4자리 숫자로 표기했습니다.

클라이언트가 서버에 HTTP 요청을 한다고 가정해 보자.
클라이언트와 서버 사이의 네트워크 Hop은 1개이며,
서버는 클라이언트의 패킷을 받아 출발지의 IP(1000)를 보고 판단할 수 있다.
여기까지는 이해하기 쉽다.
이제, 클라이언트와 서버 사이에 프록시 서버를 둔다고 가정해보자

클라이언트가 서버에 접속하기 위해서는 다음과 같은 절차를 거친다.
- 클라이언트는 서버에 접근하기 위해 프록시에게 HTTP 요청을 한다.
- 프록시는 요청을 받고 서버에게 전달한다.
- 서버는 프록시로부터 받은 패킷을 열어본다.
이렇게 된다면 서버는 프록시로부터 받은 패킷을 봤을 때 프록시의 IP(2000)가 찍히게 된다.
이런 상황에서 어떻게 서버는 클라이언트의 주소를 알 수 있을까?
이 문제를 해결하기 위해 X-Forwarded-For 헤더가 탄생한다.
그럼 X-Forwarded-For 헤더를 사용하여 최초 요청 클라이언트의 IP 주소를 식별할 수 있는 방법에 대해 알아보자.

- 클라이언트는 프록시에게 HTTP 요청을 한다.
- 프록시는 서버에게 전달하기 전
X-Forwarded-For헤더에 이전 요청 IP(1000)를 담아 전달한다. - 서버는 프록시로부터 받은 요청에서
X-Forwarded-For헤더를 참조하여 최초 요청 IP(1000)를 식별할 수 있다.
이제 응용이다.
이전 상황에서 프록시가 중간에 하나 더 추가되었다.

- 클라이언트는 프록시1에게 HTTP 요청을 한다.
- 프록시1는 프록시2에게 전달하기 전
X-Forwarded-For헤더에 이전 요청 IP(1000)를 기록 후 전달한다. - 프록시2는 서버에게 전달하기 전
X-Forwarded-For헤더에 이전 요청 IP(2000)를 추가 기록한다. - 서버는 프록시2로부터 받은 응답의
X-Forwarded-For헤더를 참조한다.
따라서, X-Forwarded-For 헤더값의 첫 번째 IP를 참조하면 클라이언트의 IP 주소를 알 수 있다.