반응형
IP를 통해 접속 국가를 확인 하는 방법에 대해 소개 글입니당 ㅎㅎ

회사에서 접속한 IP를 통해 어느 국가에서 접근 했는지 확인이 필요해서 알아보던중

한국인터넷진흥원(KISA)에서 국가별 ip 대역대 정보를 제공해주더군요!!
(https://후이즈검색.한국/kor/main.jsp)

IP를 가지고 국가를 확인하는 방법은
1. KISA에서 제공되는 국가별 IP대역대를 엑셀로 받고 DB에 넣어서 조인으로 어느 나라에서 접속했는지 확인하는 방법!(참고. 모든 국가별 ip대역대(v4)는 19만 로우 라능....)
2. KISA에서 제공되는 whois api 를 통해 어느나란지 주고 받는 방법!

요렇게 있습니다.

1번의 방법같은경우는 음.....속도면에서눈 api를 각각 유저별로 호출하는 것 보다는 빠르겟죠? 쿼리만 잘~짠다면....
하지만 새로 갱신되거나 추가되는 대역에 대해서 매번 확인하고 수동으로 DB에 넣어줘야하는 불편함?이있죠

2번의 방법의경우 제가 못찾은건지 아니면 정말 api가 이상한건지.....
api가 한번 호출로 한개의 ip밖에 확인을 못해주더군요
분명 리턴되는 데이터 타입은 json이나 xml로 받을수 있는데 한건 밖에 처리를 못한다니;;
예를 들어 열개의 ip주소의 국가를 확인할 때 ip별로 10번의 호출을 통해 10개ip의 국가정보를 확인 할 수 있습니다...
Json을 사용하는데 반만쓰는 느낌이 들죠 ㅋㅋㅋ


뭐 어찌됐든!! 1번은 whois에 들어가서 엑셀다운을 받으면 되니 패스
2번 whois의 api를 호출하고 응답값을 확인하는 방법을 알아볼게요.

기본적으로 api호출시 요청해야하는 파라미터입니다.

요청파라미터 예시
http://whois.kisa.or.kr/openapi/ipascc.jsp?query=202.30.50.0&key=발급받은KEY값&answer=json

(Whois에서 이용등록후 키를 발급받으면 메일로  키값을 받을수 있습니다)

저렇게 api를 호출하게되면 해당 ip에 대한 국가 정보를 응답 받을수 있습니다

{ "whois":{ "query":"202.30.50.0", "queryType":"IPv4", "registry":"KRNIC", "countryCode":"KR" } }

요렇게 응답을 받을수 있죠

Api를 호출해서 사용하면 우선 국가별 ip대역대를 관리하지않아도 되니 편리합니다.
하지만 대량의 ip를 조회하기에는 건별 호출이다보니 속도가 많이 느리겠죠...
나중에 고쳐지지 않을 까 싶습니다 ㅎㅎ

PHP를 이용해 테스트 소스를 작성해 봤습니다.

function fSearchCountryCode($ip) {
    $key = "------KEY파일-----------";
    $dataFormat = "json";
    $url ="http://whois.kisa.or.kr/openapi/ipascc.jsp?query=".$ip."&key=".$key."&answer=".$dataFormat."";

    $ch = curl_init();
    curl_setopt($ch,CURLOPT_URL,$url); curl_setopt($ch,CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch,CURLOPT_NOSIGNAL, 1);
    //curl_setopt($ch,CURLOPT_POST, 1); //Method를 POST로 지정.. 이 라인이 아예 없으면 GET

    $data = curl_exec($ch);
    $curl_errno = curl_errno($ch);
    $curl_error = curl_error($ch);

    curl_close($ch);
    $decodeJsonData = json_decode($data, true);
    return $decodeJsonData['whois']['countryCode'];
}

언어 별로 조금씩 다르지만 http api호출 방법은  보통 비슷하쥬 응용해서 사용하시길 바라며
이 게시글은 여기서 마무리 할게요 ㅋㅋㅋ


혹시 잘못된정보나 오타?..가 있으면 댓글을 통해 의견 부탁드려요.
반응형

+ Recent posts