본문 바로가기

WEB

[WEB] - 클라이언트 IP 헤더 정보 가져오기 (X-Forwarded-For)

728x90

서버쪽에서 특정 IP에 대해 다른 기능을 제공하고자 하는 경우가 있을때 XFF(X-Forwarded-For)를 활용하면 된다.

 

나의 경우에는 관리자와 일반 유저가 접속할 때 보여주고자 하는 대시보드를 다르게 설정하려 한다.

 

권한을 사용할 수도 있지만 관리자는 관리자 PC로만 접속한다고 가정하고 XFF를 이용해보고자 한다.

 

XFF의 자세한 내용은 MDN을 확인해보자

 

 

X-Forwarded-For - HTTP | MDN

X-Forwarded-For (XFF) 헤더는 HTTP 프록시나 로드 밸런서를 통해 웹 서버에 접속하는 클라이언트의 원 IP 주소를 식별하는 사실상의 표준 헤더다. 클라이언트와 서버 중간에서 트래픽이 프록시나 로드

developer.mozilla.org

 

 

 

먼저 대시보드 컨트롤러를 만들어서 클라이언트의 IP를 확인하는 과정을 수행해보자

 

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
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import javax.servlet.http.HttpServletRequest;
@Controller
public class DashboardController {
    @GetMapping("/dashboard")
    public String getDashboard(HttpServletRequest request, Model model) {
        // 클라이언트의 IP 주소 확인
        String clientIP = request.getHeader("X-Forwarded-For");
        if (clientIP == null || clientIP.isEmpty()) {
            clientIP = request.getRemoteAddr();
        }
        // 클라이언트의 IP 주소에 따라 다른 대시보드 URL 설정
        String dashboard;
        if ("192.168.0.1".equals(clientIP)) {
            dashboardUrl = "dashboard/mng.html"// IP 주소가 특정 값인 경우(서버 or 관리자 IP)
        } else {
            dashboardUrl = "dashboard/user.html"// 그 외의 경우(일반 유저)
        }
        // 대시보드 URL을 모델에 추가
        model.addAttribute("dashboardUrl", dashboard);
        // 대시보드 페이지로 이동
        return "dashboard";
    }
}
cs

clientIP에 따라 다른 Url정보를 가진 모델을 추가해준다.

 

 

1
2
3
<div>
    <iframe src="<c:out value="${dashboardUrl}" />" width="100%" height="600px"></iframe>
</div>
cs

iframe에 서버에서 보내준 정보에 맞춰 dashboardUrl을 사용자에게 동적으로 보여주면 된다.

 

 

 

물론 위의 코드를 실제 서버에서 활용하기에는 다음과 같은 문제점이 존재한다.


  1. IP 스푸핑: 공격자가 XFF 헤더를 조작하여 가짜 IP 주소를 추가할 수 있다. 이로 인해 실제 IP 주소가 가려지거나, 잘못된 IP 주소가 서버에서 판별될 수 있다.
  2. HTTP 요청 위조: 공격자가 XFF 헤더를 조작하여 서버에서 신뢰하는 IP 주소(여기서는 관리자)로 위조할 수 있다. 
  3. 개인 정보 노출: XFF 헤더에는 클라이언트의 이전 경로에 대한 정보가 포함되어 있어 개인 정보가 유출될 수 있다.
  4. 서버 과부하: XFF 헤더를 조작하여 다수의 가짜 IP 주소를 추가하면 서버에 과부하를 유발할 수 있다. (서비스 거부(DoS) 공격)

 

이러한 취약점을 방지하기 위해 신뢰할 수 있는 프록시를 사용하고, XFF헤더를 검증하는 과정이 필요하다.