클라이언트 요청 IP 헤더

서규범·2023년 5월 22일
0

X-Forwarded-For : 클라이언트의 원 IP 주소를 보기위해 X-Forwarded-For 요청 헤더가 사용

다음과 같이 콤마를 구분자로 client 와 proxy IP 가 들어가게 되므로 첫번째 IP 를 가져오면 클라이언트를 식별할 수 있다.

X-Forwarded-For: client, proxy1, proxy2

순차대로 들어오게 되므로 proxy2 가 마지막에 거친 프록시 서버의 ip 주소를 의미함


XFF 는 사실상의 표준이지 정식 RFC 에 포함된게 아니므로 대개는 착실하게 저 헤더를 사용하지만 엉뚱한 헤더를 사용하는 제품들이 있다. - (Proxy-Client-IP, WL-Proxy-Client-IP, HTTP_CLIENT_IP 등등)


WebServer, WAS, L4, proxy 종류에 상관없이 client IP 를 잘 가져오기를 바란다면 다음과 같은 순서로 IP 를 얻어내야 한다.


	String accessIp = null;

	if (accessIp == null || accessIp.length() == 0 || "unknown".equalsIgnoreCase(accessIp)) {
		accessIp = request.getRemoteAddr();
	}

	if (accessIp == null || accessIp.length() == 0 || "unknown".equalsIgnoreCase(accessIp)) {
		accessIp = request.getHeader("Proxy-Client-IP");
	}

	if (accessIp == null || accessIp.length() == 0 || "unknown".equalsIgnoreCase(accessIp)) {
		accessIp = request.getHeader("WL-Proxy-Client-IP");
	}

	if (accessIp == null || accessIp.length() == 0 || "unknown".equalsIgnoreCase(accessIp)) {
		accessIp = request.getHeader("HTTP_CLIENT_IP");
	}

	if (accessIp == null || accessIp.length() == 0 || "unknown".equalsIgnoreCase(accessIp)) {
		accessIp = request.getHeader("HTTP_X_FORWARDED_FOR");
	}

	if (accessIp == null || accessIp.length() == 0 || "unknown".equalsIgnoreCase(accessIp)) {
		accessIp = request.getHeader("X-Real-IP");
	}

	if (accessIp == null || accessIp.length() == 0 || "unknown".equalsIgnoreCase(accessIp)) {
		accessIp = request.getHeader("X-RealIP");
	}

	if (accessIp == null || accessIp.length() == 0 || "unknown".equalsIgnoreCase(accessIp)) {
		accessIp = request.getHeader("REMOTE_ADDR");
	}
profile
하려 하자

0개의 댓글