개발 기록이
[JAVA] 서버 IP와 클라이언트 IP 값 가져오기 본문
1. 서버 IP 가져오기
InetAddress.getLocalHost()
import java.net.InetAddress;
import java.net.UnknownHostException;
public class ipTest {
public static void main(String args[]) throws UnknownHostException {
InetAddress ipnetAddr = InetAddress.getLocalHost();
System.err.println("현재 아이피 : " + ipnetAddr.getHostAddress());
System.err.println("현재 hostname : " + ipnetAddr.getHostName());
}
}
결과값
현재 아이피 : 192. xxx.xx.xx 현재 hostname : LAPTOP-xxxxxxxx |
현재 실행 중인 JVM이 호스팅되고 있는 현재 서버의 IP 주소를 가져오는 데 사용된다. 서버 자체의 네트워크 정보를 확인하거나, 로컬 환경에서 서버를 디버깅할 때 사용된다.
2. 클라이언트 IP 가져오기
request.getRemoteAddr()
@RequestMapping(value="/ip-test", method= RequestMethod.GET)
public void ipTest(HashMap<String, Object> param, Model model, HttpServletRequest request) throws UnknownHostException {
String ip = request.getHeader("X-Forwarded-For");
if (ip == null || ip.isEmpty() || "unknown".equalsIgnoreCase(ip)) {
ip = request.getRemoteAddr();
}
System.err.println("IP 값 : " + ip);
}
결과값(로컬 환경에서 실행했기 때문에 다음과 같이 출력됨.)
IP 값 : 0:0:0:0:0:0:0:1 |
그러나, 더 정확한 IP 값을 출력하기 위해서는 여러 헤더를 순서대로 확인하는 과정이 필요하다.
웹사이트에 접속할 때 HTTP 요청은 여러 단계를 거쳐 최종 서버에 도착한다. 클라이언트는 프록시 서버, 로드밸런서 등 여러 네트워크 경로를 거치게 된다.
클라이언트 -> 프록시 서버 -> 로드밸런서 -> 웹 서버 |
이 과정에서 request.getRemoteAddr() 메서드는 서버와 마지막으로 연결된 장치(즉, 프록시 서버나 로드밸런서)의 IP를 반환하기 때문에, 서버는 원래 사용자의 IP를 정확히 알기 어렵다.
그래서 원래 사용자 IP를 알아내기 위해서는 서버 환경에 따라 다양한 헤더가 사용될 수 있기 때문에 단순히 X-Forwarded-For 헤더만 확인하지 말고, 여러 헤더를 순서대로 확인해야 정확한 IP를 알아낼 수 있다.
@RequestMapping(value="/ip-test2", method= RequestMethod.GET)
public void ipTest2(HashMap<String, Object> param, Model model) throws UnknownHostException {
String ip = null;
HttpServletRequest request =
((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest();
ip = request.getHeader("X-Forwarded-For");
if (ip != null && ip.contains(",")) {
ip = ip.split(",")[0].trim(); // 첫 번째 IP가 실제 클라이언트 IP
}
if (ip == null || ip.isEmpty() || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("Proxy-Client-IP");
}
if (ip == null || ip.isEmpty() || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("WL-Proxy-Client-IP");
}
if (ip == null || ip.isEmpty() || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("HTTP_CLIENT_IP");
}
if (ip == null || ip.isEmpty() || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("HTTP_X_FORWARDED_FOR");
}
if (ip == null || ip.isEmpty() || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("X-Real-IP");
}
if (ip == null || ip.isEmpty() || "unknown".equalsIgnoreCase(ip)) {
ip = request.getRemoteAddr(); // 모든 헤더가 없을 경우 사용
}
System.err.println("IP 값 : " + ip);
}
1. X-Forwarded-For
: 클라이언트가 여러 프록시를 거쳐 요청을 보낼 때, 원래 클라이언트의 IP를 담고 있는 헤더.
2. Proxy-Client-IP
: 특정 프록시 서버에서 사용하는 헤더로, 원래 클라이언트의 IP를 담고 있음.
: Apache HTTP Server와 같은 서버에서 주로 사용됨.
3. WL-Proxy-Client-IP
: Oracle의 WebLogic 서버에서 사용되는 헤더.
4. HTTP_CLIENT_IP
: 비표준 헤더로, 일부 프록시 서버에서 사용됨.
5. HTTP_X_FORWARDED_FOR
: X-Forwarded-For와 유사한 역할을 하는 비표준 헤더.
6. X-Real-IP
: NGINX와 같은 리버스 프록시 서버가 사용하는 헤더.
7. request.getRemoteAddr()
: 서버와 마지막으로 연결된 장치의 IP를 반환하는 메서드.
: 프록시 서버를 사용하지 않는 경우에만 클라이언트의 실제 IP를 반환함.
자바 아이콘 제작자: Alfredo Hernandez - Flaticon
출처 : https://needneo.tistory.com/205
OpenAI ChatGPT (https://openai.com)
'웹 개발 > Back-end' 카테고리의 다른 글
[JAVA] public, private, static, final 정리 (0) | 2025.01.30 |
---|---|
[JAVA] ExecutorService 비동기 처리 (0) | 2025.01.19 |
[Spring] JPA 개념 정리 (Hibernate, Spring Data JPA) (0) | 2024.09.15 |
[Spring] dofilter filterchain 이란? (0) | 2024.08.23 |
[JAVA] Math.random(), Random 클래스, SecureRandom 클래스로 난수 생성하기 (0) | 2024.07.10 |