자라나라 개발머리

[HTTP/header] X-Forwarded-For(XFF) 본문

HTTP

[HTTP/header] X-Forwarded-For(XFF)

iammindy 2024. 3. 25. 03:19

 

X-Forwarded-For 헤더는 비표준 헤더이다. 하지만 사실상 표준 헤더(?)이다.

 

관례적으로, 사용자 정의 헤더는 맨 앞에 X- 를 적어서 사용자가 임의로 정의한 헤더라는 표시를 했다.

그 중 몇몇 헤더는 대중적으로 쓰이게 되었고 그게 거의 표준으로 굳어진 사례가 있다.

오늘 알아볼 X-Forwarded-For 도 그런 경우에 속한다.

 

우리 회사는 AWS에서 제공하는 로드 밸런서(ALB)를 사용하고 있는데, ALB는 X-Forwarded 헤더를 지원한다.

오늘은 그 중에서도 X-Forwarded-For(XFF)에 대해서 알아볼 것이다.

 

X-Forwarded-For가 무엇?

X-Forwarded-For는, client의 ip를 식별하기 위한 용도의 헤더이다.

그러면 General Header의 Remote Address를 쓰면 되지 않나? 라는 의문점이 생긴다.

 

하지만 remote address는

client - server

이런 단일 연결 구조면 바로 client의 ip를 습득할 수 있지만,

 

client - proxy - data server / client - loadbalancer - data server / client - server1 - server2 - data server

이런 식으로 다중 연결 구조일 경우엔 바로 전에 요청한 서버의 ip 주소를 담고 있게 된다.

 

하지만 개발자들은 최초로 요청한 client의 ip를 알고 싶었고, 그래서 탄생한게 바로 x-forwarded-for 이 친구이다.

이 헤더는 최초로 요청한 client ip의 address를 담고 있다.

 

x-forwarded-for 헤더의 필드 형식은 다음과 같다.

 

X-Forwarded-For: client, proxy1, proxy2

0번째에 있는게 최초 client ip 주소이고, 다음부터는 중간 서버의 ip가 ,를 구분점으로 쌓이게 된다.

X-Forwarded-For 모든 헤더에 다 있는가?

아니다. x-forwarded-for는 client ip를 식별할 수 있는 가장 상용화된 헤더이긴 하지만, 비표준 헤더이다.

그렇기 때문에 모든 header에 이 친구가 포함되어 있지 않다.

몇몇 회사에서는 다른 이름의 헤더로 client ip를 제공하고 있다. 그래서 client ip 식별하는 법을 구글링해보면, 아래 예시처럼 다양한 이름의 헤더를 조건문으로 걸어놓은 것을 볼 수 있다.

 

String ip = request.getHeader("X-Forwarded-For");

if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
    ip = request.getHeader("Proxy-Client-IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
    ip = request.getHeader("WL-Proxy-Client-IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
    ip = request.getHeader("HTTP_CLIENT_IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
    ip = request.getHeader("HTTP_X_FORWARDED_FOR");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
    ip = request.getRemoteAddr();
}

 

 

X-Forwarded-For 믿을 수 있는건가?

라고 물어보면 애초에 X- 라는 의미 자체가 사용자 정의 헤더라는 말이기 때문에, 중간 서버에서 맘 먹고 수정하려면 수정할 수 있다.

그래서 내 생각엔 어떤 단체에서 x-forwarded-for를 제공한다고 무턱대고 사용하기 보다는, 해당 단체의 신뢰성을 고려해보아야 한다고 생각한다.

나 같은 경우엔 해당 헤더를 AWS ALB에서 제공해주는 것이기 때문에 믿고 사용할 수 있다! 라는 결론을 내렸다.