006. Java 에서 Local IP 와 NAT IP validation 그리고 Testcode
✔️ Local IP는 사설 네트워크 범위(10.x.x.x, 172.16.x.x ~ 172.31.x.x, 192.168.x.x)
✔️ NAT IP는 사설 IP를 제외한 모든 IPv4 주소
✔️ Java & Spring Boot에서 정규식 검증 적용 가능
Validation code
import java.util.regex.Pattern;
public class IPValidator {
// Local IP 정규식
private static final String LOCAL_IP_REGEX =
"^(10\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3})$|" + // 10.x.x.x
"^(172\\.(1[6-9]|2[0-9]|3[0-1])\\.\\d{1,3}\\.\\d{1,3})$|" + // 172.16.x.x ~ 172.31.x.x
"^(192\\.168\\.\\d{1,3}\\.\\d{1,3})$"; // 192.168.x.x
// NAT IP (공인 IP) 정규식 (사설 IP, 루프백 제외)
private static final String PUBLIC_IP_REGEX =
"^(?!10\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}$)" +
"(?!172\\.(1[6-9]|2[0-9]|3[0-1])\\.\\d{1,3}\\.\\d{1,3}$)" +
"(?!192\\.168\\.\\d{1,3}\\.\\d{1,3}$)" +
"(?!127\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}$)" +
"(\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3})$";
public static boolean isLocalIp(String ip) {
return Pattern.matches(LOCAL_IP_REGEX, ip);
}
public static boolean isPublicIp(String ip) {
return Pattern.matches(PUBLIC_IP_REGEX, ip);
}
}
Test code
import spock.lang.Specification
import spock.lang.Unroll
class IPValidatorTest extends Specification {
@Unroll // 각 테스트 케이스를 개별 실행하여 명확한 결과 확인.
def "Local IP 검증"() {
expect:
IPValidator.isLocalIp(ip) == expected
where:
ip || expected
"10.0.0.1" || true // ✅ A 클래스 사설 IP
"10.255.255.255" || true
"172.16.0.1" || true // ✅ B 클래스 사설 IP
"172.31.255.255" || true
"192.168.0.1" || true // ✅ C 클래스 사설 IP
"192.168.255.255"|| true
"192.167.1.1" || false // ❌ 공인 IP
"172.15.255.255" || false // ❌ 172.16~172.31 범위를 벗어남
"11.0.0.1" || false // ❌ 공인 IP
"8.8.8.8" || false // ❌ 공인 IP (Google DNS)
}
@Unroll
def "Public IP 검증"() {
expect:
IPValidator.isPublicIp(ip) == expected
where:
ip || expected
"8.8.8.8" || true // ✅ 공인 IP (Google DNS)
"52.15.192.200" || true // ✅ AWS 공인 IP
"203.0.113.1" || true // ✅ 공인 IP
"192.168.1.1" || false // ❌ 사설 IP
"10.0.0.1" || false // ❌ 사설 IP
"172.16.0.1" || false // ❌ 사설 IP
"127.0.0.1" || false // ❌ 루프백 (공인 IP 아님)
}
}
Last updated