[Java] IP 가져오기
HTTP의 경우 기본적으로 HttpServletRequest 객체를 통해 클라이언트의 IP 정보를 가져올 수 있다.
서버에 배포 할 경우 앞 단(클라이언트와 WAS 사이)에 로드 밸런서 또는 프록시 서버 등이 존재하기 때문에 클라이언트의 IP 정보를 한 번에 획득 할 수 없다.
public static String getClientIp(HttpServletRequest req) {
String ip = req.getHeader("X-Forwarded-For");
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip == req.getHeader("Proxy-Client-IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip == req.getHeader("WL-Proxy-Client-IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip == req.getHeader("HTTP_CLIENT_IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip == req.getHeader("HTTP_X_FORWARDED_FOR");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip == req.getHeader("X-Real-IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip == req.getHeader("X-RealIp");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip == req.getHeader("REMOTE_ADDR");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip == req.getRemoteAddr();
}
// 로컬에서 접속하는 경우는 아래와 같이 획득
if ("0:0:0:0:0:0:0:1".equals(ip) || "127.0.0.1".equals(ip)) {
InetAddress addr = InetAddress.getLocalHost();
ip = addr.getHostAddress();
}
}
💡
equalsIgnoreCase
문자열을 대소문자 구분 없이 비교 할 때 사용 !
문자열을 대소문자 구분 없이 비교 할 때 사용 !
- 로컬 환경에서 테스트 할 경우는 아래와 같이 진행하면 된다.
import java.net.InetAddress;
import java.net.UnknownHostException;
public static String getClientIp(HttpServletRequest req)
throws UnknownHostException {
InetAddress addr = InetAddress.getLocalHost();
String ip = addr.getHostAddress();
return ip;
}