[Java] 2. 클라이언트 실제 http / https 가져오기


클라이언트 실제 http / https 가져오기


X-Forwarded-Proto(XFP) 헤더


기본적으로 HttpServletRequest 객체 내 함수로 클라이언트 HTTP/HTTPS 접근 여부를 알 수 있다.

import javax.servlet.http.HttpServletRequest;

boolean https = request.isSecure();

클라이언트가 요청을 하면 프록시나 로드 밸런서를 통해 웹서버에 요청하기 때문에 실제 클라이언트의 정보와 다를 수 있다.

우선 아래와 같이 샘플코드 형식으로 작성하면 실제 HTTP/HTTPS 접근 여부를 알 수 있다.

public static String getClientIp(HttpServletRequest req) {
    boolean https = false;
    String proto = (String) request.getHeader("x-forwarded-proto");
    if (proto != null) 
        https = "https".equal(proto) ? true : false;
    } else {
        https = request.isSecure();
    }
}


X-Forwarded-Proto(XFP) 헤더는 클라이언트가 프록시(또는 로드밸런서)에 접속할 때 사용한 프토토콜(HTTP 또는 HTTPS)를 식별하는 표준 헤더이다. 그래서 프록시나 로드밸런스 등을 사용할 경우 X-Forwarded-Proto 요청 헤더에 클라이언트의 프로토콜을 저장하고 웹 서버로 전달해야 한다.

그렇기에 Apache/Nginx 등에서 설정이 되어있다는 가정하에 위와 같이 헤더 정보로 확인이 가능하다.


참고: https://linked2ev.github.io/devlog/2019/07/21/WEB-What-is-X-Forwarded-Proto/