사용자 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"
'오류 해결 및 새로운 지식 > API활용 및 오류 해결' 카테고리의 다른 글
[JAVA] 공공데이터포털 공휴일 API 사용법 (최신) (0) | 2023.11.28 |
---|---|
개발자 화나는 literal does not match format string 오류 해결법 (0) | 2023.10.18 |