웹 개발/웹 개발

WHOIS OpenAPI를 활용한 클라이언트 접속 국가 확인

크리스피코드 2023. 1. 24. 17:56

해외에서 접속하는 IP를 차단할 수 있는 방법이 있는지 찾아보다가 한국인터넷진흥원에서 제공하는 WHOIS OPENAPI가 있다는 것을 알게 되었다.

 

 

0. 공공데이터포털 활용 신청

우선 공공데이터포털에서 API 활용신청을 하여 서비스키를 받아야한다. 서비스키 자체는 신청 즉시 발급되지만 사용까지는 1~2시간정도, 최대 하루까지 기다려야할 수 있다.

 

 

https://www.data.go.kr/data/15094277/openapi.do

 

한국인터넷진흥원_인터넷주소(도메인이름, 아이피) 정보 검색 서비스

인터넷주소자원인 도메인, IP 주소, AS 번호의 등록정보 및 할당정보를 조회 할 수 있는 서비스(WHOIS 오픈API)

www.data.go.kr

 

 

1. 요청 데이터 보내기

페이지 하단에는 각 언어별로 사용 예시를 작성해두었다. 이를 그대로 복사해서 사용해도 무관하다.

 

import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.io.BufferedReader;
import java.io.IOException;

private String requestIpInfo(String ip) throws IOException {
    
    // URL
    StringBuilder urlBuilder
            = new StringBuilder("http://apis.data.go.kr/B551505/whois/ipas_country_code");
    
    // Service Key
    urlBuilder.append("?" + URLEncoder.encode("serviceKey","UTF-8") + "="
                          + "서비스키");
    
    // IP 주소 또는 AS 번호
    urlBuilder.append("&" + URLEncoder.encode("query","UTF-8") + "="
                          + URLEncoder.encode(ip, "UTF-8"));
    
    // 응답형식(XML/JSON) 을 지정(없으면 XML으로 응답)
    urlBuilder.append("&" + URLEncoder.encode("answer","UTF-8") + "="
                          + URLEncoder.encode("json", "UTF-8"));
    
    URL url = new URL(urlBuilder.toString());
    HttpURLConnection conn = (HttpURLConnection) url.openConnection();
    conn.setRequestMethod("GET");
    conn.setRequestProperty("Content-type", "application/json");
    
    BufferedReader rd;
    if(conn.getResponseCode() >= 200 && conn.getResponseCode() <= 300) {
        rd = new BufferedReader(new InputStreamReader(conn.getInputStream()));
    } else {
        rd = new BufferedReader(new InputStreamReader(conn.getErrorStream()));
    }
    
    StringBuilder sb = new StringBuilder();
    String line;
    while ((line = rd.readLine()) != null) {
        sb.append(line);
    }
    
    rd.close();
    conn.disconnect();
    
    System.out.println(sb.toString());
    return sb.toString();
}

 


위 코드에 서비스키를 넣고 실행하게 되면 다음과 같은 응답코드를 얻을 수 있다.

 

 

 

2. 응답 데이터 분석하기

내 경우에는 응답 데이터를 JSON으로 받았기 때문에 JSON 데이터를 분석해서 국가코드를 얻어내야한다. Gson과 같은 JSON 라이브러리를 사용하면 비교적 쉽게 원하는 데이터를 꺼내올 수 있다.

 

import java.util.Map;
import java.lang.reflect.Type;

import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;


public String getIPCountryCode(String ip) {
    
    String info = "";
    String countryCode = "";
    
    try {
        
        info = requestIPInfo(ip);
        
        Gson gson = new Gson();
        Type type = new TypeToken<Map<String, Map<String, Map<String, String>>>>(){}.getType();
        
        Map<String, Map<String, Map<String, String>>> map = gson.fromJson(info, type);
        
        countryCode = map.get("response").get("whois").get("countryCode");
        
    } catch (Exception e) {
        e.printStackTrace();
    }
    
    return countryCode;	
}

 

 

다음과 같이 국가코드가 정상적으로 추출되는 것을 확인할 수 있다. 이 API를 잘 활용하면 원하지 않는 국가에서의 접속을 차단할 수 있을 것이다.