반응형
해당 글에서는 Java 내에서 다양한 IP 주소를 반환받는 방법으로 클라이언트 IP, 외부 IP, 내부 IP, 호스트 IP를 반환받는 방법에 대해 알아봅니다.
1) IP 종류
IP 종류 | 설명 | 주소 예시 | 할당 담당 |
클라이언트 IP(Client IP) | 클라이언트(사용자)가 서버에 접근할 때 사용되는 IP | 서버에 접속할 때마다 동적으로 할당됨 | 서버 |
외부/공개 IP(Public IP) | 외부 네트워크에서 컴퓨터를 식별하는 IP | ISP에 의해 할당되는 고유한 주소 | 인터넷 서비스 제공업체(ISP) |
내부/사설 IP(Private IP) | 내부 네트워크에서 컴퓨터를 식별하는 IP | 네트워크 관리자에 의해 할당되는 주소 (같은 내부 네트워크 내에서만 고유해야 함) | 네트워크 관리자 |
로컬 호스트 IP(Localhost IP) | 컴퓨터가 자기 자신을 가리킬 때 사용하는 IP | 항상 동일한 127.0.0.1 | N/A |
호스트 IP(Host IP) | 현재 시스템이 연결된 네트워크의 IP | 네트워크에 연결될 때마다 동적으로 할당됨 | 네트워크 |
[ 더 알아보기 ]
💡 Wifi에 연결이 되었다면 Public IP, Private IP 중 어떤 IP를 발급 받을까?
- Wifi 내에서는 Private IP 값을 발급받습니다. Wifi라는 사설 IP 내에서 고유한 IP 값을 발급받기 때문입니다. 그러나 인터넷을 접근할 때는 ‘인터넷 서비스 제공자(ISP)’에 의해 발급받은 고유한 Public IP 값을 이용합니다.
💡 검색 포털 사이트에서 ‘내 아이피 주소’라고 검색을 하면 나오는 값은 무슨 IP를 의미할까?
- 외부/공개 IP(Public IP)를 의미합니다. 이는 사용자가 네트워크에 인터넷 연결될 때 ‘인터넷 서비스 제공자(ISP)’에 의해 할당되는 주소입니다.
💡 그러면 내가 접근하는 포털마다 Public IP가 달라지는 것일까?
- 아닙니다. 사용자가 인터넷에 접속할 때 할당받는 공개 IP 주소는 인터넷 서비스 제공자(ISP)에서 제공하는 것이므로, 포털 사이트를 변경하더라도 공개 IP 주소는 동일하게 유지됩니다.
💡 Public IP가 변경되지 않으면 고정되는 값일까?
- Public IP 주소는 여러 상황에서 변경될 수 있습니다. 인터넷 서비스 제공자(ISP)가 IP 주소를 동적으로 할당하는 경우, 라우터나 모뎀을 재시작하거나 일정 시간 동안 인터넷 연결이 끊어진 후에는 새로운 IP 주소가 할당될 수 있습니다. 또한, ISP가 IP 주소를 변경하거나 사용자가 VPN 같은 도구를 사용하여 IP 주소를 변경하는 경우에도 공개 IP 주소는 달라질 수 있습니다.
2) 클라이언트 IP 주소(Client IP Address)
💡 클라이언트 IP 주소(Client IP Address)
- 인터넷을 사용하는 장치(예: 컴퓨터, 스마트폰 등)가 인터넷에 연결될 때 할당받는 고유한 주소를 말합니다. 이 주소는 인터넷상의 통신에서 해당 장치를 식별하는 역할을 합니다.
- 클라이언트 IP 주소는 고정 IP 주소와 동적 IP 주소 두 가지 유형이 있습니다. 고정 IP 주소는 항상 같은 주소를 사용하며, 동적 IP 주소는 연결할 때마다 새로운 주소를 할당받습니다.
💡 사용 예시
- Client IP 주소를 얻기 위한 예시입니다. 이는 HttpServletRequest 객체를 사용하여 HTTP 요청에 포함된 여러 헤더를 확인하며, 이 헤더들 중에서 클라이언트 IP 정보를 담고 있는 헤더를 찾습니다.
1. X-Forwarded-For 헤더를 확인합니다. 이 헤더는 클라이언트의 IP 주소를 포함하는 경우가 많습니다. 그러나 이 값이 없거나 무의미한 값(unknown) 일 경우 다른 헤더를 순차적으로 확인합니다.
2. 다음 순서로 확인하는 헤더는 Proxy-Client-IP, WL-Proxy-Client-IP, HTTP_CLIENT_IP, HTTP_X_FORWARDED_FOR, X-Real-IP, X-RealIP, REMOTE_ADDR 등을 통해 확인합니다.
3. 이러한 헤더들 중에서 고객의 IP 주소 정보를 담고 있는 헤더를 찾으면 해당 IP 정보를 clientIp 변수에 저장하고 콘솔에 출력합니다. 만약 모든 헤더를 확인했음에도 IP 정보를 찾지 못하면 마지막으로 request.getRemoteAddr() 메서드를 사용하여 IP 정보를 얻습니다.
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
public class Main {
public static void main(String[] args) {
String clientIp = "";
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest();
clientIp = request.getHeader("X-Forwarded-For");
if (clientIp == null || clientIp.length() == 0 || "unknown".equalsIgnoreCase(clientIp)) {
clientIp = request.getHeader("Proxy-Client-IP");
}
if (clientIp == null || clientIp.length() == 0 || "unknown".equalsIgnoreCase(clientIp)) {
clientIp = request.getHeader("WL-Proxy-Client-IP");
}
if (clientIp == null || clientIp.length() == 0 || "unknown".equalsIgnoreCase(clientIp)) {
clientIp = request.getHeader("HTTP_CLIENT_IP");
}
if (clientIp == null || clientIp.length() == 0 || "unknown".equalsIgnoreCase(clientIp)) {
clientIp = request.getHeader("HTTP_X_FORWARDED_FOR");
}
if (clientIp == null || clientIp.length() == 0 || "unknown".equalsIgnoreCase(clientIp)) {
clientIp = request.getHeader("X-Real-IP");
}
if (clientIp == null || clientIp.length() == 0 || "unknown".equalsIgnoreCase(clientIp)) {
clientIp = request.getHeader("X-RealIP");
}
if (clientIp == null || clientIp.length() == 0 || "unknown".equalsIgnoreCase(clientIp)) {
clientIp = request.getHeader("REMOTE_ADDR");
}
if (clientIp == null || clientIp.length() == 0 || "unknown".equalsIgnoreCase(clientIp)) {
clientIp = request.getRemoteAddr();
}
System.out.println("Client IP ::" + clientIp);
}
}
💡 결과 확인
- 내 PC에서 접근하기에 “0:0:0:0:0:0:0:1” 값이 출력됩니다. 해당 값은 Ipv6 형태로 반환을 받습니다.
- 아래와 같은 형태로 환경설정을 하면 Ipv4 형태로 반환받을 수 있습니다.
💡 [참고] IntelliJ 내에서 IPv6 값을 IPv4로 반환받는 설정 방법
- 아래와 같이 설정하면 IPv4 값을 반환받을 수 있습니다.
💡 [참고] IPv4, IPv6 정의 및 정규 표현식에 대해 궁금하시면 아래의 글을 참고하시면 도움이 됩니다.
3) 외부 / 공개 IP 주소(Public IP Address)
💡 외부 / 공개 IP 주소(Public IP Address)
- 인터넷에 연결된 장치가 외부 세계와 통신하기 위해 사용하는 주소입니다. 이 주소는 인터넷 서비스 제공업체(ISP)에 의해 할당되며, 인터넷상의 다른 장치들이 장치를 찾고 통신할 수 있도록 해줍니다.
- 인터넷에 연결된 모든 장치가 고유하게 가지는 주소로, 외부에서 장치를 식별하는 데 사용됩니다.
💡 사용예시
1. URL 클래스를 사용하여 "http://checkip.amazonaws.com" 웹사이트에 접속합니다.
2. openConnection() 메서드를 사용하여 웹사이트에 연결합니다.
3. BufferedReader와 InputStreamReader를 이용하여 웹사이트의 내용을 읽어옵니다. 이 웹사이트는 사용자의 외부 IP 주소를 텍스트 형태로 반환합니다.
4. readLine() 메서드를 사용하여 한 줄을 읽어옵니다. 이 한 줄이 바로 사용자의 외부 IP 주소입니다.
5. 마지막으로 IP 주소를 콘솔에 출력합니다.
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
public class Main {
public static void main(String[] args) {
try {
URL url = new URL("<http://checkip.amazonaws.com>");
URLConnection connection = url.openConnection();
BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
String ip = in.readLine();
System.out.println("External IP Address: " + ip);
} catch (Exception e) {
e.printStackTrace();
}
}
}
💡 네이버에 “내 IP 주소 확인”라고 검색을 했을 때 나오는 외부 IP 주소에 대해 확인할 수 있습니다.
4) 내부 IP / 사설 IP 주소(Private IP Address)
💡 내부 IP 주소
- 사설 네트워크(예: 집이나 사무실의 Wi-Fi 네트워크)에서 사용되는 주소입니다. 이 주소는 공유기 또는 네트워크 관리자에 의해 할당되며, 같은 사설 네트워크 내의 다른 장치들이 장치를 찾고 통신할 수 있도록 해줍니다.
- 일반적으로, 같은 사설 네트워크 내의 다른 장치들이 장치를 찾고 통신할 수 있도록 해줍니다.
- 이는 보통 개인 네트워크에서 사용되며, 외부 인터넷에 직접 연결되지 않습니다.
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.util.Enumeration;
public class Main {
public static void main(String[] args) {
try {
Enumeration<NetworkInterface> networkInterfaces = NetworkInterface.getNetworkInterfaces();
while (networkInterfaces.hasMoreElements()) {
NetworkInterface networkInterface = networkInterfaces.nextElement();
Enumeration<InetAddress> inetAddresses = networkInterface.getInetAddresses();
while (inetAddresses.hasMoreElements()) {
InetAddress inetAddress = inetAddresses.nextElement();
if (inetAddress.isSiteLocalAddress()) {
System.out.println("내부 IP 주소: " + inetAddress.getHostAddress());
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
[더 알아보기]
💡 왜 사설 네트워크는 여러 개인 거야?
- 한 대의 컴퓨터에는 여러 개의 네트워크 인터페이스(예: 유선 네트워크 카드, 무선 네트워크 카드, 가상 네트워크 인터페이스 등)가 존재할 수 있고, 각 네트워크 인터페이스가 각각의 내부 IP 주소를 가지고 있기 때문에 내부 IP 주소가 여러 개일 수 있습니다.
5) 호스트 IP 주소(Host IP Address)
💡 호스트 IP 주소(Host IP Address)
- 현재 컴퓨터 시스템이 연결된 네트워크의 IP 주소를 말합니다. 이 주소는 'InetAddress.getLocalHost().getHostAddress()' 함수를 사용하여 얻을 수 있습니다. 반환되는 IP 주소는 내부 네트워크의 Private IP 주소일 수도 있고, 외부 네트워크로부터 할당받은 Public IP 주소일 수도 있습니다.
- 시스템이 내부 네트워크에만 연결되어 있다면, 이 함수는 Private IP를 반환합니다. 하지만 인터넷에 연결되어 있다면, Public IP를 반환합니다. 이는 시스템이 연결된 네트워크 환경에 따라 달라집니다.
- 그러나, 모든 컴퓨터는 루프백 주소인 127.0.0.1을 가지고 있습니다. 이 주소는 자신의 컴퓨터를 가리키는 IP 주소로, 이 주소로 데이터를 전송하면 바로 자신의 컴퓨터로 돌아옵니다.
💡 사용예시
- java.net.InetAddress 패키지 내에서 InetAddress 클래스를 이용하여 내 PC에서 IP 주소를 조회합니다
- .getLocalHost().getHostAddress() 메서드를 통해 실제 내 로컬 호스트 내의 IP 주소를 반환받습니다.
import java.net.InetAddress;
import java.net.UnknownHostException;
public class Main {
public static void main(String[] args) {
String localhostIp = "";
try {
String hostAddr = InetAddress.getLocalHost().getHostAddress();
System.out.println("Host IP Address: " + hostAddr);
} catch (UnknownHostException e) {
log.error("Exception :: " + e.getMessage());
}
}
}
[참고] InetAddress Class의 메서드에 대해 궁금하시면 아래의 글을 참고하시면 도움이 됩니다.
[ 더 알아보기 ]
💡루프백(Loopback)
- 장치가 자신으로 다시 메시지를 전송하는 통신 경로를 말합니다. 이를 통해 네트워크 인터페이스와 관련된 소프트웨어와 하드웨어가 제대로 작동하는지 검사할 수 있습니다.
- 루프백 주소인 127.0.0.1은 자신의 컴퓨터를 가리키는 IP 주소로, 이 주소로 데이터를 전송하면 바로 자신의 컴퓨터로 돌아옵니다.
💡 결과확인
오늘도 감사합니다. 😀
반응형
'Java > 공통 모듈' 카테고리의 다른 글
[Java] 자주 사용하는 패턴 -1 : 배열/리스트 조작 (0) | 2023.11.03 |
---|---|
[Java] String 함수 이해하기 : format, join, valueOf, copyValueOf (0) | 2023.05.08 |
[Java] String, StringBuffer, StringBuilder 이해하기 (2) | 2023.02.26 |
[Java] Stream API -3 이해하기: Stream 최종연산 (0) | 2023.02.14 |
[Java] Stream API -2 이해하기: Stream 중간연산 (4) | 2023.02.08 |