개발/자바

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