티스토리 뷰

문제 발생

로그인 시에 IP 제한 기능을 구현하기 위해 다음 코드와 같이 로그인 로직을 처리하기 전에 클라이언트의 IP를 얻어와 허용된 IP인지 체크하려고 했다.

@PostMapping("/login")
public String login(LoginDto loginDto, HttpServletRequest request) {
	String remoteAddr = request.getRemoteAddr();
	// 1. IP 체크 로직
	// 2. 로그인 로직
}

 

하지만 getRemoteAddr()로 부터 얻어온 IP는 요청한 클라이언트의 IP가 아닌 웹 서버의 IP주소가 담겨있었다.

 

문제 원인

이러한 현상이 나타나는 이유를 찾아보니 클라이언트와 서버 중간에서 트래픽이 프록시나 로드 밸런서를 거치게 되면, 서버 접근 로그에는 프록시나 로드 밸런서의 IP 주소만을 담고 있다고 한다.

 

그러면 어떻게 이 문제를 해결할 수 있을까?

 

바로 X-Forwarded-For 헤더를 사용하여 해결할 수 있다.

 

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

 

해결 방법

아래와 같이 Apache Tomcat의 server.xml에 X-Forwarded-For 설정을 추가하여 해결할 수 있다.

<Valve className="org.apache.catalina.valves.RemoteIpValve"
    internalProxies="192\.168\.0\.10|192\.168\.0\.11"
    remoteIpHeader="x-forwarded-for"
    proxiesHeader="x-forwarded-by"
    protocolHeader="x-forwarded-proto" />

internalProxies는 내부 프록시의 IP 주소와 일치하는 정규식이다. (정규식은 java.util.regex에서 지원하는 구문을 사용한다.)

 

참고자료

1. X-Forwarded-For - HTTP - MDN Web Docs

2. Proxy(프락시) 환경에서 client IP 를 얻기 위한 X-Forwarded-For(XFF) http header

3. RemoteIpValue (Apache Tomcat API Documentation)

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
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 27 28 29 30 31
글 보관함