일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- redis
- 조건문
- 스프링부트
- LangChain
- java
- nodejs
- ai
- Spring
- Apollo
- TCP
- 자바
- k8s
- MapReduce
- java11
- Android
- 백준알고리즘
- puppeteer
- 서버
- mongodb
- Scanner
- HTTP
- restapi
- 스프링
- mysql
- 프로그래머스
- Mongoose
- Docker
- bufferdreader
- eof
- graphql
- Today
- Total
자라나라 개발머리
[HTTP/header] X-Forwarded-For(XFF) 본문
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에서 제공해주는 것이기 때문에 믿고 사용할 수 있다! 라는 결론을 내렸다.
'HTTP' 카테고리의 다른 글
[HTTP] TCP 통신과 HTTP 통신의 특징과 차이 (0) | 2024.04.22 |
---|---|
[HTTP 웹 기본 지식] 인터넷 통신(internet network) (0) | 2023.04.28 |