네트워크 토폴로지(Net3D) API 레퍼런스
네트워크 토폴로지(Net3D) 시각화를 위해 에이전트 또는 서드파티 시스템에서 인프라 연결 데이터를 수집하고 GIIP 플랫폼으로 전송하는 API 규격을 안내합니다.
📋 개요
Net3D 시스템은 에이전트가 수집한 데이터를
tKVS 테이블에 적재하고, 이를 기반으로 서버-서버, 서버-DB 간의 연결 관계를 3D로 시각화합니다. 정확한 시각화를 위해 데이터의 필드명과 규격 준수가 필수적입니다.
🔐 인증 및 헤더
모든 요청은 application/x-www-form-urlencoded 형식으로 전송해야 하며, 바디(Body)에 인증 토큰을 포함해야 합니다.
- Content-Type:
application/x-www-form-urlencoded; charset=utf-8 - Body Field:
token=[Your Secret Key]
[!IMPORTANT] 인증은 HTTP 헤더 (
)가 아닌, 요청 바디의Authorization필드를 통해 수행됩니다.token값은token의giipAgent.cfg값을 사용합니다.sk
🚀 주요 데이터 수집 및 전송 (Factor별 규격)
1. 인프라 인벤토리 수집 (netinv
)
netinv서버의 기본 사양과 네트워크 인터페이스, 라우팅 정보를 전송합니다.
- Endpoint:
POST /api/giipApi?cmd=AgentAutoRegister - Content-Type:
application/x-www-form-urlencoded - Body Fields:
:token
값 (또는sk
값)at
:text"AgentAutoRegister"
: 아래 JSON 구조를 문자열화하여 전송jsondata
jsondata 구조 예시:
{ "hostname": "WEB-SRV-01", "os": "Windows Server 2022", "cpu_cores": 8, "ipv4_local": "10.0.0.5" }
2. 서버 간 연결 리스트 (netstat
)
netstat현재 서버에서 외부 서버로 연결된 TCP 세션 정보를 전송합니다.
- Endpoint:
POST /api/giipApi?cmd=KVSPut - Content-Type:
application/x-www-form-urlencoded - Body Fields:
:token
값sk
:text
(리터럴 고정 문자열)"KVSPut kType kKey kFactor"
: 아래 객체 구조를 문자열화하여 전송jsondata
jsondata 구조 예시:
{ "kType": "lssn", "kKey": "123456", "kFactor": "netstat", "kValue": [ { "remote_ip": "10.0.0.10", "remote_port": 8080, "process_name": "nginx.exe", "state": "ESTABLISHED" } ] }
주의:
가 state
인 항목만 토폴로지에 선(Link)으로 표시됩니다.ESTABLISHED
3. 데이터베이스 연결 정보 (db_connections
)
db_connections애플리케이션 서버에서 DB 서버로 전송되는 쿼리 및 부하 정보를 관리합니다.
- kFactor:
db_connections - Payload 규격:
| 필드명 | 설명 | 비고 |
|:---|:---|:---|
|
| 소스 서버 IP |client_net_address
와 일치해야 매핑됨 | |tLSvr.ips
| 실행 프로그램명 | Outgoing 노드의 라벨로 사용 | |program_name
| 쿼리 부하 | 링크 선의 굵기 및 파티클 속도 결정 | |cpu_load
| 실행 중인 SQL | 상세 보기 모달에 표시 | |last_sql
| SQL 구문 해시 | 동일 쿼리 그룹화에 사용 |query_hash
4. 데이터베이스 리스트 조회 (ManagedDatabaseList
)
ManagedDatabaseList프로젝트(csn)에 연결된 관리 대상 데이터베이스 목록을 가져옵니다.
- text:
(예:"ManagedDatabaseList [db_type]"
)ManagedDatabaseList mssql - csn 지정 관련:
(sk)에 프로젝트 정보가 내포되어 있으므로, API 호출 시token
을 명시적으로 전달할 필요가 없습니다. 서버에서 자동으로 해결됩니다.csn
🔍 데이터 정합성 주의사항 (AI 가이드)
AI 에이전트가 데이터를 생성하거나 검증할 때 다음 조건을 반드시 확인하십시오.
- IP 매핑:
필드는 반드시tLSvr.ips
와 같은 JSON 배열 구조여야 합니다. 단순 문자열일 경우 토폴로지에서 'External' 노드로 분리됩니다.[{"CIDR":"10.0.0.5/24"}] - DB 호스트 일치:
값은 에이전트가 전송하는tManagedDatabase.db_host
와 텍스트 레벨에서 100% 일치해야 링크가 생성됩니다.client_net_address - JSON Depth: 데이터 전송 시 하위 오브젝트가 잘리지 않도록 충분한 깊이(Depth 10 이상)로 인코딩하십시오.
💻 언어별 전송 샘플 스크립트
실제 인프라 환경에서 데이터를 수집하고 전송하는 예제 코드입니다.
giipAgentWin의 구현 방식에 맞추어 **등록(AgentAutoRegister)**은 JSON, **데이터 전송(KVSPut)**은 Form-urlencoded 방식을 사용합니다.
1. PowerShell (Windows)
Windows 에이전트(
giipAgentWin)의 동작 방식을 모사한 스크립트입니다.
# 1. 서버 등록 (AgentAutoRegister) $sk = "YOUR_SECRET_KEY" $apiUrl = "https://your-api.azurewebsites.net/api/giipApi?cmd=AgentAutoRegister" $discoveryData = @{ hostname = $env:COMPUTERNAME os = (Get-CimInstance Win32_OperatingSystem).Caption cpu_cores = (Get-CimInstance Win32_Processor).NumberOfLogicalProcessors ipv4_local = (Get-NetIPAddress -AddressFamily IPv4 | Where-Object { $_.IPAddress -ne '127.0.0.1' } | Select-Object -First 1).IPAddress } | ConvertTo-Json -Compress $regBody = @{ token = $sk text = "AgentAutoRegister" jsondata = $discoveryData } $resp = Invoke-RestMethod -Uri $apiUrl -Method Post -ContentType "application/x-www-form-urlencoded" -Body $regBody $lssn = $resp.lssn # 등록 후 발급받은 LSSN 저장 # 2. 연결 정보 전송 (KVSPut netstat) $connUrl = "https://your-api.azurewebsites.net/api/giipApi" $connections = Get-NetTCPConnection -State Established | Select-Object -First 100 | ForEach-Object { @{ remote_ip = $_.RemoteAddress remote_port = $_.RemotePort state = "ESTABLISHED" process_name = (Get-Process -Id $_.OwningProcess -ErrorAction SilentlyContinue).ProcessName } } $payload = @{ kType = "lssn" kKey = $lssn kFactor = "netstat" kValue = $connections } | ConvertTo-Json -Compress -Depth 10 $putBody = @{ token = $sk text = "KVSPut kType kKey kFactor" jsondata = $payload } Invoke-RestMethod -Uri $connUrl -Method Post -ContentType "application/x-www-form-urlencoded" -Body $putBody
2. Bash Shell (Linux)
Linux 환경에서
curl과 jq를 사용하여 전송하는 방식입니다.
#!/bin/bash AT="YOUR_SECRET_KEY" API_URL="https://your-api.azurewebsites.net/api/giipApi" # 1. 서버 등록 JSON_DATA=$(cat <<EOF { "hostname": "$(hostname)", "os": "$(cat /etc/os-release | grep PRETTY_NAME | cut -d'"' -f2)", "cpu_cores": $(nproc), "ipv4_local": "$(hostname -I | awk '{print $1}')" } EOF ) RESP=$(curl -s -X POST "$API_URL?cmd=AgentAutoRegister" \ -H "Content-Type: application/x-www-form-urlencoded" \ --data-urlencode "token=$SK" \ --data-urlencode "text=AgentAutoRegister" \ --data-urlencode "jsondata=$JSON_DATA") LSSN=$(echo $RESP | jq -r '.lssn') # 2. 연결 정보 전송 (KVSPut netstat) CONNS=$(ss -tunp | grep ESTAB | head -n 50 | awk '{print $5}' | awk -F'[: ]' '{print "{\"remote_ip\":\""$1"\",\"remote_port\":\""$2"\",\"state\":\"ESTABLISHED\"}"}' | paste -sd, -) PAYLOAD=$(cat <<EOF { "kType": "lssn", "kKey": "$LSSN", "kFactor": "netstat", "kValue": [$CONNS] } EOF ) curl -X POST "$API_URL" \ -H "Content-Type: application/x-www-form-urlencoded" \ --data-urlencode "token=$SK" \ --data-urlencode "text=KVSPut kType kKey kFactor" \ --data-urlencode "jsondata=$PAYLOAD"
3. Python (Cross-platform)
requests 라이브러리를 사용한 범용 스크립트입니다.
import requests import json import platform import socket AT = "YOUR_SECRET_KEY" BASE_URL = "https://your-api.azurewebsites.net/api/giipApi" # 1. 서버 등록 import urllib.parse, urllib.request registration_data = { "hostname": socket.gethostname(), "os": platform.platform(), "cpu_cores": 8, "ipv4_local": socket.gethostbyname(socket.gethostname()) } reg_payload = urllib.parse.urlencode({ "token": SK, "text": "AgentAutoRegister", "jsondata": json.dumps(registration_data), }).encode("utf-8") req = urllib.request.Request( f"{BASE_URL}?cmd=AgentAutoRegister", data=reg_payload, headers={"Content-Type": "application/x-www-form-urlencoded; charset=utf-8"}, ) with urllib.request.urlopen(req) as f: resp = json.loads(f.read().decode("utf-8")) lssn = resp.get('lssn') # 2. 연결 정보 전송 (KVSPut netstat) payload_data = { "kType": "lssn", "kKey": lssn, "kFactor": "netstat", "kValue": [ {"remote_ip": "10.0.0.10", "remote_port": 80, "state": "ESTABLISHED", "process_name": "python"} ] } put_payload = urllib.parse.urlencode({ "token": SK, "text": "KVSPut kType kKey kFactor", "jsondata": json.dumps(payload_data), }).encode("utf-8") req_put = urllib.request.Request( BASE_URL, data=put_payload, headers={"Content-Type": "application/x-www-form-urlencoded; charset=utf-8"}, ) urllib.request.urlopen(req_put)
✅ 데이터 전송 확인 (Verification)
스크립트 실행 후 데이터가 정상적으로 수집되었는지 아래 단계로 확인하십시오.
- 서버 리스트 확인:
메뉴에서 해당 호스트네임의 서버가 등록되었고, '마지막 상태체크' 시간이 현재로 업데이트되었는지 확인합니다.기본정보 관리 > 서버 인벤토리 - 데이터베이스 매핑: DB 연결 정보를 보낼 경우,
가 해당 서버의 IP와 정확히 일치하는지 확인하십시오.client_net_address - 토폴로지 뷰어:
페이지로 이동하여 노드 간의 링크(선)가 활성화되는지 확인합니다. (데이터는 전송 후 약 1~2분 내로 실시간 반영됩니다.)/admin/network-topology
🛡️ Sk3(고성능 로깅) 활용
서버 간 연결(
netstat)이나 DB 연결(db_connections)과 같은 대용량 토폴로지 데이터를 전송할 때, 데이터 유실 방지와 상세한 전송 에러 분석을 위해 giipApiSk3 엔드포인트를 사용하는 것을 권장합니다.
- 엔드포인트:
https://giipfaw.azurewebsites.net/api/giipApiSk3 - 장점: 수천 건의 연결 데이터를
로 보낼 때 발생할 수 있는 데이터 절단 현상을 방지하며, 에러 발생 시 에이전트의 상세 환경 정보와 StackTrace를 자동 기록하여 토폴로지 시각화 오류를 빠르게 해결할 수 있습니다.jsondata - 활용 팁:
명령 사용 시KVSPut
내에jsondata
,kType
,kKey
,kFactor
를 객체 형태로 담아 Sk3를 호출하면, 복잡한 인코딩 과정 없이도 안정적으로 토폴로지 데이터를 서버에 적재할 수 있습니다.kValue
버전: 1.3 최종 업데이트: 2026-04-10 소스 파일:
giipv3/public/help/api-network-topology.ko.md
관련 문서: