네트워크 토폴로지(Net3D) API 레퍼런스
이 가이드만 읽으면 GIIP 네트워크 토폴로지(Net3D) 시각화에 필요한 데이터를 직접 만들어 넣을 수 있습니다.
시작 전 준비물
| 항목 | 설명 | 얻는 방법 |
|---|---|---|
| SK (Secret Key) | API 인증에 사용하는 비밀 키 | GIIP 관리 화면의 (서버 상세) 또는 (법인·그룹 관리) 페이지에서 확인 |
| API URL | GIIP 서버 주소 | 예: |
| LSSN | 서버 등록 후 발급되는 고유 세션 번호 | Step 1 완료 후 응답에서 취득 |
LSSN이란?
LSSN(Long-term Session Serial Number)은 서버 1대를 식별하는 숫자 ID입니다. 서버를 처음 등록(AgentAutoRegister)하면 서버마다 고유한 LSSN이 발급됩니다. 이후 모든 KVSPut 데이터 전송 시
kKey 값으로 이 LSSN을 사용합니다.
흐름 요약:
서버 등록 (AgentAutoRegister) → LSSN 발급 → LSSN을 kKey로 사용하여 netstat/db_connections 전송
인증 방식
- Content-Type:
application/x-www-form-urlencoded - 인증 위치: HTTP 헤더가 아닌 요청 바디의
필드에 SK 값을 포함token - 잘못된 방식:
(사용 불가)Authorization: Bearer YOUR_SK - 올바른 방식: 바디에
포함token=YOUR_SK
Step 1: 서버 등록 (AgentAutoRegister) — LSSN 획득
서버를 GIIP에 등록하고 LSSN을 받습니다. 이 LSSN을 반드시 저장하세요.
- Endpoint:
POST https://YOUR_API_URL/api/giipApi?cmd=AgentAutoRegister - Content-Type:
application/x-www-form-urlencoded
요청 Body 필드:
| 필드 | 값 |
|---|---|
| YOUR_SK |
| |
| 아래 JSON을 문자열로 직렬화한 값 |
jsondata 예시:
{ "hostname": "WEB-SRV-01", "os": "Windows Server 2022", "cpu_cores": 8, "ipv4_local": "10.0.0.5" }
curl 예시:
curl -X POST "https://YOUR_API_URL/api/giipApi?cmd=AgentAutoRegister" \ -H "Content-Type: application/x-www-form-urlencoded" \ --data-urlencode "token=YOUR_SK" \ --data-urlencode "text=AgentAutoRegister" \ --data-urlencode 'jsondata={"hostname":"WEB-SRV-01","os":"Windows Server 2022","cpu_cores":8,"ipv4_local":"10.0.0.5"}'
응답 예시:
{ "RstVal": 200, "RstMsg": "Success", "lssn": 123456 }
중요: 응답의
값(예:lssn)을 반드시 저장하세요. Step 2, 3의 모든 요청에서123456로 사용합니다.kKey
Step 2: 서버 간 연결 전송 (netstat KVSPut)
현재 서버에서 외부 서버로 향하는 TCP 연결 정보를 전송합니다.
- Endpoint:
(cmd 파라미터 없음)POST https://YOUR_API_URL/api/giipApi - Content-Type:
application/x-www-form-urlencoded
요청 Body 필드:
| 필드 | 값 | 설명 |
|---|---|---|
| YOUR_SK | 인증 키 |
| | 리터럴 고정 문자열 (그대로 입력) |
| 아래 JSON을 문자열로 직렬화한 값 | 실제 데이터 |
jsondata 예시:
{ "kType": "lssn", "kKey": "123456", "kFactor": "netstat", "kValue": [ { "remote_ip": "10.0.0.10", "remote_port": 8080, "process_name": "nginx.exe", "state": "ESTABLISHED" }, { "remote_ip": "10.0.0.20", "remote_port": 3306, "process_name": "myapp.exe", "state": "ESTABLISHED" } ] }
curl 예시:
curl -X POST "https://YOUR_API_URL/api/giipApi" \ -H "Content-Type: application/x-www-form-urlencoded" \ --data-urlencode "token=YOUR_SK" \ --data-urlencode "text=KVSPut kType kKey kFactor" \ --data-urlencode 'jsondata={"kType":"lssn","kKey":"123456","kFactor":"netstat","kValue":[{"remote_ip":"10.0.0.10","remote_port":8080,"process_name":"nginx.exe","state":"ESTABLISHED"}]}'
응답 예시:
{ "RstVal": 200, "RstMsg": "Success" }
kValue 항목별 필드 설명:
| 필드 | 타입 | 설명 |
|---|---|---|
| string | 연결 대상 서버 IP |
| integer | 연결 대상 포트 |
| string | 연결을 생성한 프로세스명 |
| string | 연결 상태. 인 항목만 토폴로지에 선(Link)으로 표시 |
주의:
가state인 항목만 토폴로지 화면에 연결선으로 표시됩니다.ESTABLISHED
Step 3: DB 연결 정보 전송 (db_connections KVSPut)
애플리케이션 서버에서 DB 서버로 전송하는 쿼리 및 부하 정보를 전송합니다.
- Endpoint:
(netstat과 동일)POST https://YOUR_API_URL/api/giipApi - Content-Type:
application/x-www-form-urlencoded
요청 Body 필드:
| 필드 | 값 | 설명 |
|---|---|---|
| YOUR_SK | 인증 키 |
| | 리터럴 고정 문자열 (그대로 입력) |
| 아래 JSON을 문자열로 직렬화한 값 | 실제 데이터 |
jsondata 예시:
{ "kType": "lssn", "kKey": "123456", "kFactor": "db_connections", "kValue": [ { "client_net_address": "10.0.0.5", "program_name": "MyApp.exe", "cpu_load": 15, "last_sql": "SELECT * FROM users WHERE id = 1", "query_hash": "0xAB12CD34" }, { "client_net_address": "10.0.0.5", "program_name": "MyApp.exe", "cpu_load": 42, "last_sql": "UPDATE orders SET status = 'shipped' WHERE order_id = 9901", "query_hash": "0xCD56EF78" } ] }
curl 예시:
curl -X POST "https://YOUR_API_URL/api/giipApi" \ -H "Content-Type: application/x-www-form-urlencoded" \ --data-urlencode "token=YOUR_SK" \ --data-urlencode "text=KVSPut kType kKey kFactor" \ --data-urlencode 'jsondata={"kType":"lssn","kKey":"123456","kFactor":"db_connections","kValue":[{"client_net_address":"10.0.0.5","program_name":"MyApp.exe","cpu_load":15,"last_sql":"SELECT * FROM users WHERE id = 1","query_hash":"0xAB12CD34"}]}'
응답 예시:
{ "RstVal": 200, "RstMsg": "Success" }
kValue 항목별 필드 설명:
| 필드 | 타입 | 설명 |
|---|---|---|
| string | 소스 서버 IP. 와 정확히 일치해야 DB 링크 생성 |
| string | 실행 프로그램명. 토폴로지 Outgoing 노드 라벨로 표시 |
| integer | 쿼리 부하(%). 링크 선의 굵기 및 파티클 속도 결정 |
| string | 현재 실행 중인 SQL 문. 상세 보기 모달에 표시 |
| string | SQL 구문 해시. 동일 쿼리 그룹화에 사용 |
Step 4: DB 목록 조회 (ManagedDatabaseList)
프로젝트에 등록된 관리 대상 데이터베이스 목록을 조회합니다.
- Endpoint:
POST https://YOUR_API_URL/api/giipApi - Content-Type:
application/x-www-form-urlencoded
요청 Body 필드:
| 필드 | 값 |
|---|---|
| YOUR_SK |
| (db_type 지정 가능) |
curl 예시:
curl -X POST "https://YOUR_API_URL/api/giipApi" \ -H "Content-Type: application/x-www-form-urlencoded" \ --data-urlencode "token=YOUR_SK" \ --data-urlencode "text=ManagedDatabaseList mssql"
응답 예시:
{ "RstVal": 200, "RstMsg": "Success", "data": [ { "db_host": "10.0.0.30", "db_name": "ProductionDB", "db_type": "mssql" } ] }
에 포함된 SK가 프로젝트 정보를 내포하므로token을 별도로 전달할 필요가 없습니다. 서버가 자동으로 처리합니다.csn
언어별 전체 예제 스크립트
PowerShell · Bash · Python 전체 예제 스크립트는 분량 관계로 별도 가이드로 분리했습니다.
데이터 확인 방법
스크립트 실행 후 아래 단계로 데이터를 확인하세요.
- 서버 등록 확인:
메뉴에서 해당 호스트명의 서버가 등록되었는지 확인합니다.기본정보 관리 > 서버 인벤토리 - DB 매핑 확인:
값이client_net_address
와 정확히 일치하는지 확인합니다.tManagedDatabase.db_host - 토폴로지 뷰어:
페이지로 이동하여 노드 간 연결선이 활성화되는지 확인합니다. 데이터는 전송 후 약 1~2분 내 실시간 반영됩니다./admin/network-topology
데이터 정합성 규칙
데이터를 넣기 전에 반드시 아래 조건을 확인하세요.
- IP 매핑:
필드는 반드시tLSvr.ips
형태의 JSON 배열이어야 합니다. 단순 문자열이면 토폴로지에서 'External' 노드로 분리됩니다.[{"CIDR":"10.0.0.5/24"}] - DB 호스트 일치:
의db_connections
값이client_net_address
와 텍스트 레벨에서 100% 일치해야 DB 링크가 생성됩니다. 대소문자, 공백까지 동일해야 합니다.tManagedDatabase.db_host - JSON Depth:
배열을 포함한 jsondata 전체를 직렬화할 때 Depth 10 이상으로 인코딩합니다. 깊이가 부족하면 하위 객체가 잘립니다.kValue - state 값:
kValue에서netstat
가state
인 항목만 토폴로지 연결선으로 표시됩니다.ESTABLISHED
트러블슈팅
응답 RstVal이 200이 아닌 경우
| RstVal | 의미 | 조치 |
|---|---|---|
| 401 | 인증 실패 | 값(SK)이 올바른지 확인. HTTP 헤더가 아닌 바디에 있는지 확인 |
| 400 | 잘못된 요청 | 필드 값이 정확한지 확인 ( 리터럴) |
| 500 | 서버 오류 | JSON 형식이 유효한지 확인. 중첩 따옴표 이스케이프 확인 |
토폴로지에 연결선이 표시되지 않는 경우
kValue의netstat
값이 정확히state
(대문자)인지 확인ESTABLISHED
의db_connections
가 GIIP에 등록된 DB 호스트 IP와 완전히 동일한지 확인client_net_address
가 단순 문자열이 아닌tLSvr.ips
JSON 배열인지 확인[{"CIDR":"..."}]
LSSN을 분실한 경우
AgentAutoRegister를 동일한
hostname으로 재호출하면 기존 LSSN이 반환됩니다. 서버마다 hostname이 고유하면 LSSN도 고유하게 유지됩니다.
curl에서 jsondata가 잘리는 경우
-d 대신 --data-urlencode를 사용하면 특수문자가 포함된 JSON 문자열도 안전하게 전송됩니다. 대용량 데이터는 giipApiSk3 엔드포인트를 사용하세요 (아래 Sk3 항목 참조).
Python에서 SK 미정의(NameError) 오류
이 가이드의 Python 예제는
AT 변수 하나를 사용합니다. SK 변수를 따로 정의하지 않도록 주의하세요.
고성능 로깅 엔드포인트 (Sk3)
수천 건 이상의 연결 데이터를 전송하거나 디버깅이 필요할 때
giipApiSk3 엔드포인트를 사용하세요.
- Endpoint:
https://giipfaw.azurewebsites.net/api/giipApiSk3 - 장점: 대용량 jsondata 전송 시 데이터 절단 방지, 오류 발생 시 에이전트 환경 정보와 StackTrace 자동 기록
- 사용법: KVSPut 명령 사용 시 동일한 방식으로 엔드포인트만 변경하면 됩니다.
관련 문서
버전: 1.4 최종 업데이트: 2026-06-19 소스 파일:
giipv3/public/help/api-network-topology.ko.md