[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;
}

참고 : https://khrdev.tistory.com/entry/Java로-Client-IP-찾는-방법