티스토리 뷰
반응형
접속자의 로그를 남기려고 HttpServletRequest 의 getRemoteAddr() 을 호출해보았다.
public static String getClientIP(HttpServletRequest request) {
...
return request.getRemoteAddr();
}
내가 아는 장비에서 테스트 해보면 ... 뭔가 정확한 ip 주소가 나오지 않았다.
그 이유는 getRemoteAddr() 은 직접적인 IP만 반환하며,
프록시나 로드밸런서 또는 그 외 다른 네트워크 장비를 탄다면 실제 ip 주소를 얻기는 힘들다.
그래서 요청헤더의 정보를 받아 아래와 같이 실제 클라이언트의 ip 를 얻을 수 있다.
import javax.servlet.http.HttpServletRequest;
public class IPUtils {
public static String getClientIP(HttpServletRequest request) {
String ip = request.getHeader("X-Forwarded-For");
if (ip != null && !ip.isEmpty() && !"unknown".equalsIgnoreCase(ip)) {
// X-Forwarded-For에는 여러 IP가 포함될 수 있으므로 첫 번째 IP를 사용
return ip.split(",")[0];
}
ip = request.getHeader("Proxy-Client-IP");
if (ip != null && !ip.isEmpty() && !"unknown".equalsIgnoreCase(ip)) {
return ip;
}
ip = request.getHeader("WL-Proxy-Client-IP");
if (ip != null && !ip.isEmpty() && !"unknown".equalsIgnoreCase(ip)) {
return ip;
}
ip = request.getHeader("HTTP_CLIENT_IP");
if (ip != null && !ip.isEmpty() && !"unknown".equalsIgnoreCase(ip)) {
return ip;
}
ip = request.getHeader("HTTP_X_FORWARDED_FOR");
if (ip != null && !ip.isEmpty() && !"unknown".equalsIgnoreCase(ip)) {
return ip;
}
// 위 헤더가 모두 없으면 기본적으로 request.getRemoteAddr() 사용
return request.getRemoteAddr();
}
}
헤더값에 적힌 ip 주소로 찾아내는 것을 확인할 수 있었다.
물론 변조자가 헤더를 바꿔버리면 그것도 무용지물이긴 하겠지만...
반응형
'Java > SpringBoot&Spring' 카테고리의 다른 글
[SpringBoot] poi 라이브러리 버전에 따른 오류해결 (feat.ibSheet8 엑셀다운로드) (1) | 2024.11.20 |
---|---|
[Springboot] redis cache 심플하게 사용해보기. (0) | 2024.10.18 |
[Springboot] 운영서버에 로그파일 설정 (0) | 2024.08.30 |
[Thymeleaf] 주간 요일 구하기 (0) | 2024.06.28 |
[Springboot] 외부 라이브러리 추가 (feat.intelliJ) (0) | 2024.06.18 |
댓글