웹 개발/웹 개발
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를 잘 활용하면 원하지 않는 국가에서의 접속을 차단할 수 있을 것이다.