2017년 1월 20일 금요일

[Network] X-Forwarded-For


< XFF 사용하는 이유 >


XFF 는 HTTP Header 중 하나로 HTTP Server 에 요청한 clinet 의 IP 를 식별하기 위한 사실상의 표준이다.

웹 서버나 WAS 앞에 L4 같은 Load balancers 나 Proxy server, caching server, HTTP 서버용 WAS Connector(웹로직 커넥터 - mod_wl, 톰캣 커넥터 - mod_jk 등) 등이 있을 경우 이런 제품들은 웹서버/WAS 에 HTTP 나 전용 프로토콜(AJP)로 요청을 보낸후에 받은 결과를 가공하여 클라이언트에 재전송하게 된다.

이로 인해 처리한 웹 서버나 WAS에서 request.getRemoteAddr(); 등으로 클라이언트 IP를 얻을 경우 L4 나 Proxy 의 IP 를 얻게 되는데 이는 원하는 결과가 아니다.
X-Forwarded-For는 이 문제를 해결하기 위해 사용하는 http header 로 squid caching server 에서 처음 사용되었다.

다음과 같이 콤마를 구분자로 client 와 proxy IP 가 들어가게 되므로 첫번째 IP 를 가져오면 클라이언트를 식별할 수 있다.

X forwarded for 는 클라이언트에서 들어오는 IP를 로그에 남기도록 설정하시기 위한 작업으로, WebServer에 로그포맷을 적용하려면 L4에서 X forwarded for 헤더정보로 Client IP를 실어서 보낼 수 있도록 설정을 미리 해두어야 한다.

1. X-Forwared-For


X-Forwarded-For 요청 헤더는 HTTP 또는 HTTPS 로드 밸런서를 사용할 때 클라이언트의 IP 주소를 식별하는데 도움이 된다.

로드 밸런서는 클라이언트와 서버 간의 트래픽을 가로 채기 때문에 서버 액세스 로그에는 로드 균형 조정기의 IP 주소만 포함된다.
클라이언트의 IP 주소를 보려면 X-Forwarded-For 요청 헤더를 사용하면된다.

Elastic Load Balancing은 클라이언트의 IP 주소를 X-Forwarded-For 요청 헤더에 저장하고 서버에 헤더를 전달한다.

X-Forwarded-For 요청 헤더는 다음 형식을 취한다.

X-Forwarded-For : clientIPAddress

다음은 IP 주소가 203.0.113.7인 클라이언트에 대한 X-Forwarded-For 요청 헤더의 예이다.

X-Forwarded-For : 203.0.113.7

다음은 IPv6 주소가 2001:DB8: :21f:5bff:febf:ce22:8a2e 인 클라이언트에 대한 X-Forwarded-For 요청 헤더의 예이다.

X-Forwarded-For: 2001:DB8::21f:5bff:febf:ce22:8a2e

요청이 여러 프록시를 거치는 경우 X-Forwarded-For 요청 헤더의 clientIPAddress 다음에는 로르 밸런서에 도달하기 전에 요청이 통과하는 각 연속 프록시의 IP주소가 온다.

따라서, 가장 오른쪽의 IP 주소는 가장 최근의 프록시의 IP주소이고 가장 왼쪽의 IP 주소는 원래 클라이언트의 IP 주소이다. 이 경우 X-Forwarded-For 요청 헤더는 다음 형식을 취한다.

X-Forwarded-For : OriginatingClientIPAddress, proxy1-IPAddress, proxy2-IPAddress

2. X-Forwarded-Proto


X-Forwarded-Proto 요청 헤더는 클라이언트가 로드 밸런서에 연결하는데 사용한 프로토콜(HTTP 또는 HTTPS)을 식별하는데 도움을 준다.

서버 액세스 로그에는 서버와 로드 밸런서 간에 사용되는 프로토콜만 포함된다. 
클라이언트와 로드 밸랜서 간에 사용되는 프로토콜에 대한 정보는없다.
클라이언트와 로드밸런서 간에 사용되는 프로토콜을 결정하려면 X-Forwarded-Proto 요청 헤더를 사용해야한다. 
Elastic Load Balancing은 클라이언트와 로드 밸런서 간에 사용되는 프로토콜을 
X-Forwarded-Proto 요청 헤더에 저장하고 헤더를 서번에 전달한다.

응용 프로그램 또는 웹 사이트는 X-Forwarded-Proto 요청 헤더에 저장된 프로토콜을 사용하여 해당 URL로 리다이렉션되는 응답을 렌더링 할 수 있다.

X-Forwarded-Proto 요청 헤더는 다음 형식을 취한다.

X-Forwarded-Proto : originatingProtool

다음 예는 클라이언트에서 HTTPS 요청으로 시작된 요청에 대한 X-Forwarded-Proto 요청 헤더를 포함한다.

X-Forwarded-Proto : https

3. X-Forwarded-Port


X-Forwarded-Port 요청 헤더는 클라이언트가 로드 밸런서에 연결하는데 사용한 포트를 식별하는데 도움이 된다.

[출처]

http://docs.aws.amazon.com/elasticloadbalancing/latest/classic/x-forwarded-headers.html
http://blog.naver.com/murmurmm/220290265177

댓글 없음:

댓글 쓰기