개발/자바
X-Forwarded-For란?
피터JK
2025. 5. 14. 16:31
728x90
X-Forwarded-For는 클라이언트의 실제 IP 주소를 식별하기 위해 사용되는 HTTP 헤더입니다.
- 클라이언트 → 프록시/로드밸런서 → 서버
- 이때 서버는 request.getRemoteAddr()를 호출하면 프록시의 IP를 반환합니다.
- 그래서 클라이언트의 진짜 IP를 알기 위해 X-Forwarded-For를 확인해야 합니다.
X-Forwarded-For: [클라이언트 IP], [프록시1 IP], [프록시2 IP], ...
◈ 동작 구조
[Client] → [Proxy] → [Web Server]
Client IP: 203.0.113.1
Proxy IP: 10.0.0.1
프록시가 요청을 서버에 전달할 때 다음과 같은 헤더를 추가합니다:
X-Forwarded-For: 203.0.113.1
서버는 이 값을 통해 진짜 클라이언트의 IP를 확인할 수 있습니다.
◈ 여러 프록시가 존재할 경우?
헤더는 콤마(,)로 구분된 IP 목록이 됩니다:
X-Forwarded-For: 203.0.113.1, 10.0.0.2, 10.0.0.1
- 첫 번째 IP가 클라이언트의 실제 IP
- 이후는 프록시 체인의 IP
◈ Spring에서 진짜 IP 가져오는 방법
public static String getClientIp(HttpServletRequest request) {
String ip = request.getHeader("X-Forwarded-For");
if (ip != null && !ip.isEmpty() && !"unknown".equalsIgnoreCase(ip)) {
// 여러 프록시를 거쳤을 경우 첫 번째 IP가 실제 클라이언트
return ip.split(",")[0].trim();
}
return request.getRemoteAddr();
}
◈ 보안 주의
X-Forwarded-For는 클라이언트가 임의로 조작 가능하다. 따라서:
- 신뢰할 수 있는 프록시나 로드밸런서가 이 값을 설정한다는 전제가 필요
- WAS 앞단에 Nginx, AWS ALB, Apache 등이 있다면, 해당 인프라가 IP를 설정하고 서버는 이를 믿고 써야 안전
관련 헤더들
- X-Forwarded-For: 클라이언트 IP
- X-Forwarded-Host: 원래 요청된 Host 헤더
- X-Forwarded-Proto: http / https
- X-Real-IP: 일부 프록시(Nginx 등)가 설정하는 실제 IP (사용자 정의 가능)
728x90