InetAddress를 이용하면 외부 ip 주소가 아닌 사설 ip 주소를 얻어온다. 따라서 지금 하는 프로젝트와 맞지 않아 외부 ip를 가져올 수 있는 방법을 찾아보았다.
간단하게는 HttpServletRequest의 getRemoteAddr()
로 알아낼 수 있지만, 프록시, Caching 서버, 로드 밸런서 등을 거치면 저 메서드로도 ip 주소을 얻어낼 수가 없다고 한다. 따라서 저런 경우에 맞게 맞춰야 한다.
String GetIpAddress(HttpServletRequest request) {
String ip = request.getHeader("X-Forwarded-For");
if (ip == null) {
ip = request.getHeader("Proxy-Client-IP");
}
if (ip == null) {
ip = request.getHeader("WL-Proxy-Client-IP");
}
if (ip == null) {
ip = request.getHeader("HTTP_CLIENT_IP");
}
if (ip == null) {
ip = request.getHeader("HTTP_X_FORWARDED_FOR");
}
if (ip == null) {
ip = request.getRemoteAddr();
}
return ip;
}
자바에서는 ipv6가 기본으로 설정되어 있어서 별도로 ipv4를 사용할 수 있도록 설정해줘야 한다.
Run > Edit Configurations 메뉴에서 Environment를 펼쳐준다.
VM options에 아래 문장을 붙여넣기 해주면 완료
-Djava.net.preferIPv4Stack=true
이 경우는 위 코드를 실행해도 외부 ip 주소가 뜨지 않는다. 같은 외부 ip 주소 내에서는 사설 ip만 계속 뜨게 될 것이다.
따라서 ngrok을 사용하여 다른 컴퓨터로 접속해 외부 ip가 정상적으로 출력되는지 확인해 보겠다.
ngrok 에서 회원가입을 하고 난 후, 아래와 같은 대시보드 창이 뜰 것이다.
먼저 ngrok을 다운받고 압축을 풀어준 다음, 터미널을 열고 ngrok authtoken을 입력해준다. ngrok이 없다고 뜬다면 ngrok 앞에 경로를 다 써주면 된다.
마지막으로 ngrok http 8080을 입력해주면 세팅은 완료되었다.