본문 바로가기
오류 해결 및 새로운 지식/API활용 및 오류 해결

(JAVA) 클라이언트(접속자) IP주소 설정 개발(IPv6 > IPv4 변환)

by 해삼2 2023. 8. 25.
728x90
반응형

사용자 IP 주소 가져오기) 각자 세팅하기 여기서 HttpServletRequest 불러와야 한다.

 HttpServletRequest:

역할은 클라이언트의 요청에 대한 응답을 생성하거나 필요한 작업을 수행하는 데 사용됩니다.

public void ??? (Map<String,Object> paramMap, ModelMap model, HttpServletRequest request) 
// IP 주소
String ipAddress = getClientIP(request);
System.out.println("ipAddress :"+ ipAddress);
		        
paramMap.put("ipAddress", 	 ipAddress);		        
paramMap.put("systemId",     "SYSTEM_BP11");		              	// bpas시스템아이디
paramMap.put("bpasInfoCode", "STAT_APPROACHINFORMATION_30");  		// 직원
paramMap.put("bpasWorkCd",   "STAT_APPROACHWORK_20");		  		// 등록
								
pinfoaccesshistInsert = procCommMangPopDao.pinfoaccesshistInsert(paramMap);  // PF_PINFOACCESSHIST

설명:

웹 애플리케이션이 클라이언트와 통신할 때, 클라이언트의 실제 IP 주소를 가져오는 것은 중요한 과가 될 수 있습니다. 그런데 클라이언트와 서버 사이에 프록시 서버나 로드 밸런서 같은 중간 장치가 개입하면서 

실제 IP 주소가 모호해질 수 있어서 그걸 보안하려고 나온 게 X-Forwarded-For입니다.

한마디로 내 로컬에서 테스트 하면 본인 로컬 IP주소를 가져올 수 있지만 서버 즉 WAS에 배포를 하면 

해당 WAS에 헤더가 프록시서버나 로드 밸런서 같은 중간 장치가 개입하면 내 로컬 IP주소인지 아님 프록시

서버 IP주소인지 모호해질 수 있기 때문에 X-Forwarded-For를 사용한다.

X-Forwarded-For를 이용하면 클라이언트 IP 주소와 프록시 서버들의 IP 주소들이 쉼표로 구분되어 포함

될 수 있는데 첫 번째 IP 주소가 일반적으로 클라이언트의 IP 주소여서 그걸 활용하면 된다.

또한 헤더가 그것 말고 더 있을 수 있으니 여러 헤더를 확인하여 클라이언트의 IP 주소를 최대한

정확하게 추출해야 합니다.

// IP주소 채굴
public String getClientIP(HttpServletRequest request) {
String ipAddress = request.getHeader("X-Forwarded-For");
		    
if (ipAddress == null || ipAddress.isEmpty() || "unknown".equalsIgnoreCase(ipAddress)) {
ipAddress = request.getHeader("Proxy-Client-IP");
}
if (ipAddress == null || ipAddress.isEmpty() || "unknown".equalsIgnoreCase(ipAddress)) {
ipAddress = request.getHeader("WL-Proxy-Client-IP");
}
if (ipAddress == null || ipAddress.isEmpty() || "unknown".equalsIgnoreCase(ipAddress)) {
ipAddress = request.getHeader("HTTP_CLIENT_IP");
}
if (ipAddress == null || ipAddress.isEmpty() || "unknown".equalsIgnoreCase(ipAddress)) {
ipAddress = request.getHeader("HTTP_X_FORWARDED_FOR");
}
		    
// 여기서 첫 번째 IP 주소를 추출
if (ipAddress != null && !ipAddress.isEmpty()) {
String[] ipArray = ipAddress.split(",");
ipAddress = ipArray[0].trim();
}
		    
if (ipAddress == null || ipAddress.isEmpty() || "unknown".equalsIgnoreCase(ipAddress)) {
ipAddress = request.getHeader("X-Real-IP");
}
if (ipAddress == null || ipAddress.isEmpty() || "unknown".equalsIgnoreCase(ipAddress)) {
ipAddress = request.getHeader("X-RealIP");
}
if (ipAddress == null || ipAddress.isEmpty() || "unknown".equalsIgnoreCase(ipAddress)) {
ipAddress = request.getHeader("REMOTE_ADDR");
}
if (ipAddress == null || ipAddress.isEmpty() || "unknown".equalsIgnoreCase(ipAddress)) {
ipAddress = request.getRemoteAddr();
}
		    
return ipAddress;
}

기본적으로 자바는 IPv6를 선호하도록 구성이 되어 있어서 스프링에서 IPV4로 변환하는 작업을 해야 합니다.

선호하는 이유는 더 넓은 공간을 확보하고 있어서 선호합니다. 하지만 우리들은 IPV4를 사용하고 있으니

변환하는 작업을 해줘야 합니다.

 

1) Run Configurations 클릭

2)  Arguments에서 -Djava.net.preferIPv4Stack=true 추가하기

-Djava.net.preferIPv4Stack=true: 설정은 Java 가상 머신(VM)이 IPv4를 기본적으로 선호하도록 설정하는 것


WAS서버 IPv6 > IPv4 변환작업 설정하는 법

 

Was 설정 파일 찾기: 일반적으로 WAS의 설정 파일은 {WAS 설치 경로}/conf 디렉토리에 위치합니다. 예를 들어, Apache Tomcat의 경우 catalina.sh (또는 catalina.bat 윈도우즈용) 파일을 통해 JVM 옵션을 설정할 수 있습니다.

JVM 옵션 추가: 해당 설정 파일을 열어서 JAVA_OPTS 또는 CATALINA_OPTS와 같은 환경 변수에 JVM 옵션을 추가합니다. 아마도 이미 해당 변수가 설정되어 있을 것이므로, 이 변수에 -Djava.net.preferIPv4Stack=true를 추가합니다.

예를 들어, Tomcat의 경우 catalina.sh 파일에 아래와 같이 추가할 수 있습니다:

export CATALINA_OPTS="$CATALINA_OPTS -Djava.net.preferIPv4Stack=true"

윈도우즈에서는 catalina.bat 파일에 아래와 같이 추가할 수 있습니다:

set "CATALINA_OPTS=%CATALINA_OPTS% -Djava.net.preferIPv4Stack=true"

 

728x90
반응형