내부 작동 원리 심층 분석 (Under the Hood)
OpenOSINT가 기존의 단순한 래퍼(Wrapper) 스크립트와 가장 차별화되는 지점은 내부 아키텍처에 있습니다. AI가 코드를 진짜로 이해하고 실행 결과를 기억하여 다음 단계의 계획을 수정하는 과정은 매우 정교한 상태 전이(State Transition)와 메시지 파싱에 의해 이루어집니다.
전체 데이터 흐름과 아키텍처
사용자 입력부터 최종 보고서 출력까지의 전체적인 흐름은 다음과 같이 구성됩니다.
%%{init: {"theme":"base","themeVariables":{"primaryColor":"#F0EEE9","primaryBorderColor":"#2a78d6","primaryTextColor":"#2b2926","secondaryColor":"#e8f0fb","secondaryBorderColor":"#4a3aa7","secondaryTextColor":"#2b2926","tertiaryColor":"#eafaf3","tertiaryBorderColor":"#1baf7a","tertiaryTextColor":"#2b2926","lineColor":"#8a8578","textColor":"#2b2926","edgeLabelBackground":"#F0EEE9","noteBkgColor":"#F0EEE9","noteTextColor":"#2b2926","noteBorderColor":"#8a8578","clusterBkg":"#faf9f6","clusterBorder":"#d8d4c8","fontFamily":"Pretendard, sans-serif"}}}%%
flowchart TD
A["사용자 입력"] --> B["대화형 시스템"]
B --> C["에이전트 판단"]
C --> D["도구 실행 요청"]
D --> E["도구 레지스트리"]
E --> F["외부 API 연동"]
F --> G["원본 데이터 반환"]
G --> C
C --> H["최종 분석 리포트"]
입력된 쿼리는 시스템 프롬프트 및 도구 사용 명세서(Tool Schema)와 함께 AI 에이전트로 전달됩니다. 에이전트는 현재 보유한 단서와 사용 가능한 도구 목록을 대조하며 계획을 수립합니다.
할루시네이션을 원천 차단하는 하드 스탑(Hard Stop) 메커니즘
AI 기반 조사 도구에서 가장 중요한 것은 거짓 정보를 배제하는 일입니다. OpenOSINT는 Anthropic 및 OpenAI의 네이티브 도구 사용(Tool Use) API를 활용해 이 문제를 해결합니다.
AI가 특정 데이터가 필요하다고 판단하면, 임의로 답변을 생성하는 대신 특수한 JSON 형태의 도구 호출(Tool Call) 블록을 출력합니다. 이때 AI의 텍스트 생성은 즉시 강제 중단(Hard Stop)됩니다. OpenOSINT의 도구 디스패처(Tool Dispatcher)는 이 중단 신호를 가로채어 로컬에 구현된 파이썬 함수(예: 네트워크 스캔, 외부 API 호출)를 실제로 실행합니다. 실행이 완료되면 반환된 원본 JSON이나 텍스트 결과값이 다시 AI의 컨텍스트에 주입되며, AI는 오직 이 ‘검증된 실제 데이터’만을 바탕으로 다음 행동을 추론하거나 보고서를 작성하게 됩니다.
이러한 에이전트의 생명주기는 다음과 같은 상태 다이어그램으로 표현할 수 있습니다.
%%{init: {"theme":"base","themeVariables":{"primaryColor":"#F0EEE9","primaryBorderColor":"#2a78d6","primaryTextColor":"#2b2926","secondaryColor":"#e8f0fb","secondaryBorderColor":"#4a3aa7","secondaryTextColor":"#2b2926","tertiaryColor":"#eafaf3","tertiaryBorderColor":"#1baf7a","tertiaryTextColor":"#2b2926","lineColor":"#8a8578","textColor":"#2b2926","edgeLabelBackground":"#F0EEE9","noteBkgColor":"#F0EEE9","noteTextColor":"#2b2926","noteBorderColor":"#8a8578","clusterBkg":"#faf9f6","clusterBorder":"#d8d4c8","fontFamily":"Pretendard, sans-serif"}}}%%
stateDiagram-v2
[*] --> Idle
Idle --> Planning : 타겟입력
Planning --> Executing : 도구결정
Executing --> Parsing : 응답대기
Parsing --> Planning : 단서획득
Parsing --> Reporting : 조사완료
Reporting --> Idle : 결과출력
Model Context Protocol (MCP) 기반의 확장성
MCP는 AI 모델과 로컬 시스템의 데이터 및 도구를 연결하기 위해 설계된 표준 프로토콜입니다. OpenOSINT는 자체적으로 강력한 MCP 서버 핸들러를 내장하고 있습니다.
%%{init: {"theme":"base","themeVariables":{"primaryColor":"#F0EEE9","primaryBorderColor":"#2a78d6","primaryTextColor":"#2b2926","secondaryColor":"#e8f0fb","secondaryBorderColor":"#4a3aa7","secondaryTextColor":"#2b2926","tertiaryColor":"#eafaf3","tertiaryBorderColor":"#1baf7a","tertiaryTextColor":"#2b2926","lineColor":"#8a8578","textColor":"#2b2926","edgeLabelBackground":"#F0EEE9","noteBkgColor":"#F0EEE9","noteTextColor":"#2b2926","noteBorderColor":"#8a8578","clusterBkg":"#faf9f6","clusterBorder":"#d8d4c8","fontFamily":"Pretendard, sans-serif"}}}%%
sequenceDiagram
participant C as ClaudeDesktop
participant M as MCPServer
participant T as OSINTTools
C->>M: 분석 요청
M->>T: 스캐닝 모듈 실행
T-->>M: 데이터 반환
M-->>C: 결과 응답
C->>C: 정보 추론
이 구조 덕분에 사용자는 별도의 터미널 창을 열 필요 없이, Claude Desktop 앱이나 Cursor 같은 코드 에디터의 채팅창에서 “OpenOSINT 도구를 사용해서 이 도메인의 서브도메인을 찾아줘”라고 명령할 수 있습니다. MCP 서버는 표준화된 JSON-RPC 형식으로 클라이언트의 요청을 받아 내부 도구 레지스트리에 위임하고, 그 결과를 다시 클라이언트에게 안전하게 반환합니다.
데이터 모델 및 엔티티 관계도
정보 수집 과정에서 다뤄지는 주요 데이터 단위들은 상호 유기적으로 연결됩니다. 초기 단서인 대상 데이터(Target Data)는 특정 플러그인(Tool Plugin)에 의해 분석되고, 그 결과로 새로운 증거(Evidence)가 도출됩니다. 이 증거는 다시 새로운 대상 데이터가 되어 다음 분석의 입력값으로 재사용됩니다.
%%{init: {"theme":"base","themeVariables":{"primaryColor":"#F0EEE9","primaryBorderColor":"#2a78d6","primaryTextColor":"#2b2926","secondaryColor":"#e8f0fb","secondaryBorderColor":"#4a3aa7","secondaryTextColor":"#2b2926","tertiaryColor":"#eafaf3","tertiaryBorderColor":"#1baf7a","tertiaryTextColor":"#2b2926","lineColor":"#8a8578","textColor":"#2b2926","edgeLabelBackground":"#F0EEE9","noteBkgColor":"#F0EEE9","noteTextColor":"#2b2926","noteBorderColor":"#8a8578","clusterBkg":"#faf9f6","clusterBorder":"#d8d4c8","fontFamily":"Pretendard, sans-serif"}}}%%
erDiagram
TargetData {
string target_id
string target_type
}
ToolPlugin {
string plugin_name
string require_key
}
Evidence {
string evidence_data
string timestamp
}
TargetData ||--o{ ToolPlugin : analyzed_by
ToolPlugin ||--o{ Evidence : produces
TargetData ||--o{ Evidence : owns