결론 먼저: 주장이 아니라 직접 찍어 확인하세요
온디바이스 AI 앱이 정말 문서 내용을 밖으로 보내지 않는지는 벤더 말을 믿을 필요 없이 본인 PC에서 5분이면 확인할 수 있습니다. AI 데이터 유출 검증의 핵심은 앱이 외부로 여는 아웃바운드 연결을 직접 들여다보는 것이고, 방법은 역량에 따라 세 단계로 나뉩니다. 가장 빠른 길은 앱 내 네트워크 자가검증과 lsof로 열린 연결을 5분 안에 확인하는 것입니다. 그다음은 방화벽으로 아웃바운드를 끊고도 인덱싱과 질의가 되는지 15분간 보는 것이고, 마지막은 패킷 캡처 도구로 트래픽을 직접 떠보는 심화 검증입니다.
법률, 회계, 금융, 공공, 의료연구, 기업보안처럼 문서를 클라우드에 올릴 수 없는 직군일수록 이 검증은 도입 전 필수 절차에 가깝습니다. 보안팀이 “데이터가 안 나간다”는 문장을 덮어놓고 신뢰하기보다 재현 가능한 증거를 직접 만드는 편이 안전하기 때문입니다.
Apioni를 예로 들면, 문서 처리는 전부 로컬(localhost) 엔진으로만 돌고 문서 내용은 기기 밖으로 나가지 않습니다. 인터넷으로 여는 연결은 두 가지뿐인데, 첫 실행 때 엔진과 모델을 한 번 내려받는 다운로드와 실행 시 apioni.com 버전 확인이 전부이며, 어느 쪽에도 문서 내용은 담기지 않습니다. 이 정상 연결 두 건까지 미리 공개해 두는 이유는 단순합니다. 검증해 보고 이것 외에 다른 연결이 보이면 알려달라는 뜻입니다.
이 글은 그 흐름의 실증 편입니다. 주장 자체는 선행 글 온디바이스 AI가 데이터를 안 내보낸다는 말의 의미에서 다뤘고, 여기서는 그 주장을 본인 손으로 재현하는 절차를 정리합니다.
무엇을 확인하려는 건가: ‘문서 내용이 밖으로 나가는가’의 정의
검증 대상을 먼저 분명히 해야 합니다. 여기서 확인하려는 것은 앱이 문서 내용을 담아 외부 서버로 보내는 아웃바운드 연결이 있는가입니다. localhost(127.0.0.1) 안에서 도는 통신은 기기를 떠나지 않으므로 검증 대상이 아닙니다.
연결은 두 종류로 나뉩니다.
- 로컬 연결: 문서 인덱싱, 임베딩, 질의응답에 쓰이는 localhost 통신. 기기 안에서만 오가며 외부로 나가지 않습니다. Apioni는 문서를 다룰 때 온디바이스 LLM(Ollama 기반 Qwen3 계열)과 임베딩 모델(bge-m3)을 모두 기기 안에서 구동하므로, 이 단계의 통신은 전부 로컬에 머뭅니다.
- 외부 연결: 인터넷 너머의 서버로 향하는 통신. Apioni의 경우 두 가지뿐입니다. 하나는 첫 실행 때 엔진과 모델을 한 번 내려받는 다운로드이고, 다른 하나는 실행 시 apioni.com으로 향하는 버전 확인입니다. 둘 다 문서 내용은 담기지 않으며, 첫 다운로드가 끝나면 이후 문서 처리는 인터넷 없이도 돌아갑니다.
따라서 검증의 목표는 “외부 연결이 0건이어야 한다”가 아닙니다. 외부로 나가는 연결이 알려진 정상 연결(버전 확인)뿐이고, 그 안에 문서 내용이 들어 있지 않은가를 확인하는 것이 목표입니다.
5분: 앱 자가검증과 lsof로 열린 연결 보기
가장 빠른 1차 검증입니다.
먼저 앱 안에서 시작합니다. Apioni는 앱 내 네트워크 자가검증 기능을 제공합니다. 이 기능을 실행하면 앱이 현재 여는 연결 목록과 그 성격을 직접 보여줍니다. 명령줄에 익숙하지 않은 사람도 화면만 보고 외부 연결 유무를 확인할 수 있다는 점이 이 방법의 장점입니다. 텔레메트리를 수집하지 않으므로, 여기서 보이는 외부 연결은 버전 확인 외에는 없어야 정상입니다.
다음으로 운영체제 차원에서 교차 확인합니다. 프로세스가 실제로 어떤 연결을 열고 있는지는 OS가 알고 있으므로, 앱의 주장과 무관하게 직접 들여다볼 수 있습니다.
macOS에서는 터미널에서 다음을 실행합니다.
lsof -i -nP | grep -i apioni
이 명령은 Apioni 프로세스가 연 네트워크 연결을 IP와 포트까지 보여줍니다. 127.0.0.1 또는 localhost로 향하는 연결은 로컬 처리이고, 외부 IP가 보인다면 그 주소가 어디인지 확인하면 됩니다.
Windows에서는 명령 프롬프트(관리자)에서 다음을 사용합니다.
netstat -ano | findstr ESTABLISHED
여기서 나온 PID를 작업 관리자의 세부 정보 탭에서 Apioni 프로세스와 대조하면, 해당 프로세스의 외부 연결 여부를 가릴 수 있습니다.
문서를 인덱싱하거나 질문을 던지는 동안 이 명령을 반복 실행해 보십시오. 문서 처리가 활발한 순간에도 외부로 새는 연결이 추가되지 않는다면, 로컬 처리라는 1차 증거가 됩니다.
15분: 방화벽으로 아웃바운드를 끊고 정상 동작 확인
연결 목록을 보는 것을 넘어, 아예 외부로 나가는 길을 막고도 앱이 동작하는지를 보면 더 강한 증거가 됩니다. 외부 통신에 의존한다면 인터넷을 끊는 순간 기능이 멈출 것이기 때문입니다.
절차는 다음과 같습니다.
- 모델 다운로드가 이미 끝난 상태에서 시작합니다. 최초 다운로드는 별도 동작이므로 뒤에서 설명합니다.
- 방화벽에서 Apioni의 아웃바운드 연결을 차단하거나, PC의 인터넷 연결 자체를 내립니다.
- 그 상태에서 폴더 인덱싱, 질의응답, 요약을 평소처럼 실행합니다.
- 기능이 그대로 동작하면, 문서 처리가 외부 통신 없이 이뤄진다는 직접 증거입니다.
이 단계에서 유일하게 영향을 받는 것은 실행 시 버전 확인 정도이며, 이는 문서 처리와 무관하므로 차단되어도 인덱싱과 질의는 정상 동작합니다. 네트워크 모니터링 AI 검증에서 “차단 후에도 핵심 기능이 살아 있는가”는 로컬 처리 여부를 가르는 가장 직관적인 기준입니다.
심화: Wireshark로 패킷을 직접 캡처하기
보안성 검토 보고서에 첨부할 정밀한 증거가 필요하다면 Wireshark 같은 패킷 분석기로 트래픽을 직접 캡처합니다. tcpdump를 선호하는 환경이라면 같은 원리로 명령줄에서 캡처해도 됩니다.
큰 흐름은 다음과 같습니다.
- Wireshark를 실행하고 인터넷에 연결된 네트워크 인터페이스에서 캡처를 시작합니다.
- 캡처 필터로 노이즈를 줄입니다. 로컬 트래픽만 보려면
host 127.0.0.1을, 외부로 나가는 트래픽만 보려면not host 127.0.0.1같은 필터로 관찰 범위를 좁힙니다. - 캡처가 도는 상태에서 Apioni로 문서를 인덱싱하고 질문을 던집니다.
- 문서 처리 중 발생하는 트래픽이 localhost 안에서만 오가는지, 외부 목적지로 향하는 패킷이 버전 확인 외에 있는지 목적지 주소(Destination) 열로 식별합니다.
문서 처리 작업과 외부 연결의 발생 시점을 함께 보면, 어떤 동작이 어떤 통신을 유발하는지 인과를 가릴 수 있습니다. 문서를 처리하는 순간에 외부 목적지로 향하는 새 연결이 생기지 않는다면, 캡처 로그 자체가 재현 가능한 증거가 됩니다.
결과 해석: 무엇이 보이면 정상이고 무엇이 의심인가
캡처와 명령 결과를 읽을 때 정상 신호와 의심 신호를 구분하는 기준은 다음과 같습니다.
정상으로 볼 수 있는 것
- localhost(127.0.0.1)로 향하는 연결. 문서 인덱싱과 질의응답에 쓰이는 로컬 처리입니다.
- 실행 직후 apioni.com 도메인으로 향하는 짧은 버전 확인 연결 한 건이 잡힙니다.
- 모델을 처음 받을 때 Ollama가 모델 저장소로 향하는 다운로드 연결. 이는 Apioni의 문서 처리 통신과 구분되는 별도 동작이며, 모델 가중치를 내려받는 것일 뿐 사용자의 문서가 담기지 않습니다.
의심해야 하는 것
- 문서를 인덱싱하거나 질문하는 순간에 맞춰 외부 IP로 발생하는, 버전 확인으로 설명되지 않는 연결이 잡힙니다.
- 문서 처리 직후 지속적으로 외부로 데이터를 올려보내는 패턴이 보입니다.
핵심은 시점 대조입니다. 문서를 다루는 행위와 외부 연결 발생이 시간상 맞물리는지를 보면, 정상 동작과 데이터 유출 의심을 구분할 수 있습니다. 특히 최초 모델 다운로드 트래픽은 Ollama가 수행하는 일회성 동작이라 인덱싱이나 질의 단계의 트래픽과 시점이 다릅니다. 이 둘을 섞어 읽으면 정상 동작을 유출로 오독하기 쉬우므로 따로 떼어 보는 편이 좋습니다.
검증 방법 비교
| 방법 | 소요 시간 | 난이도 | 확인 항목 | 산출 증거 |
|---|---|---|---|---|
| 앱 자가검증 | 1~2분 | 낮음 | 앱이 여는 연결 목록 | 화면 스크린샷 |
| lsof / netstat | 5분 | 낮음 | 프로세스별 외부 연결 유무 | 터미널 출력 로그 |
| 방화벽 아웃바운드 차단 | 15분 | 중간 | 차단 상태에서 기능 정상 동작 | 동작 화면과 차단 설정 스크린샷 |
| Wireshark 패킷 캡처 | 30분 이상 | 높음 | 문서 처리 중 트래픽 목적지 | 캡처 파일(.pcapng)과 스크린샷 |
낮은 난이도부터 시작해 필요한 만큼만 올라가면 됩니다. 보안성 검토 보고서에는 이 절차를 보안성 검토를 통과하는 법의 맥락에 맞춰 증거로 정리해 두면 활용도가 높습니다.
이 검증이 확인해 주는 것은 데이터 경로이지 모델 성능이 아닙니다. 짚어 둘 한계가 하나 있습니다. 8GB RAM 환경에서는 4B급 모델(qwen3:4b-instruct)까지가 정본이라, 클라우드의 초대형 모델보다 작고 느리며 실시간 최신 정보 검색은 클라우드 쪽이 유리합니다. 보안이 최우선이고 답의 근거를 내 문서로 한정하려는 작업에서 온디바이스가 맞아떨어집니다. Apioni는 한국어 게이트(ko-v2)로 일반 구성 대비 정답률을 14~18%포인트 높였고(자체 실측이며 표본과 조건이 한정된 수치입니다), 수치충실 게이트로 양자화(q4_K_M) 과정의 손상을 차단합니다.
자주 묻는 질문
인터넷을 완전히 끊어도 Apioni가 동작하나요?
모델 다운로드가 끝난 뒤에는 인터넷 없이 동작합니다. 문서 인덱싱, 질의응답, 요약은 모두 기기 안의 로컬 엔진에서 처리되므로 오프라인 상태에서도 그대로 쓸 수 있습니다. 처음 모델을 받을 때만 다운로드가 필요합니다.
모델 다운로드 시 Ollama가 외부와 통신하는 건 괜찮은가요?
최초 모델 다운로드는 Ollama가 모델 파일을 받아오는 별도 동작이며, 문서 내용을 외부로 보내는 것과는 다릅니다. 이 통신은 모델 가중치를 내려받는 것일 뿐 사용자의 문서가 담기지 않습니다. Apioni의 문서 처리 통신과 구분되는 동작이라는 점은 Ollama 직접 구성과 Apioni 비교에서 구조 차이로 더 살펴볼 수 있습니다.
패킷 캡처에서 localhost 트래픽과 외부 트래픽은 어떻게 구분하나요?
목적지 주소를 보면 됩니다. 목적지가 127.0.0.1이거나 localhost로 표시되면 기기 안에서만 도는 로컬 루프백 통신입니다. 문서 처리에 쓰이는 LLM과 임베딩 통신이 여기 해당합니다. 반대로 목적지가 외부 IP나 도메인이면 기기 밖으로 향하는 통신이므로, 그 주소가 무엇이고 어떤 동작에서 발생했는지 확인하면 됩니다.
이 검증 결과를 보안성 검토 보고서에 그대로 첨부해도 되나요?
가능합니다. 위 절차는 명령 출력, 차단 설정 화면, 패킷 캡처 파일처럼 재현 가능한 산출물을 남기도록 설계되어 있습니다. 검토자가 동일 절차로 같은 결과를 재현할 수 있으므로, 제3자 검증이 가능한 증거로서 보고서에 첨부하기에 적합합니다.
직접 검증해 보세요
위 절차는 본인 PC에서 그대로 재현할 수 있습니다. 14일 무료 트라이얼은 카드 정보 없이 시작되므로, 실제 업무 문서로 인덱싱과 질의를 돌리면서 앞의 검증을 직접 해 보면 됩니다.
검증 후 도입을 결정한다면 구매 페이지에서 ₩39,000 일회성 라이선스로 전환할 수 있습니다. 구독이 없고, 회사 단위 라이선스는 기기 수 제한 없이 적용되므로 보안팀이 여러 대에서 동일 검증을 반복하기에도 부담이 없습니다.