웹개발/egov
[egov] 클라이언트(Client) IP 가져오기
08genie
2023. 6. 17. 19:00
반응형
Client IP를 가져오고자 할때 보통은 Spring의 controller에서 request.getRemoteAddr();를 이용해 IP를 가져오는데, WAS 서버 앞에 프록시 서버, 로드밸런싱 서버 등과 같은 다른서버가 존재할때 request.getRemoteAddr();를 이용하면 Client IP가 아닌 WAS 앞의 서버의 중간 서버 IP를 가져옵니다.
이러한 경우 Client IP는 Header에 남겨두기 때문에 Header를 이용해서 IP를 가져와야 합니다.
Client IP 가져오는 Util 클래스 예시
package egovframework.client.web.utils;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
@Component
public class SampleUtil {
/*클라이언트 ip가져오기*/
public static String getClientIp(HttpServletRequest request) throws UnknownHostException {
String clientIp = null;
boolean isIpInHeader = false;
List<String> headerList = new ArrayList<>();
headerList.add("X-Forwarded-For");
headerList.add("HTTP_CLIENT_IP");
headerList.add("HTTP_X_FORWARDED_FOR");
headerList.add("HTTP_X_FORWARDED");
headerList.add("HTTP_FORWARDED_FOR");
headerList.add("HTTP_FORWARDED");
headerList.add("Proxy-Client-IP");
headerList.add("WL-Proxy-Client-IP");
headerList.add("HTTP_VIA");
headerList.add("IPV6_ADR");
headerList.add("X-RealIP");
headerList.add("X-Real-IP");
headerList.add("REMOTE_ADDR");
for (String header : headerList) {
//hdear ip를 가져온다.
clientIp = request.getHeader(header);
//ip가 존재할 경우 ip를 clientIp에 넣어 준후 break
if (StringUtils.hasText(clientIp) && !"unknown".equalsIgnoreCase(clientIp)) {
isIpInHeader = true;
break;
}
}
//isIpInHeader가 false이면 remoteAddr을 clientIp에 넣어준다.
if (!isIpInHeader) {
clientIp = request.getRemoteAddr();
}
return clientIp;
}
}
Contoller 단 사용 예제
String clientIp = SampleUtil.getClientIp();
Reference : https://j-dev.tistory.com/entry/Spring-Client-Ip-%EA%B0%80%EC%A0%B8%EC%98%A4%EA%B8%B0
반응형