KISA에서 제공하는 whois api에 이 기능이 있다.

Curl로 각 상황에 맞는 url에 신호를 보내면 요청한 방식데로 리턴값이 온다.
json으로 요청함
요청: http://whois.kisa.or.kr/openapi/ipascc.jsp?query=112.222.182.204&key={WHOIS OpenAPI 사용 Key}&answer=json
응답: {“whois”:{“query”:”112.222.182.204″,”queryType”:”IPv4″,”registry”:”KRNIC”,”countryCode”:”KR”}}
$ip_info->whois->countryCode 이런식으로 호출해야 국가코드를 볼 수 있다.
웹서핑해서 국가코드를 가져오고 https://ko.wikipedia.org/wiki/ISO_3166-1 이걸 배열로 만든다.
$contry = array(
array("name"=>"가나", "num"=>"288", "a3"=>"GHA", "a2"=>"GH"),
array("name"=>"가봉", "num"=>"266", "a3"=>"GAB", "a2"=>"GA"),
array("name"=>"가이아나", "num"=>"328", "a3"=>"GUY", "a2"=>"GY"),
array("name"=>"감비아", "num"=>"270", "a3"=>"GMB", "a2"=>"GM"),
array("name"=>"건지섬", "num"=>"831", "a3"=>"GGY", "a2"=>"GG"),
array("name"=>"과들루프", "num"=>"312", "a3"=>"GLP", "a2"=>"GP"),
array("name"=>"과테말라", "num"=>"320", "a3"=>"GTM", "a2"=>"GT"),
array("name"=>"괌", "num"=>"316", "a3"=>"GUM", "a2"=>"GU"),
array("name"=>"그레나다", "num"=>"308", "a3"=>"GRD", "a2"=>"GD"),
array("name"=>"그리스", "num"=>"300", "a3"=>"GRC", "a2"=>"GR"),
array("name"=>"그린란드", "num"=>"304", "a3"=>"GRL", "a2"=>"GL"),
array("name"=>"기니", "num"=>"324", "a3"=>"GIN", "a2"=>"GN"),
array("name"=>"기니비사우", "num"=>"624", "a3"=>"GNB", "a2"=>"GW"),
array("name"=>"나미비아", "num"=>"516", "a3"=>"NAM", "a2"=>"NA"),
array("name"=>"나우루", "num"=>"520", "a3"=>"NRU", "a2"=>"NR"),
array("name"=>"나이지리아", "num"=>"566", "a3"=>"NGA", "a2"=>"NG"),
array("name"=>"남극", "num"=>"010", "a3"=>"ATA", "a2"=>"AQ"),
array("name"=>"남수단", "num"=>"728", "a3"=>"SSD", "a2"=>"SS"),
array("name"=>"남아프리카 공화국", "num"=>"710", "a3"=>"ZAF", "a2"=>"ZA"),
array("name"=>"네덜란드", "num"=>"528", "a3"=>"NLD", "a2"=>"NL"),
array("name"=>"네덜란드령 안틸레스", "num"=>"530", "a3"=>"ANT", "a2"=>"AN"),
array("name"=>"네팔", "num"=>"524", "a3"=>"NPL", "a2"=>"NP"),
array("name"=>"노르웨이", "num"=>"578", "a3"=>"NOR", "a2"=>"NO"),
array("name"=>"노퍽섬", "num"=>"574", "a3"=>"NFK", "a2"=>"NF"),
array("name"=>"누벨칼레도니", "num"=>"540", "a3"=>"NCL", "a2"=>"NC"),
array("name"=>"뉴질랜드", "num"=>"554", "a3"=>"NZL", "a2"=>"NZ"),
array("name"=>"니우에", "num"=>"570", "a3"=>"NIU", "a2"=>"NU"),
array("name"=>"니제르", "num"=>"562", "a3"=>"NER", "a2"=>"NE"),
array("name"=>"니카라과", "num"=>"558", "a3"=>"NIC", "a2"=>"NI"),
array("name"=>"대한민국", "num"=>"410", "a3"=>"KOR", "a2"=>"KR"),
array("name"=>"덴마크", "num"=>"208", "a3"=>"DNK", "a2"=>"DK"),
array("name"=>"도미니카 공화국", "num"=>"214", "a3"=>"DOM", "a2"=>"DO"),
array("name"=>"도미니카 연방", "num"=>"212", "a3"=>"DMA", "a2"=>"DM"),
array("name"=>"독일", "num"=>"276", "a3"=>"DEU", "a2"=>"DE"),
array("name"=>"동티모르", "num"=>"626", "a3"=>"TLS", "a2"=>"TL"),
array("name"=>"라오스", "num"=>"418", "a3"=>"LAO", "a2"=>"LA"),
array("name"=>"라이베리아", "num"=>"430", "a3"=>"LBR", "a2"=>"LR"),
array("name"=>"라트비아", "num"=>"428", "a3"=>"LVA", "a2"=>"LV"),
array("name"=>"러시아", "num"=>"643", "a3"=>"RUS", "a2"=>"RU"),
array("name"=>"레바논", "num"=>"422", "a3"=>"LBN", "a2"=>"LB"),
array("name"=>"레소토", "num"=>"426", "a3"=>"LSO", "a2"=>"LS"),
array("name"=>"레위니옹", "num"=>"638", "a3"=>"REU", "a2"=>"RE"),
array("name"=>"루마니아", "num"=>"642", "a3"=>"ROU", "a2"=>"RO"),
array("name"=>"룩셈부르크", "num"=>"442", "a3"=>"LUX", "a2"=>"LU"),
array("name"=>"르완다", "num"=>"646", "a3"=>"RWA", "a2"=>"RW"),
array("name"=>"리비아", "num"=>"434", "a3"=>"LBY", "a2"=>"LY"),
array("name"=>"리투아니아", "num"=>"440", "a3"=>"LTU", "a2"=>"LT"),
array("name"=>"리히텐슈타인", "num"=>"438", "a3"=>"LIE", "a2"=>"LI"),
array("name"=>"마다가스카르", "num"=>"450", "a3"=>"MDG", "a2"=>"MG"),
array("name"=>"마르티니크", "num"=>"474", "a3"=>"MTQ", "a2"=>"MQ"),
array("name"=>"마셜 제도", "num"=>"584", "a3"=>"MHL", "a2"=>"MH"),
array("name"=>"마요트", "num"=>"175", "a3"=>"MYT", "a2"=>"YT"),
array("name"=>"마카오", "num"=>"446", "a3"=>"MAC", "a2"=>"MO"),
array("name"=>"북마케도니아", "num"=>"807", "a3"=>"MKD", "a2"=>"MK"),
array("name"=>"말라위", "num"=>"454", "a3"=>"MWI", "a2"=>"MW"),
array("name"=>"말레이시아", "num"=>"458", "a3"=>"MYS", "a2"=>"MY"),
array("name"=>"말리", "num"=>"466", "a3"=>"MLI", "a2"=>"ML"),
array("name"=>"맨섬", "num"=>"833", "a3"=>"IMN", "a2"=>"IM"),
array("name"=>"멕시코", "num"=>"484", "a3"=>"MEX", "a2"=>"MX"),
array("name"=>"모나코", "num"=>"492", "a3"=>"MCO", "a2"=>"MC"),
array("name"=>"모로코", "num"=>"504", "a3"=>"MAR", "a2"=>"MA"),
array("name"=>"모리셔스", "num"=>"480", "a3"=>"MUS", "a2"=>"MU"),
array("name"=>"모리타니", "num"=>"478", "a3"=>"MRT", "a2"=>"MR"),
array("name"=>"모잠비크", "num"=>"508", "a3"=>"MOZ", "a2"=>"MZ"),
array("name"=>"몬테네그로", "num"=>"499", "a3"=>"MNE", "a2"=>"ME"),
array("name"=>"몬트세랫", "num"=>"500", "a3"=>"MSR", "a2"=>"MS"),
array("name"=>"몰도바", "num"=>"498", "a3"=>"MDA", "a2"=>"MD"),
array("name"=>"몰디브", "num"=>"462", "a3"=>"MDV", "a2"=>"MV"),
array("name"=>"몰타", "num"=>"470", "a3"=>"MLT", "a2"=>"MT"),
array("name"=>"몽골", "num"=>"496", "a3"=>"MNG", "a2"=>"MN"),
array("name"=>"미국", "num"=>"840", "a3"=>"USA", "a2"=>"US"),
array("name"=>"미국령 군소 제도", "num"=>"581", "a3"=>"UMI", "a2"=>"UM"),
array("name"=>"미국령 버진아일랜드", "num"=>"850", "a3"=>"VIR", "a2"=>"VI"),
array("name"=>"미얀마", "num"=>"104", "a3"=>"MMR", "a2"=>"MM"),
array("name"=>"미크로네시아 연방", "num"=>"583", "a3"=>"FSM", "a2"=>"FM"),
array("name"=>"바누아투", "num"=>"548", "a3"=>"VUT", "a2"=>"VU"),
array("name"=>"바레인", "num"=>"048", "a3"=>"BHR", "a2"=>"BH"),
array("name"=>"바베이도스", "num"=>"052", "a3"=>"BRB", "a2"=>"BB"),
array("name"=>"바티칸 시국", "num"=>"336", "a3"=>"VAT", "a2"=>"VA"),
array("name"=>"바하마", "num"=>"044", "a3"=>"BHS", "a2"=>"BS"),
array("name"=>"방글라데시", "num"=>"050", "a3"=>"BGD", "a2"=>"BD"),
array("name"=>"버뮤다", "num"=>"060", "a3"=>"BMU", "a2"=>"BM"),
array("name"=>"베냉", "num"=>"204", "a3"=>"BEN", "a2"=>"BJ"),
array("name"=>"베네수엘라", "num"=>"862", "a3"=>"VEN", "a2"=>"VE"),
array("name"=>"베트남", "num"=>"704", "a3"=>"VNM", "a2"=>"VN"),
array("name"=>"벨기에", "num"=>"056", "a3"=>"BEL", "a2"=>"BE"),
array("name"=>"벨라루스", "num"=>"112", "a3"=>"BLR", "a2"=>"BY"),
array("name"=>"벨리즈", "num"=>"084", "a3"=>"BLZ", "a2"=>"BZ"),
array("name"=>"보스니아 헤르체고비나", "num"=>"070", "a3"=>"BIH", "a2"=>"BA"),
array("name"=>"보츠와나", "num"=>"072", "a3"=>"BWA", "a2"=>"BW"),
array("name"=>"볼리비아", "num"=>"068", "a3"=>"BOL", "a2"=>"BO"),
array("name"=>"부룬디", "num"=>"108", "a3"=>"BDI", "a2"=>"BI"),
array("name"=>"부르키나파소", "num"=>"854", "a3"=>"BFA", "a2"=>"BF"),
array("name"=>"부베섬", "num"=>"074", "a3"=>"BVT", "a2"=>"BV"),
array("name"=>"부탄", "num"=>"064", "a3"=>"BTN", "a2"=>"BT"),
array("name"=>"북마리아나 제도", "num"=>"580", "a3"=>"MNP", "a2"=>"MP"),
array("name"=>"불가리아", "num"=>"100", "a3"=>"BGR", "a2"=>"BG"),
array("name"=>"브라질", "num"=>"076", "a3"=>"BRA", "a2"=>"BR"),
array("name"=>"브루나이", "num"=>"096", "a3"=>"BRN", "a2"=>"BN"),
array("name"=>"사모아", "num"=>"882", "a3"=>"WSM", "a2"=>"WS"),
array("name"=>"사우디아라비아", "num"=>"682", "a3"=>"SAU", "a2"=>"SA"),
array("name"=>"사우스조지아 사우스샌드위치 제도", "num"=>"239", "a3"=>"SGS", "a2"=>"GS"),
array("name"=>"산마리노", "num"=>"674", "a3"=>"SMR", "a2"=>"SM"),
array("name"=>"상투메 프린시페", "num"=>"678", "a3"=>"STP", "a2"=>"ST"),
array("name"=>"생피에르 미클롱", "num"=>"666", "a3"=>"SPM", "a2"=>"PM"),
array("name"=>"서사하라", "num"=>"732", "a3"=>"ESH", "a2"=>"EH"),
array("name"=>"세네갈", "num"=>"686", "a3"=>"SEN", "a2"=>"SN"),
array("name"=>"세르비아", "num"=>"688", "a3"=>"SRB", "a2"=>"RS"),
array("name"=>"세이셸", "num"=>"690", "a3"=>"SYC", "a2"=>"SC"),
array("name"=>"세인트루시아", "num"=>"662", "a3"=>"LCA", "a2"=>"LC"),
array("name"=>"세인트빈센트 그레나딘", "num"=>"670", "a3"=>"VCT", "a2"=>"VC"),
array("name"=>"세인트키츠 네비스", "num"=>"659", "a3"=>"KNA", "a2"=>"KN"),
array("name"=>"세인트헬레나", "num"=>"654", "a3"=>"SHN", "a2"=>"SH"),
array("name"=>"소말리아", "num"=>"706", "a3"=>"SOM", "a2"=>"SO"),
array("name"=>"솔로몬 제도", "num"=>"090", "a3"=>"SLB", "a2"=>"SB"),
array("name"=>"수단", "num"=>"729", "a3"=>"SDN", "a2"=>"SD"),
array("name"=>"수리남", "num"=>"740", "a3"=>"SUR", "a2"=>"SR"),
array("name"=>"스리랑카", "num"=>"144", "a3"=>"LKA", "a2"=>"LK"),
array("name"=>"스발바르 얀마옌", "num"=>"744", "a3"=>"SJM", "a2"=>"SJ"),
array("name"=>"스웨덴", "num"=>"752", "a3"=>"SWE", "a2"=>"SE"),
array("name"=>"스위스", "num"=>"756", "a3"=>"CHE", "a2"=>"CH"),
array("name"=>"스페인", "num"=>"724", "a3"=>"ESP", "a2"=>"ES"),
array("name"=>"슬로바키아", "num"=>"703", "a3"=>"SVK", "a2"=>"SK"),
array("name"=>"슬로베니아", "num"=>"705", "a3"=>"SVN", "a2"=>"SI"),
array("name"=>"시리아", "num"=>"760", "a3"=>"SYR", "a2"=>"SY"),
array("name"=>"시에라리온", "num"=>"694", "a3"=>"SLE", "a2"=>"SL"),
array("name"=>"신트마르턴", "num"=>"534", "a3"=>"SXM", "a2"=>"SX"),
array("name"=>"싱가포르", "num"=>"702", "a3"=>"SGP", "a2"=>"SG"),
array("name"=>"아랍에미리트", "num"=>"784", "a3"=>"ARE", "a2"=>"AE"),
array("name"=>"아루바", "num"=>"533", "a3"=>"ABW", "a2"=>"AW"),
array("name"=>"아르메니아", "num"=>"051", "a3"=>"ARM", "a2"=>"AM"),
array("name"=>"아르헨티나", "num"=>"032", "a3"=>"ARG", "a2"=>"AR"),
array("name"=>"아메리칸사모아", "num"=>"016", "a3"=>"ASM", "a2"=>"AS"),
array("name"=>"아이슬란드", "num"=>"352", "a3"=>"ISL", "a2"=>"IS"),
array("name"=>"아이티", "num"=>"332", "a3"=>"HTI", "a2"=>"HT"),
array("name"=>"아일랜드", "num"=>"372", "a3"=>"IRL", "a2"=>"IE"),
array("name"=>"아제르바이잔", "num"=>"031", "a3"=>"AZE", "a2"=>"AZ"),
array("name"=>"아프가니스탄", "num"=>"004", "a3"=>"AFG", "a2"=>"AF"),
array("name"=>"안도라", "num"=>"020", "a3"=>"AND", "a2"=>"AD"),
array("name"=>"알바니아", "num"=>"008", "a3"=>"ALB", "a2"=>"AL"),
array("name"=>"알제리", "num"=>"012", "a3"=>"DZA", "a2"=>"DZ"),
array("name"=>"앙골라", "num"=>"024", "a3"=>"AGO", "a2"=>"AO"),
array("name"=>"앤티가 바부다", "num"=>"028", "a3"=>"ATG", "a2"=>"AG"),
array("name"=>"앵귈라", "num"=>"660", "a3"=>"AIA", "a2"=>"AI"),
array("name"=>"에리트레아", "num"=>"232", "a3"=>"ERI", "a2"=>"ER"),
array("name"=>"에스와티니", "num"=>"748", "a3"=>"SWZ", "a2"=>"SZ"),
array("name"=>"에스토니아", "num"=>"233", "a3"=>"EST", "a2"=>"EE"),
array("name"=>"에콰도르", "num"=>"218", "a3"=>"ECU", "a2"=>"EC"),
array("name"=>"에티오피아", "num"=>"231", "a3"=>"ETH", "a2"=>"ET"),
array("name"=>"엘살바도르", "num"=>"222", "a3"=>"SLV", "a2"=>"SV"),
array("name"=>"영국", "num"=>"826", "a3"=>"GBR", "a2"=>"GB"),
array("name"=>"영국령 버진아일랜드", "num"=>"092", "a3"=>"VGB", "a2"=>"VG"),
array("name"=>"영국령 인도양 지역", "num"=>"086", "a3"=>"IOT", "a2"=>"IO"),
array("name"=>"예멘", "num"=>"887", "a3"=>"YEM", "a2"=>"YE"),
array("name"=>"오만", "num"=>"512", "a3"=>"OMN", "a2"=>"OM"),
array("name"=>"오스트레일리아", "num"=>"036", "a3"=>"AUS", "a2"=>"AU"),
array("name"=>"오스트리아", "num"=>"040", "a3"=>"AUT", "a2"=>"AT"),
array("name"=>"온두라스", "num"=>"340", "a3"=>"HND", "a2"=>"HN"),
array("name"=>"올란드 제도", "num"=>"248", "a3"=>"ALA", "a2"=>"AX"),
array("name"=>"요르단", "num"=>"400", "a3"=>"JOR", "a2"=>"JO"),
array("name"=>"우간다", "num"=>"800", "a3"=>"UGA", "a2"=>"UG"),
array("name"=>"우루과이", "num"=>"858", "a3"=>"URY", "a2"=>"UY"),
array("name"=>"우즈베키스탄", "num"=>"860", "a3"=>"UZB", "a2"=>"UZ"),
array("name"=>"우크라이나", "num"=>"804", "a3"=>"UKR", "a2"=>"UA"),
array("name"=>"왈리스 푸투나", "num"=>"876", "a3"=>"WLF", "a2"=>"WF"),
array("name"=>"이라크", "num"=>"368", "a3"=>"IRQ", "a2"=>"IQ"),
array("name"=>"이란", "num"=>"364", "a3"=>"IRN", "a2"=>"IR"),
array("name"=>"이스라엘", "num"=>"376", "a3"=>"ISR", "a2"=>"IL"),
array("name"=>"이집트", "num"=>"818", "a3"=>"EGY", "a2"=>"EG"),
array("name"=>"이탈리아", "num"=>"380", "a3"=>"ITA", "a2"=>"IT"),
array("name"=>"인도", "num"=>"356", "a3"=>"IND", "a2"=>"IN"),
array("name"=>"인도네시아", "num"=>"360", "a3"=>"IDN", "a2"=>"ID"),
array("name"=>"일본", "num"=>"392", "a3"=>"JPN", "a2"=>"JP"),
array("name"=>"자메이카", "num"=>"388", "a3"=>"JAM", "a2"=>"JM"),
array("name"=>"잠비아", "num"=>"894", "a3"=>"ZMB", "a2"=>"ZM"),
array("name"=>"저지섬", "num"=>"832", "a3"=>"JEY", "a2"=>"JE"),
array("name"=>"적도 기니", "num"=>"226", "a3"=>"GNQ", "a2"=>"GQ"),
array("name"=>"조선민주주의인민공화국", "num"=>"408", "a3"=>"PRK", "a2"=>"KP"),
array("name"=>"조지아", "num"=>"268", "a3"=>"GEO", "a2"=>"GE"),
array("name"=>"중국", "num"=>"156", "a3"=>"CHN", "a2"=>"CN"),
array("name"=>"중앙아프리카 공화국", "num"=>"140", "a3"=>"CAF", "a2"=>"CF"),
array("name"=>"지부티", "num"=>"262", "a3"=>"DJI", "a2"=>"DJ"),
array("name"=>"지브롤터", "num"=>"292", "a3"=>"GIB", "a2"=>"GI"),
array("name"=>"짐바브웨", "num"=>"716", "a3"=>"ZWE", "a2"=>"ZW"),
array("name"=>"차드", "num"=>"148", "a3"=>"TCD", "a2"=>"TD"),
array("name"=>"체코", "num"=>"203", "a3"=>"CZE", "a2"=>"CZ"),
array("name"=>"칠레", "num"=>"152", "a3"=>"CHL", "a2"=>"CL"),
array("name"=>"카메룬", "num"=>"120", "a3"=>"CMR", "a2"=>"CM"),
array("name"=>"카보베르데", "num"=>"132", "a3"=>"CPV", "a2"=>"CV"),
array("name"=>"카자흐스탄", "num"=>"398", "a3"=>"KAZ", "a2"=>"KZ"),
array("name"=>"카타르", "num"=>"634", "a3"=>"QAT", "a2"=>"QA"),
array("name"=>"캄보디아", "num"=>"116", "a3"=>"KHM", "a2"=>"KH"),
array("name"=>"캐나다", "num"=>"124", "a3"=>"CAN", "a2"=>"CA"),
array("name"=>"케냐", "num"=>"404", "a3"=>"KEN", "a2"=>"KE"),
array("name"=>"케이맨 제도", "num"=>"136", "a3"=>"CYM", "a2"=>"KY"),
array("name"=>"코모로", "num"=>"174", "a3"=>"COM", "a2"=>"KM"),
array("name"=>"코스타리카", "num"=>"188", "a3"=>"CRI", "a2"=>"CR"),
array("name"=>"코코스 제도", "num"=>"166", "a3"=>"CCK", "a2"=>"CC"),
array("name"=>"코트디부아르", "num"=>"384", "a3"=>"CIV", "a2"=>"CI"),
array("name"=>"콜롬비아", "num"=>"170", "a3"=>"COL", "a2"=>"CO"),
array("name"=>"콩고 공화국", "num"=>"178", "a3"=>"COG", "a2"=>"CG"),
array("name"=>"콩고 민주 공화국", "num"=>"180", "a3"=>"COD", "a2"=>"CD"),
array("name"=>"쿠바", "num"=>"192", "a3"=>"CUB", "a2"=>"CU"),
array("name"=>"쿠웨이트", "num"=>"414", "a3"=>"KWT", "a2"=>"KW"),
array("name"=>"쿡 제도", "num"=>"184", "a3"=>"COK", "a2"=>"CK"),
array("name"=>"크로아티아", "num"=>"191", "a3"=>"HRV", "a2"=>"HR"),
array("name"=>"크리스마스섬", "num"=>"162", "a3"=>"CXR", "a2"=>"CX"),
array("name"=>"키르기스스탄", "num"=>"417", "a3"=>"KGZ", "a2"=>"KG"),
array("name"=>"키리바시", "num"=>"296", "a3"=>"KIR", "a2"=>"KI"),
array("name"=>"키프로스", "num"=>"196", "a3"=>"CYP", "a2"=>"CY"),
array("name"=>"타이완", "num"=>"158", "a3"=>"TWN", "a2"=>"TW"),
array("name"=>"타지키스탄", "num"=>"762", "a3"=>"TJK", "a2"=>"TJ"),
array("name"=>"탄자니아", "num"=>"834", "a3"=>"TZA", "a2"=>"TZ"),
array("name"=>"태국", "num"=>"764", "a3"=>"THA", "a2"=>"TH"),
array("name"=>"터크스 케이커스 제도", "num"=>"796", "a3"=>"TCA", "a2"=>"TC"),
array("name"=>"터키", "num"=>"792", "a3"=>"TUR", "a2"=>"TR"),
array("name"=>"토고", "num"=>"768", "a3"=>"TGO", "a2"=>"TG"),
array("name"=>"토켈라우", "num"=>"772", "a3"=>"TKL", "a2"=>"TK"),
array("name"=>"통가", "num"=>"776", "a3"=>"TON", "a2"=>"TO"),
array("name"=>"투르크메니스탄", "num"=>"795", "a3"=>"TKM", "a2"=>"TM"),
array("name"=>"투발루", "num"=>"798", "a3"=>"TUV", "a2"=>"TV"),
array("name"=>"튀니지", "num"=>"788", "a3"=>"TUN", "a2"=>"TN"),
array("name"=>"트리니다드 토바고", "num"=>"780", "a3"=>"TTO", "a2"=>"TT"),
array("name"=>"파나마", "num"=>"591", "a3"=>"PAN", "a2"=>"PA"),
array("name"=>"파라과이", "num"=>"600", "a3"=>"PRY", "a2"=>"PY"),
array("name"=>"파키스탄", "num"=>"586", "a3"=>"PAK", "a2"=>"PK"),
array("name"=>"파푸아뉴기니", "num"=>"598", "a3"=>"PNG", "a2"=>"PG"),
array("name"=>"팔라우", "num"=>"585", "a3"=>"PLW", "a2"=>"PW"),
array("name"=>"팔레스타인", "num"=>"275", "a3"=>"PSE", "a2"=>"PS"),
array("name"=>"페로 제도", "num"=>"234", "a3"=>"FRO", "a2"=>"FO"),
array("name"=>"페루", "num"=>"604", "a3"=>"PER", "a2"=>"PE"),
array("name"=>"포르투갈", "num"=>"620", "a3"=>"PRT", "a2"=>"PT"),
array("name"=>"포클랜드 제도", "num"=>"238", "a3"=>"FLK", "a2"=>"FK"),
array("name"=>"폴란드", "num"=>"616", "a3"=>"POL", "a2"=>"PL"),
array("name"=>"푸에르토리코", "num"=>"630", "a3"=>"PRI", "a2"=>"PR"),
array("name"=>"프랑스", "num"=>"250", "a3"=>"FRA", "a2"=>"FR"),
array("name"=>"프랑스령 기아나", "num"=>"254", "a3"=>"GUF", "a2"=>"GF"),
array("name"=>"프랑스령 남방 및 남극 지역", "num"=>"260", "a3"=>"ATF", "a2"=>"TF"),
array("name"=>"프랑스령 폴리네시아", "num"=>"258", "a3"=>"PYF", "a2"=>"PF"),
array("name"=>"피지", "num"=>"242", "a3"=>"FJI", "a2"=>"FJ"),
array("name"=>"핀란드", "num"=>"246", "a3"=>"FIN", "a2"=>"FI"),
array("name"=>"필리핀", "num"=>"608", "a3"=>"PHL", "a2"=>"PH"),
array("name"=>"핏케언 제도", "num"=>"612", "a3"=>"PCN", "a2"=>"PN"),
array("name"=>"허드 맥도널드 제도", "num"=>"334", "a3"=>"HMD", "a2"=>"HM"),
array("name"=>"헝가리", "num"=>"348", "a3"=>"HUN", "a2"=>"HU"),
array("name"=>"홍콩", "num"=>"344", "a3"=>"HKG", "a2"=>"HK")
);
함수 하나 만들어서 국가코드 2자리를 한글 국가면으로 바꿔주도록 한다.
function getCountryName($field, $value)
{
global $contry;
foreach ($contry as $key => $item) {
if($item[$field] === $value)
{
return $contry[$key]["name"];
}
}
return false;
}
$country_name = getCountryName("a2", $ip_info->whois->countryCode);
IP 주소만으로 국가를 알 수 있을까?
IP 주소는 인터넷에 연결된 장치에 부여되는 고유한 주소입니다.
예를 들어 다음과 같은 형태입니다.
112.175.85.238
8.8.8.8
1.1.1.1
각 IP 대역은 인터넷 관리 기관에 의해 국가별로 할당됩니다.
따라서 IP 주소를 조회하면 다음과 같은 정보를 확인할 수 있습니다.
- 국가
- 도시
- ISP(통신사)
- ASN 정보
- 위도/경도(대략적)
하지만 개인이 IP만 보고 국가를 직접 판별하기는 어렵기 때문에 GeoIP 데이터베이스를 사용해야 합니다.
왜 국가 확인이 필요한가?
웹사이트 운영 시 다음과 같은 상황에서 자주 사용됩니다.
해외 스팸 가입 차단
회원가입 스팸의 상당수가 해외 서버를 통해 발생합니다.
특정 국가에서만 서비스한다면 해외 IP를 차단하여 불필요한 가입을 줄일 수 있습니다.
관리자 로그인 보호
관리자 페이지는 국내에서만 접속하도록 제한하는 경우가 많습니다.
if ($country !== 'KR') {
exit('접근이 제한되었습니다.');
}
방문자 통계 분석
국가별 방문자 비율을 확인하면 마케팅 방향을 결정하는 데 도움이 됩니다.
예시
- 한국 92%
- 미국 4%
- 일본 2%
- 기타 2%
실제 운영 경험
예전에 운영하던 사이트에서 하루 수백 건의 스팸 가입이 발생한 적이 있었습니다.
로그를 분석해 보니 대부분 해외 데이터센터 IP였습니다.
처음에는 차단 IP를 하나씩 등록했지만 효과가 크지 않았습니다.
결국 GeoIP 기반으로 해외 국가를 제한하자 스팸 가입이 눈에 띄게 감소했습니다.
물론 VPN을 사용하는 사용자는 우회가 가능하지만 일반적인 자동화 공격은 상당 부분 줄일 수 있었습니다.
IP 국가 조회 시 주의할 점
IP 기반 국가 정보는 100% 정확하지 않습니다.
다음과 같은 경우 오차가 발생할 수 있습니다.
- VPN 사용
- 프록시 서버 사용
- 클라우드 서버 접속
- 모바일 통신망 사용
따라서 보안 정책을 만들 때는 국가 정보만으로 판단하지 말고 추가 인증 수단도 함께 사용하는 것이 좋습니다.
마무리
IP로 국가 알아내기 기능은 웹사이트 보안과 운영에 매우 유용합니다.
간단한 조회는 온라인 서비스를 이용하면 되고, 실제 서비스에서는 GeoIP 데이터베이스를 활용하는 것이 효율적입니다.
특히 회원가입, 로그인, 게시판 스팸 차단 기능을 개발할 때 국가 정보를 함께 저장해 두면 로그 분석과 보안 관리에 큰 도움이 됩니다.