- “IP 인텔리전스의 모든 것: IPinfo 제품군 완전 정복 가이드 (2025)”
- “IP 기반 위협 탐지와 정책 필터링을 위한 실전 IPinfo 사용법”
- “IPinfo Core·Plus·ResProxy 완전 비교: 어떤 데이터를 어디에 써야 할까?”
- “단순 위치 조회를 넘어: IPinfo로 실현하는 360도 IP 인텔리전스 전략”
IPinfo는 단순 IP 위치 조회를 넘어서 보안 탐지, 자동화, 분석, 위치 기반 서비스 최적화를 위한 고품질 IP 인텔리전스 플랫폼입니다.
IPinfo 주요 제품군 구성
제품군 | 요약 | 주요 특징 |
---|---|---|
🧊 IPinfo Lite | 무료 기본 API | 무제한 사용, 국가/도시/ASN 정보 제공 |
🍳 IPinfo Core | 경량 구조화 데이터 | 16개 필드: 위치, 연결, 프라이버시, ASN |
🚀 IPinfo Plus | 고급 IP 인텔리전스 | 32개 필드: 정확도 반경, VPN 제공자, 네트워크 변경 시점, Carrier |
🔍 ResProxy API | 레지던셜 프록시 탐지 | 프록시 유형 + 공급자 + 활동 메트릭 |
🧰 IPinfo CLI | 명령줄 도구 | IP 조회 자동화, 요약, CIDR 변환 등 |
☁️ Cloud Data Push | 데이터 전송 자동화 | S3, GCS, Azure로 주기적 Export |
🛰 ProbeNet | IP 정확도 인프라 | 전 세계 1000여 개 PoP 기반 측정망 |
주요 데이터 필드 비교
항목 | Lite | Core | Plus |
---|---|---|---|
국가/도시/위도경도 | ✅ | ✅ | ✅ |
ASN, 조직 정보 | ✅ | ✅ (도메인/유형 포함) | ✅ (변경 시점 포함) |
프라이버시 탐지 | ❌ | ✅ (플래그) | ✅ (VPN 이름까지) |
정확도 반경 (km) | ❌ | ❌ | ✅ |
레지던셜 프록시 여부 | ❌ | ❌ | ✅ (ResProxy API 연동 시) |
모바일 통신사 (MCC/MNC) | ❌ | ❌ | ✅ |
호스팅/위성/Anycast 여부 | ❌ | ✅ | ✅ |
통합 및 제공 방식
방식 | 설명 | 지원 제품군 |
---|---|---|
REST API | 단일/대량 IP 요청 처리 | 모든 제품군 |
CLI 도구 | IP 조회 자동화 및 필터링 | Core, Plus, Lite |
일일 다운로드 (CSV, JSON 등) | 배치 처리 및 데이터 웨어하우스 연동 | Core, Plus |
GCS / Azure / S3 Export | ETL 파이프라인 자동화 | Core, Plus |
Snowflake 연동 | SQL 기반 고급 분석 | Plus |
Docker / Go 설치 | DevOps 자동화에 적합 | CLI |
보안 및 위협 탐지 실무 활용 사례
시나리오 | 적용 방법 | 제품군 |
---|---|---|
VPN 사용자 탐지 | privacy.name 또는 is_anonymous |
Plus, Core |
레지던셜 프록시 탐지 | resproxy.provider , type=residential |
ResProxy API |
위치 위장 탐지 | accuracy_radius_km , geo_last_changed |
Plus |
포트 스캔 탐지 | tags.portscan == true |
Plus (추가 옵션) |
위성/Anycast 망 탐지 | is_satellite , is_anycast |
Core, Plus |
허용 국가/도시 설정 | country , city 기반 정책 필터링 |
Lite 이상 |
SIEM 연동 | Wazuh/Elastic/Splunk 로그 연계 | Core, Plus |
VPN 공급자 차단 | privacy.name 필터링 기반 룰 생성 |
Plus |
데이터 분석 및 자동화 활용
업무 | 활용 예시 | 추천 제품군 |
---|---|---|
사용자 통계 | ASN별 사용자 수, 국가별 접속 분포 | Lite, Core |
모바일 사용자 분류 | is_mobile , Carrier 필드 |
Plus |
봇/스크래퍼 탐지 | is_hosting , hostname |
Core, Plus |
웹 UX 최적화 | 위치 기반 언어/시간대 적용 | Core |
Fraud 시그널 강화 | VPN + Residential Proxy + ASN 분석 | Plus + ResProxy |
대량 IP 요약 | ipinfo summarize CLI 사용 |
CLI |
CIDR 변환/정렬 | cidr2range , matchip |
CLI |
출력 포맷 및 도구 연동
포맷 | 설명 | 활용 시스템 예시 |
---|---|---|
.json , .csv |
API 응답/배치 수집 | Python, n8n, Elastic |
.parquet , .mmdb |
빅데이터, Geo DB | Hive, Spark, Clickhouse |
IPinfo CLI | 쉘 자동화 | Bash, PowerShell |
Webhooks | SIEM/EDR 연동 | Wazuh, TheHive |
IPinfo CLI 실전 명령어 예시
ipinfo 8.8.8.8 # 단일 IP 정보
cat ips.txt | ipinfo -c # 대량 IP CSV 출력
cat logs.txt | grepip | ipinfo -f org # 로그에서 IP 추출 후 ASN 정보 필터링
ipinfo summarize < ip_list.txt # 요약 분석
요금제/선택 기준
용도 | 추천 플랜 |
---|---|
기본 위치/ASN만 필요한 경우 | 🧊 IPinfo Lite |
실시간 서비스에서 보안 필터가 필요한 경우 | 🍳 IPinfo Core |
정교한 리스크 탐지와 자동화가 필요한 경우 | 🚀 IPinfo Plus |
프록시 기반 위협 방어가 중요한 경우 | 🔍 ResProxy API |
CLI 기반 자동화, 파이프라인 활용 | 🧰 IPinfo CLI |
IPinfo는 단순한 위치 API를 넘어선 IP 기반 위협 탐지, 고객 분석, 정책 통제, 자동화 처리를 위한 IP 인텔리전스 플랫폼입니다.
보안, 네트워크, 분석 환경에서 IPinfo를 활용하면 다음과 같은 효과를 기대할 수 있습니다.
✅ 사전 위협 차단 (VPN/Proxy/Portscan)
✅ 접속지 기반 정책 적용 (위치 반경, ASN 조직 유형)
✅ 모바일/호스팅/위성 연결 구분
✅ 다양한 형식으로 API + CLI + 파일 기반 통합 가능
이처럼, IPinfo는 단순한 IP 지리정보 서비스를 넘어, 360도 IP 인텔리전스를 제공하는 종합 플랫폼입니다.
주요 차별화 포인트
- ✅ 정확도: 자체 ProbeNet 인프라 기반 실시간 측정
- ✅ 신뢰성: 일일 업데이트, 99.9% 가동률
- ✅ 확장성: 무제한 API 호출부터 엔터프라이즈 솔루션까지
- ✅ 통합성: 다양한 포맷과 플랫폼 지원
글로벌 인프라: ProbeNet
- 1,046개 글로벌 PoPs (Point of Presence)
- 127개국, 415개 도시 커버리지
- 월간 52억 건 이상의 네트워크 측정
- 전체 ASN의 44%를 1ms 내에서 커버
제품 라인업 상세 분석
제품별 기능 매트릭스
기능 카테고리 | IPinfo Lite | IPinfo Core | IPinfo Plus | 추가 API |
---|---|---|---|---|
기본 위치 정보 | ✅ | ✅ | ✅ | - |
ASN 정보 | ✅ 기본 | ✅ 상세 | ✅ 완전 | ✅ |
프라이버시 탐지 | ❌ | ✅ 플래그 | ✅ 제공자명 | ✅ |
정확도 반경 | ❌ | ❌ | ✅ | - |
변경 추적 | ❌ | ❌ | ✅ | - |
네트워크 유형 | ❌ | ✅ | ✅ | - |
모바일 통신사 | ❌ | ❌ | ✅ | ✅ |
포트스캔 탐지 | ❌ | ❌ | ✅ | ✅ |
필드 수 | 7개 | 16개 | 32개+ | 가변 |
가격 | 무료 | 유료 | 프리미엄 | 추가 과금 |
각 제품 상세 분석
1️⃣ IPinfo Lite (무료)
{
"ip": "8.8.8.8",
"hostname": "dns.google",
"city": "Mountain View",
"region": "California",
"country": "US",
"loc": "37.3860,-122.0840",
"org": "AS15169 Google LLC"
}
적합한 사용 사례
- 개발 환경 테스트
- 기본적인 지역 기반 콘텐츠 제공
- 간단한 통계 수집
2️⃣ IPinfo Core (중급)
{
"ip": "8.8.8.8",
"city": "Mountain View",
"region": "California",
"country": "US",
"postal": "94043",
"timezone": "America/Los_Angeles",
"latitude": 37.4056,
"longitude": -122.0775,
"privacy": {
"is_anonymous": false,
"is_hosting": false
},
"is_mobile": false,
"is_satellite": false,
"is_anycast": true,
"asn": {
"asn": "AS15169",
"name": "Google LLC",
"org_type": "Business",
"domain": "google.com",
"route": "8.8.8.0/24"
}
}
적합한 사용 사례
- 프로덕션 환경 기본 보안
- 사용자 경험 최적화
- 기본적인 사기 방지
3️⃣ IPinfo Plus (프리미엄)
{
"ip": "203.0.113.5",
"privacy": {
"vpn": true,
"proxy": false,
"tor": false,
"relay": false,
"name": "Cisco AnyConnect"
},
"location": {
"latitude": 37.7749,
"longitude": -122.4194,
"accuracy_radius_km": 3,
"geo_last_changed": "2025-07-30T04:20:33Z"
},
"asn": {
"asn": "AS7018",
"name": "ATT Services Inc.",
"asn_last_changed": "2025-05-12T10:13:01Z"
},
"hostname": "vpn-203-0-113-5.cisco.com",
"carrier": {
"name": "AT&T Wireless",
"mcc": "310",
"mnc": "410"
},
"network": {
"is_hosting": false,
"is_satellite": false,
"is_anycast": false
}
}
적합한 사용 사례
- 고급 보안 위협 탐지
- 정밀한 사기 방지 시스템
- 규제 준수 및 컴플라이언스
핵심 API 및 기능별 상세 설명
보안 관련 API
1. Residential Proxy Detection API
import requests
response = requests.get(
"https://api.ipinfo.io/respproxy/8.8.8.8",
headers={"Authorization": f"Bearer {token}"}
)
# 응답 예시
{
"residential_proxy": true,
"provider": "Luminati",
"risk_score": 85,
"activity_metrics": {
"frequency": "high",
"pattern": "rotating"
}
}
실제 적용 사례
def check_residential_proxy(ip_address):
"""레지던셜 프록시 검사 및 대응"""
result = ipinfo.get_residential_proxy(ip_address)
if result['residential_proxy']:
if result['risk_score'] > 70:
# 높은 위험도: 즉시 차단
block_ip(ip_address)
log_security_event("HIGH_RISK_PROXY", ip_address)
else:
# 중간 위험도: 추가 인증 요구
require_2fa(ip_address)
return result
2. Portscan Detection
# 포트스캔 탐지 통합 예시
def security_check(ip):
data = ipinfo.getDetails(ip)
if 'portscan' in data.get('tags', []):
# 포트스캔 활동 감지
if data.get('privacy', {}).get('vpn'):
# VPN + 포트스캔 = 매우 의심스러운 활동
threat_level = "CRITICAL"
immediate_block(ip)
else:
threat_level = "HIGH"
monitor_closely(ip)
분석 관련 API
1. ASN 상세 정보
# ASN 기반 트래픽 분석
def analyze_traffic_by_asn(ip_list):
asn_stats = {}
for ip in ip_list:
info = ipinfo.getDetails(ip)
asn = info.get('asn', {})
asn_key = f"{asn.get('asn')} - {asn.get('name')}"
org_type = asn.get('org_type', 'unknown')
if asn_key not in asn_stats:
asn_stats[asn_key] = {
'count': 0,
'org_type': org_type,
'ips': []
}
asn_stats[asn_key]['count'] += 1
asn_stats[asn_key]['ips'].append(ip)
return asn_stats
2. 위치 정확도 기반 신뢰도 평가
def evaluate_location_trust(ip_data):
"""위치 정확도를 기반으로 신뢰도 점수 계산"""
accuracy_radius = ip_data.get('location', {}).get('accuracy_radius_km', 999)
if accuracy_radius <= 1:
trust_score = 95 # 매우 정확
elif accuracy_radius <= 5:
trust_score = 80 # 정확
elif accuracy_radius <= 20:
trust_score = 60 # 보통
elif accuracy_radius <= 50:
trust_score = 40 # 부정확
else:
trust_score = 20 # 매우 부정확
# 추가 요소 고려
if ip_data.get('privacy', {}).get('vpn'):
trust_score -= 30
if ip_data.get('is_hosting'):
trust_score -= 20
return max(0, trust_score)
네트워크 인텔리전스 API
1. Hosted Domains 조회
# 단일 IP에서 호스팅되는 도메인 분석
def investigate_shared_hosting(ip):
domains = ipinfo.get_hosted_domains(ip)
risk_indicators = {
'phishing_keywords': ['secure', 'bank', 'paypal', 'amazon'],
'suspicious_tlds': ['.tk', '.ml', '.ga'],
'excessive_domains': len(domains) > 100
}
risks = []
for domain in domains:
for keyword in risk_indicators['phishing_keywords']:
if keyword in domain.lower():
risks.append(f"Phishing keyword in {domain}")
for tld in risk_indicators['suspicious_tlds']:
if domain.endswith(tld):
risks.append(f"Suspicious TLD: {domain}")
return {
'total_domains': len(domains),
'risks_found': risks,
'risk_level': 'HIGH' if risks else 'LOW'
}
데이터 제공 방식 및 통합 옵션
데이터 수신 방식
1. REST API (실시간)
# 기본 API 호출
import requests
class IPInfoClient:
def __init__(self, token):
self.token = token
self.base_url = "https://api.ipinfo.io"
def get_ip_details(self, ip, fields=None):
url = f"{self.base_url}/{ip}"
if fields:
url += f"?fields={','.join(fields)}"
headers = {"Authorization": f"Bearer {self.token}"}
return requests.get(url, headers=headers).json()
2. 일일 다운로드 데이터베이스
# 자동화된 데이터베이스 다운로드 및 업데이트
import schedule
import wget
import gzip
import json
def download_daily_database():
"""매일 새벽 2시에 최신 DB 다운로드"""
url = "https://ipinfo.io/data/free/country.json.gz"
# 다운로드
wget.download(url, out="ipinfo_db.json.gz")
# 압축 해제 및 로드
with gzip.open("ipinfo_db.json.gz", 'rb') as f:
ip_database = json.load(f)
# 로컬 DB 업데이트
update_local_database(ip_database)
schedule.every().day.at("02:00").do(download_daily_database)
3. Cloud Storage Push (GCS/Azure/S3)
# GCP Cloud Function 예시
import functions_framework
from google.cloud import storage
import pandas as pd
@functions_framework.http
def process_ipinfo_data(request):
"""GCS에 푸시된 IPinfo 데이터 자동 처리"""
# GCS에서 최신 데이터 읽기
client = storage.Client()
bucket = client.bucket('ipinfo-data')
blob = bucket.blob('latest/ipinfo-plus.parquet')
# Parquet 파일을 DataFrame으로 로드
df = pd.read_parquet(f"gs://ipinfo-data/latest/ipinfo-plus.parquet")
# 위험 IP 필터링
risky_ips = df[
(df['is_anonymous'] == True) |
(df['portscan'] == True) |
(df['accuracy_radius_km'] > 50)
]
# BigQuery로 적재
risky_ips.to_gbq(
'security.risky_ips',
project_id='my-project',
if_exists='replace'
)
return {'processed': len(risky_ips)}
4. Snowflake 연동
-- Snowflake에서 IPinfo 데이터 직접 쿼리
CREATE OR REPLACE EXTERNAL TABLE ipinfo_data
WITH LOCATION = @ipinfo_stage
FILE_FORMAT = (TYPE = 'PARQUET');
-- 실시간 보안 분석 쿼리
WITH suspicious_activity AS (
SELECT
ip,
country,
city,
asn_name,
is_anonymous,
is_hosting,
accuracy_radius_km,
COUNT(*) as request_count
FROM web_logs w
JOIN ipinfo_data i ON w.client_ip = i.ip
WHERE
w.timestamp >= DATEADD(hour, -1, CURRENT_TIMESTAMP())
AND (i.is_anonymous = TRUE OR i.accuracy_radius_km > 100)
GROUP BY 1,2,3,4,5,6,7
)
SELECT * FROM suspicious_activity
WHERE request_count > 10
ORDER BY request_count DESC;
실무 활용 사례 및 시나리오
금융 서비스: 사기 방지 시스템
시나리오: 온라인 뱅킹 로그인 보안
class BankingSecuritySystem:
def __init__(self, ipinfo_client):
self.ipinfo = ipinfo_client
self.risk_thresholds = {
'location_change_km': 500,
'accuracy_radius_km': 50,
'vpn_risk_multiplier': 2.0
}
def evaluate_login_risk(self, user_id, current_ip):
# 현재 IP 정보 조회
current_info = self.ipinfo.get_details(current_ip)
# 사용자의 이전 로그인 기록 조회
last_login = get_user_last_login(user_id)
risk_score = 0
risk_factors = []
# 1. 위치 변경 검사
if last_login:
distance = calculate_distance(
(last_login['lat'], last_login['lon']),
(current_info['latitude'], current_info['longitude'])
)
if distance > self.risk_thresholds['location_change_km']:
risk_score += 30
risk_factors.append(f"Location change: {distance:.0f}km")
# 2. VPN/프록시 사용 검사
if current_info.get('privacy', {}).get('vpn'):
risk_score += 40
vpn_provider = current_info['privacy'].get('name', 'Unknown')
risk_factors.append(f"VPN detected: {vpn_provider}")
# 3. 위치 정확도 검사
accuracy = current_info.get('location', {}).get('accuracy_radius_km', 999)
if accuracy > self.risk_thresholds['accuracy_radius_km']:
risk_score += 20
risk_factors.append(f"Low location accuracy: {accuracy}km")
# 4. 레지던셜 프록시 검사
if self.check_residential_proxy(current_ip):
risk_score += 50
risk_factors.append("Residential proxy detected")
# 5. 시간대 이상 검사
expected_timezone = get_user_timezone(user_id)
current_timezone = current_info.get('timezone')
if expected_timezone and current_timezone != expected_timezone:
time_diff = get_timezone_difference(expected_timezone, current_timezone)
if time_diff > 3: # 3시간 이상 차이
risk_score += 25
risk_factors.append(f"Timezone mismatch: {time_diff}h difference")
return {
'risk_score': min(100, risk_score),
'risk_factors': risk_factors,
'recommended_action': self.get_recommended_action(risk_score)
}
def get_recommended_action(self, risk_score):
if risk_score >= 70:
return "BLOCK_ACCESS"
elif risk_score >= 50:
return "REQUIRE_2FA_AND_IDENTITY_VERIFICATION"
elif risk_score >= 30:
return "REQUIRE_2FA"
else:
return "ALLOW_ACCESS"
게임 산업: 부정 행위 방지
시나리오: 멀티 계정 및 봇 탐지
class GameAnticheatSystem:
def __init__(self, ipinfo_client):
self.ipinfo = ipinfo_client
self.player_ip_history = {} # player_id: [ip_list]
self.ip_player_mapping = {} # ip: [player_ids]
def analyze_player_connection(self, player_id, ip_address):
# IP 정보 조회
ip_info = self.ipinfo.get_details(ip_address)
suspicion_level = 0
reasons = []
# 1. 데이터센터/호스팅 IP 검사
if ip_info.get('is_hosting'):
suspicion_level += 40
reasons.append("Connection from hosting provider")
# 2. 동일 IP에서 여러 계정 접속 검사
if ip_address in self.ip_player_mapping:
other_players = [p for p in self.ip_player_mapping[ip_address]
if p != player_id]
if len(other_players) > 2:
suspicion_level += 30
reasons.append(f"Multiple accounts from same IP: {len(other_players)}")
# 3. IP 변경 패턴 분석
if player_id in self.player_ip_history:
ip_changes = self.analyze_ip_changes(player_id, ip_address)
if ip_changes['rapid_changes']:
suspicion_level += 25
reasons.append("Rapid IP changes detected")
if ip_changes['different_countries'] > 3:
suspicion_level += 35
reasons.append(f"Connected from {ip_changes['different_countries']} countries")
# 4. VPN 체인 사용 검사
if self.detect_vpn_chain(ip_address):
suspicion_level += 45
reasons.append("VPN chain/double VPN detected")
# 5. 봇 팜 특징 검사
if self.check_bot_farm_characteristics(ip_address):
suspicion_level += 50
reasons.append("Bot farm characteristics detected")
# 기록 업데이트
self.update_player_history(player_id, ip_address)
return {
'suspicion_level': min(100, suspicion_level),
'reasons': reasons,
'recommended_action': self.get_game_action(suspicion_level)
}
def check_bot_farm_characteristics(self, ip):
"""봇 팜 특징 검사"""
# 같은 ASN에서 대량 접속
asn_info = self.ipinfo.get_asn_details(ip)
connections_from_asn = self.count_connections_from_asn(asn_info['asn'])
# 특정 국가의 저렴한 VPS 제공자
suspicious_providers = ['DigitalOcean', 'Vultr', 'Linode']
is_suspicious_provider = any(p in asn_info.get('name', '')
for p in suspicious_providers)
return (connections_from_asn > 50 and is_suspicious_provider)
이커머스: 지역 기반 가격 정책 우회 방지
시나리오: 지역별 차등 가격 정책 보호
class RegionalPricingProtection:
def __init__(self, ipinfo_client):
self.ipinfo = ipinfo_client
self.pricing_regions = {
'US': {'currency': 'USD', 'base_price': 100},
'IN': {'currency': 'INR', 'base_price': 50},
'BR': {'currency': 'BRL', 'base_price': 70},
'KR': {'currency': 'KRW', 'base_price': 90}
}
def verify_pricing_eligibility(self, ip_address, claimed_country):
"""사용자가 주장하는 국가와 실제 IP 위치 검증"""
ip_info = self.ipinfo.get_details(ip_address)
verification_result = {
'eligible': False,
'detected_country': ip_info['country'],
'claimed_country': claimed_country,
'risk_indicators': []
}
# 1. 기본 국가 일치 검사
if ip_info['country'] != claimed_country:
verification_result['risk_indicators'].append(
f"Country mismatch: IP shows {ip_info['country']}"
)
# 2. VPN/프록시 사용 검사
if ip_info.get('privacy', {}).get('is_anonymous'):
verification_result['risk_indicators'].append(
"Anonymous connection detected"
)
# VPN 제공자가 특정 국가 전용인지 확인
vpn_provider = ip_info.get('privacy', {}).get('name', '')
if not self.is_local_vpn_provider(vpn_provider, claimed_country):
verification_result['risk_indicators'].append(
f"Non-local VPN provider: {vpn_provider}"
)
# 3. 위치 정확도 검사
accuracy = ip_info.get('location', {}).get('accuracy_radius_km', 999)
if accuracy > 100: # 100km 이상이면 신뢰도 낮음
verification_result['risk_indicators'].append(
f"Low location accuracy: {accuracy}km radius"
)
# 4. 레지던셜 프록시 검사
residential_check = self.ipinfo.check_residential_proxy(ip_address)
if residential_check.get('is_residential_proxy'):
verification_result['risk_indicators'].append(
"Residential proxy detected - possible location spoofing"
)
# 5. ASN 국가 일치 검사
asn_country = ip_info.get('asn', {}).get('country')
if asn_country and asn_country != claimed_country:
verification_result['risk_indicators'].append(
f"ASN registered in different country: {asn_country}"
)
# 최종 판정
if not verification_result['risk_indicators']:
verification_result['eligible'] = True
elif len(verification_result['risk_indicators']) == 1 and \
'Anonymous connection' in verification_result['risk_indicators'][0]:
# VPN만 사용하고 다른 문제가 없으면 추가 검증 후 허용 가능
verification_result['eligible'] = 'REQUIRES_VERIFICATION'
return verification_result
def get_applicable_pricing(self, ip_address, user_account=None):
"""적용 가능한 가격 정책 결정"""
ip_info = self.ipinfo.get_details(ip_address)
detected_country = ip_info['country']
# 사용자 계정이 있는 경우 기존 구매 이력 확인
if user_account:
purchase_history = self.get_user_purchase_history(user_account)
historical_countries = [p['country'] for p in purchase_history]
# 갑작스러운 국가 변경 감지
if historical_countries and detected_country not in historical_countries:
self.flag_suspicious_activity(
user_account,
f"Country change: {historical_countries[-1]} -> {detected_country}"
)
# 해당 국가의 가격 정책 반환
if detected_country in self.pricing_regions:
return self.pricing_regions[detected_country]
else:
# 기본 가격 정책 (가장 높은 가격)
return self.pricing_regions['US']
스트리밍 서비스: 콘텐츠 지역 제한 관리
시나리오: 라이선스 기반 콘텐츠 접근 제어
class StreamingContentControl:
def __init__(self, ipinfo_client):
self.ipinfo = ipinfo_client
self.content_licenses = {
'movie_12345': ['US', 'CA', 'GB'],
'series_67890': ['US', 'JP', 'KR', 'AU'],
'sports_live_11111': ['US']
}
def check_content_access(self, ip_address, content_id, user_subscription):
"""콘텐츠 접근 권한 확인"""
ip_info = self.ipinfo.get_details(ip_address)
access_check = {
'allowed': False,
'reason': None,
'detected_location': {
'country': ip_info['country'],
'city': ip_info.get('city'),
'accuracy_km': ip_info.get('location', {}).get('accuracy_radius_km')
}
}
# 1. 라이선스 지역 확인
licensed_countries = self.content_licenses.get(content_id, [])
if ip_info['country'] not in licensed_countries:
access_check['reason'] = f"Content not available in {ip_info['country']}"
return access_check
# 2. VPN/프록시 정책 확인
if ip_info.get('privacy', {}).get('is_anonymous'):
# 일부 콘텐츠는 VPN 허용, 일부는 차단
content_type = self.get_content_type(content_id)
if content_type == 'live_sports':
# 라이브 스포츠는 VPN 완전 차단
access_check['reason'] = "VPN/Proxy connections not allowed for live content"
return access_check
elif content_type == 'premium_movie':
# 프리미엄 영화는 추가 검증
vpn_provider = ip_info.get('privacy', {}).get('name')
if not self.is_trusted_vpn(vpn_provider):
access_check['reason'] = "Untrusted VPN provider"
return access_check
# 3. 동시 스트리밍 지역 제한
active_sessions = self.get_user_active_sessions(user_subscription)
different_countries = set([s['country'] for s in active_sessions])
different_countries.add(ip_info['country'])
if len(different_countries) > 2:
access_check['reason'] = "Too many different countries in active sessions"
return access_check
# 4. 위치 정확도 기반 신뢰도
if ip_info.get('location', {}).get('accuracy_radius_km', 0) > 200:
# 매우 부정확한 위치
access_check['reason'] = "Cannot verify precise location"
return access_check
# 모든 검사 통과
access_check['allowed'] = True
access_check['reason'] = "Access granted"
# 접근 로그 기록
self.log_content_access(
user_subscription,
content_id,
ip_address,
ip_info['country'],
access_check['allowed']
)
return access_check
기업 보안: Zero Trust 네트워크 접근
시나리오: 기업 리소스 접근 제어
class ZeroTrustAccessControl:
def __init__(self, ipinfo_client):
self.ipinfo = ipinfo_client
self.company_offices = {
'HQ': {'country': 'US', 'city': 'San Francisco', 'lat': 37.7749, 'lon': -122.4194},
'EU': {'country': 'DE', 'city': 'Berlin', 'lat': 52.5200, 'lon': 13.4050},
'ASIA': {'country': 'SG', 'city': 'Singapore', 'lat': 1.3521, 'lon': 103.8198}
}
def evaluate_access_request(self, employee_id, ip_address, requested_resource):
"""Zero Trust 원칙에 따른 접근 평가"""
ip_info = self.ipinfo.get_details(ip_address)
employee_profile = self.get_employee_profile(employee_id)
trust_score = 100 # 시작 점수
risk_factors = []
# 1. 위치 기반 신뢰도 평가
location_trust = self.evaluate_location_trust(
ip_info,
employee_profile['usual_locations']
)
trust_score -= (100 - location_trust['score'])
risk_factors.extend(location_trust['factors'])
# 2. 네트워크 유형 평가
network_trust = self.evaluate_network_trust(ip_info)
trust_score -= (100 - network_trust['score'])
risk_factors.extend(network_trust['factors'])
# 3. 시간 기반 평가
time_trust = self.evaluate_time_based_trust(
ip_info['timezone'],
employee_profile['work_schedule']
)
trust_score -= (100 - time_trust['score'])
risk_factors.extend(time_trust['factors'])
# 4. 디바이스 및 행동 패턴
behavior_trust = self.evaluate_behavior_patterns(
employee_id,
ip_address,
ip_info
)
trust_score -= (100 - behavior_trust['score'])
risk_factors.extend(behavior_trust['factors'])
# 5. 리소스 민감도에 따른 임계값 조정
required_trust = self.get_resource_trust_requirement(requested_resource)
access_decision = {
'granted': trust_score >= required_trust,
'trust_score': max(0, trust_score),
'required_score': required_trust,
'risk_factors': risk_factors,
'additional_auth_required': self.determine_additional_auth(
trust_score,
required_trust
)
}
# 감사 로그
self.audit_log_access_attempt(
employee_id,
ip_address,
requested_resource,
access_decision
)
return access_decision
def evaluate_network_trust(self, ip_info):
"""네트워크 유형에 따른 신뢰도 평가"""
score = 100
factors = []
# 기업 소유 IP 대역
if self.is_company_ip_range(ip_info['ip']):
return {'score': 100, 'factors': ['Company network']}
# VPN 사용
if ip_info.get('privacy', {}).get('vpn'):
vpn_name = ip_info['privacy'].get('name', 'Unknown')
if vpn_name in self.approved_corporate_vpns:
score -= 10
factors.append(f'Corporate VPN: {vpn_name}')
else:
score -= 40
factors.append(f'Unapproved VPN: {vpn_name}')
# 호스팅/데이터센터
if ip_info.get('is_hosting'):
score -= 50
factors.append('Connection from hosting provider')
# 모바일 네트워크
if ip_info.get('is_mobile'):
carrier = ip_info.get('carrier', {}).get('name', 'Unknown')
score -= 20
factors.append(f'Mobile network: {carrier}')
# 위성 연결
if ip_info.get('is_satellite'):
score -= 30
factors.append('Satellite connection')
# 레지던셜 프록시
if self.check_residential_proxy(ip_info['ip']):
score -= 60
factors.append('Residential proxy detected')
return {'score': max(0, score), 'factors': factors}
보안 운영 체크리스트
IPinfo 통합 시 필수 점검 사항
1. 초기 설정 체크리스트
initial_setup:
- [ ] API 토큰 안전한 저장 (환경 변수, 시크릿 매니저)
- [ ] 요청 속도 제한 설정 (Rate Limiting)
- [ ] 에러 처리 및 폴백 메커니즘 구현
- [ ] 캐싱 전략 수립 (Redis/Memcached)
- [ ] 모니터링 및 알림 설정
api_integration:
- [ ] 연결 타임아웃 설정 (권장: 5초)
- [ ] 재시도 로직 구현 (exponential backoff)
- [ ] 벌크 조회 시 배치 처리 구현
- [ ] 응답 데이터 검증 로직
security_hardening:
- [ ] API 키 로테이션 정책 수립
- [ ] 접근 로그 및 감사 추적
- [ ] 민감 데이터 마스킹 처리
- [ ] GDPR/개인정보보호 준수 검토
2. 운영 모니터링 대시보드
# Grafana 대시보드용 메트릭 수집 예시
class IPInfoMetricsCollector:
def __init__(self, prometheus_client):
self.prom = prometheus_client
# 메트릭 정의
self.api_requests = self.prom.Counter(
'ipinfo_api_requests_total',
'Total IPinfo API requests',
['endpoint', 'status']
)
self.api_latency = self.prom.Histogram(
'ipinfo_api_latency_seconds',
'IPinfo API latency',
['endpoint']
)
self.threat_detections = self.prom.Counter(
'ipinfo_threat_detections_total',
'Threats detected via IPinfo',
['threat_type', 'action_taken']
)
def record_api_call(self, endpoint, status, duration):
self.api_requests.labels(endpoint=endpoint, status=status).inc()
self.api_latency.labels(endpoint=endpoint).observe(duration)
def record_threat_detection(self, threat_type, action):
self.threat_detections.labels(
threat_type=threat_type,
action_taken=action
).inc()
3. 보안 규칙 템플릿
security_rules:
vpn_detection:
condition: "privacy.vpn == true"
actions:
- log_event
- require_2fa
- notify_security_team: "severity >= high"
location_anomaly:
condition: |
location.accuracy_radius_km > 50 AND
distance_from_last_location > 1000
actions:
- block_access
- create_incident_ticket
- send_user_notification
residential_proxy:
condition: "residential_proxy.detected == true"
actions:
- increase_risk_score: 50
- limit_functionality
- monitor_closely
bot_detection:
condition: |
is_hosting == true AND
user_agent.is_automated == true AND
request_rate > 100/min
actions:
- immediate_block
- add_to_blacklist
- alert_soc_team
최신 업데이트 및 도구
2025년 최신 기능
- Portscan Detection Tag
- 1,000+ 글로벌 허니팟 네트워크 기반
- 실시간 공격 징후 탐지
- API 응답에 자동 포함
- Cloud Storage Push 확장
- Google Cloud Storage 지원
- Azure Blob Storage 지원
- 자동화된 데이터 파이프라인
- 정확도 개선
- ProbeNet 1,046개 노드로 확장
- 신규 13개 도시 추가
- 응답 시간 100ms 미만 달성
개발자 도구
- 공식 라이브러리: Python, Go, PHP, Java, Ruby, Node.js
- CLI 도구:
ipinfo-cli
(brew, apt, docker 지원) - Postman 컬렉션: API 테스트 및 문서화
- OpenAPI 스펙: 자동화된 클라이언트 생성
올바른 IP 인텔리전스 활용은 보안 강화, 사용자 경험 개선, 비즈니스 인사이트 확보의 핵심입니다. IPinfo의 다양한 제품과 기능을 조합하여 최적의 솔루션을 구축하시기 바랍니다.
댓글