728x90
반응형
톰켓 요청 클라이언트 IP를 특정 IP로 고정시키기
Pin Tomcat request client IP to a specific IP
상황
- 웹 프로젝트 컨버팅 사업때문에 동일한 환경으로 서버를 구성하고 소스를 import해서 테스트중이 었는데 다 잘되는데.. 리포트화면에서 문제가 발생했습니다
- 업무별로 리포트를 요청할 때 요청 규격만 확인하면 되는데 리포트서버 라이선스 문제가 발생한 것이죠…(당연하겠쥬 ㅠㅠ)
- 리포팅제공 업체에 알아보니 로컬호스트로 호출하면 된다고 해서 (개발용으로는 사용제한 없는 듯) 톰켓(was)으로 들어오는 모든 클라이언트요청을 임의의 IP(localhost)로 고정시켜 보기로 했어요.
처리방법
CustomRemoteIpValve java 파일생성
- 먼저 프로젝트에 CustomRemoteIpValve.java 파일을 패키지없이 생성하고 아래 코드를 입력합니다.
- 고정하고 싶은 아이피는 request.setRemoteAddr 여기 함수에 파라미터로 넘기시면 됩니다.
import org.apache.catalina.connector.Request;
import org.apache.catalina.connector.Response;
import org.apache.catalina.valves.ValveBase;
import javax.servlet.ServletException;
import java.io.IOException;
public class CustomRemoteIpValve extends ValveBase {
@Override
public void invoke(Request request, Response response) throws IOException, ServletException {
// 클라이언트 IP를 127.0.0.1로 고정
request.setRemoteAddr("127.0.0.1");
getNext().invoke(request, response);
}
}
- 근데 그냥 컴파일 하면 오류가 발생할 수 있는데요, 그럴땐 클래스패스로 server runtime을 추가해주시면 됩니다. (Import하는 클래스가 톰캣서버에서 사용되는 라이브러리에 있어서 그렇습니다.)
톰켓 lib폴더에 클래스 추가
- 톰켓 구동시 참조할 수 있도록 톰켓 lib폴더에 CustomRemoteIpValve.class파일을 복사해서 붙여넣습니다.
- 만약 CustomRemoteIpValve.java 파일이 빌드되어 있는 위치를 못찾겠다면 아래를 참고 하세요
- 그리고 tomcat의 server.xml 파일을 열어 host아래에다가 CustomRemoteIpValve 를 추가합니다
<Valve className="CustomRemoteIpValve" />
- 이제 톰켓으로 요청하는 모든 클라이언트 IP는 127.0.0.1(localhost)로 인식됩니다.
확인
- 확인해볼까요?
- Jsp파일에 request.getRemoteAddr() 로 클라이언트 아이피를 찍어주도록 셋팅하고 테스트를 해보면!
<%=request.getRemoteAddr()%>
- 요청 아이피가 127.0.0.1로 찍힙니다.
- 다시 server.xml에 셋팅된 CustomRemoteIpValve를 주석처리해 볼께요
- 주석 처리 후 요청을 해보면 정상적으로 요청한 클라이언트의 IP가 찍힙니다.
이걸로 리포트 테스트는 정상적으로 했습니다.
주의해야 할 점은 보안에 취약하니 운영에서는 절대 사용하면 안 되고, 운영에서 라이선스를 우회하는 용도로 사용해도 안돼요~ (라이선스 없이 사용하는 것이니 처벌받겠죠?)
728x90
반응형