반응형

프로그램을 할 때 특정 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 형식으로 변환하여 리턴합니다.

 

반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기