프로그램을 할 때 특정 ip 대역을 체크해야 하는 경우가 있습니다. java에서 ip 대역을 체크하려면 어떻게 해야 하는지 한번 확인해 보도록 하겠습니다.
IPv4
32비트로 이뤄진 IPv4는 최대 약 40억 개의 서로 다른 주소를 부여할 수 있습니다.
그러나 기하급수적으로 늘어나는 사용자 수요를 감안할 때, 현재 사용되고 있는 IPv4 체계로는 계속해서
요구되는 인터넷 주소의 수요를 충족시킬 수 없다는 문제점이 있습니다.
IPV4는 한마디로 32비트의 40억개의 주소(2^32)로 구성됩니다.
IPv6
IPv6 주소는 128비트 체계로 구성되어 있으며, 그 표현방법은 128비트를 16비트씩 8 부분으로 나누어
각 부분을 콜론(colon, "":"")으로 구분하여 표현하며, 각 구분은 16진수로 표현합니다.
IPV4에서 IPV6 로이 전환의 이유 IETF에서는 2008년에서 2011년 사이에 IPv4 어드레스가 고갈될 것으로 예측했으며, 'IPng'(IP next generation)라고 하는 작업 그룹을 형성하여, 1994년부터 활동해 왔습니다.
이 결과로 1995년 9월 18일 표준이 제안되면서 IPv6가 만들어졌고, 또한 IPv6를 연동, 실험시킬 수 있는 실험 망으로 1996년 Bob Fink 등이 주축이 되어 6 Bone이라는 가상망을 만들었습니다. 그래서 IPV6 ( Internet Protocol version 6 )가 나오게 된 배경이라고 할 수 있습니다
입력 String을 형변환 하여 IP 형식체크
입력받은 ip string을 long 형으로 형 변환하여 입력한 ip가 형식체크
String[] list = allowIp.split("[,;]");
for (String ip : list) {
if (ip.contains("-") || ip.contains("~")) {
String[] range = ip.split("[-~]", 2);
if ( range.length == 2 ) {
if (checkIPRange(loginIp, range[0], range[1])) {
return true;
}
}
}
변환한 ip를 checkIPRange을 사용해 형 변환하겠습니다. 아래 checkIPRange 메서드에서 시작, 종료 ip를 확인하는데 ipToLong 메서드를 사용했습니다. 해당 메서드는 입력 값을 long형으로 변경해 줍니다.
public static boolean checkIPRange(String ip, String from, String to) {
long lIp = ipToLong(ip);
long lFrom = ipToLong(from);
long lTo = ipToLong(to);
if (lIp >= lFrom && lIp <= lTo) {
return true;
} else {
return false;
}
}
public static long ipToLong(String ip) {
if ( ip.contains(".") ) {
return ipV4ToLong(ip);
} else {
return ipV6ToLong(ip);
}
}
ipv4인 경우는 다음과 같이 처리하여 결과를 리턴합니다.
public static long ipV4ToLong(String ip) {
String[] addrArr = ip.split("\\.");
long num = 0;
for (int i = 0; i < addrArr.length; i++) {
int power = 3 - i;
num += ((Convert.toInt(addrArr[i]) % 256 * Math.pow(256, power)));
}
return num;
}
위 와 같이 처리하면 ipv4의 경우 입력받은 값이 ipv4 형식이 맞는지 확인 가능합니다. 만약 대역까지 확인을 해야 한다면 대역 범위를 long 형으로 선언 한 다음형 입력값이 해당 범위에 속하는지 확인하면 됩니다.
long 형으로 변환된 ip를 다시 string 문자로 변환이 필요한 경우 다음과 같이 코드를 추가하여 사용하면 됩니다.
public static String longToIP(long l) {
return ((1 >> 24) & 0xFF) + "." + ((1 >> 16) & 0xFF) + "." + ((1 >> 8) & 0xFF) + "." + ((1 & 0xFF));
}
그래서 ip 저장이 필요한 경우 long 형으로 변환하여 저장하고 조회할 때는 원래의 ipv4 형식으로 변환하여 리턴합니다.