티스토리 뷰
728x90
반응형
기본적으로 HttpServletRequest 객체 내 함수를 이용하여 클라이언트 IP를 가져올 수 있습니다.
기본 default 주소를 가져올때 사용하는 함수는
-> HttpServletRequest -> request.getRemoteAddr();
그러나 이 기본 default 사용방식은 보안관련해서 방화벽이나 클라우드로 운영하는 경우 클라이언트의 실제 Ip 주소를 가져오기가 어렵다.
클라이언트가 요청을 하면 Web Server에서 프록시나 로드 밸런서를 통해 WAS에 요청하기 때문에 프록시나 로드 밸런서의 Ip 주소만을
담고 있습니다.
해결 방안 : X-Forwarded-For을 선언한 헤더를 사용하는 방법
ex) req.getHeader("X-Forwarded-For");
public static String getHeaderRemoteAddr(HttpServletRequest req) {
String ip = req.getHeader("X-Forwarded-For");
if( ip == null ) {
ip = req.getHeader("HTTP_X_FORWARDED_FOR");
if( ip == null ) {
ip = req.getRemoteAddr();
}
} else {
if( ip.indexOf(",") > -1 ){
ip = ip.substring(0, ip.indexOf(","));
}
}
return ip;
}
X-Forwarded-For 는 HTTP 프록시나 로드 밸런서를 통해 웹 서버에 접속하는 클라이언트의 실제 IP 주소를 식별하는 표준 헤더로 쓰이고 있습니다.
그래서 프록시나 로드밸런스 등 을 사용할 경우 Apache/Niginx에서 설정 되어있다는 가정하에 클라이언트의 실제 접속 IP를 가져올 수 있다.
그 외 서버환경 또는 프록시 등이 다른 중계서버를 이용하는 경우의 종류를 소개
String ip = request.getHeader("X-Forwarded-For");
logger.info("> X-FORWARDED-FOR : " + ip);
if (ip == null) {
ip = request.getHeader("Proxy-Client-IP");
logger.info("> Proxy-Client-IP : " + ip);
}
if (ip == null) {
ip = request.getHeader("WL-Proxy-Client-IP");
logger.info("> WL-Proxy-Client-IP : " + ip);
}
if (ip == null) {
ip = request.getHeader("HTTP_CLIENT_IP");
logger.info("> HTTP_CLIENT_IP : " + ip);
}
if (ip == null) {
ip = request.getHeader("HTTP_X_FORWARDED_FOR");
logger.info("> HTTP_X_FORWARDED_FOR : " + ip);
}
if (ip == null) {
ip = request.getRemoteAddr();
logger.info("> getRemoteAddr : "+ip);
}
logger.info("> Result : IP Address : "+ip);
톰켓 server.xml access 하는 부분 수정( 톰켓 서버에 접근하는 경우의 ip를 로그에 쌓는데 사용되는 패턴을 정하는 것)
ex) pattern ="%{X-Forwarded-For}i %l %u %t %r %s %b %{User-Agent}i" -> Apache/nginx 일 경우 사용
<!--기본 톰켓 세팅->
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="{커스텀.log}" suffix=".log" pattern ="combine"/>
<!--ip 프록시 해결 세팅-->
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="{커스텀.log}" suffix=".log" pattern ="%{X-Forwarded-For}i %l %u %t %r %s %b %{User-Agent}i"/>
728x90
반응형
'프로그램 언어 > JAVA' 카테고리의 다른 글
자바(java) 얕은 복사와 깊은 복사의 차이(경험담..) (0) | 2023.05.02 |
---|---|
java xml 정보 Sax 방식을 이용한 파싱 방법 (0) | 2023.05.02 |
java 엑셀 파일 읽기 대용량 문제 처리 방법 part2 (1) | 2023.05.02 |
java 엑셀 파일 읽기 기능 part1 (0) | 2023.05.02 |
자바(java) for 문의 종류 (0) | 2023.05.02 |
250x250
반응형
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- Quartz
- centos7
- dfs
- spring
- 알고리즘
- Cache
- leatcode
- 캐시
- 캘린더
- 컨테이너
- 이미지
- insert
- ncp
- LocalDate
- 네이버 클라우드
- 스케줄러
- Linux
- Java
- 도커
- 격리수준
- hazelcast
- mybatis
- 개념 이해하기
- 정의
- Lock
- dockerfile
- docker
- MySQL
- 리눅스
- 권한
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
글 보관함