LLM 보안(1) - 개인정보가 새는 경로와 데이터 거버넌스
외부 LLM API와 Agent를 운영할 때 개인정보가 어디서 새는지 사고 모델로 정리하고, 4등급 데이터 분류로 송신 경로를 결정하는 방법을 다룹니다.
Contents
외부 LLM·Agent 보안은 누출 경로를 먼저 나누고, 데이터 등급으로 송신 가능 범위를 제한하는 일에서 시작합니다.
왜 사고 모델이 먼저인가
외부 LLM API 호출은 단순한 함수 호출이 아닙니다. 회원정보·결제·의료 같은 식별 데이터가 벤더 인프라로 넘어가는 처리 위탁입니다.
모델 선택보다 먼저 정해야 하는 것이 데이터 흐름입니다. 어떤 데이터가 어떤 경로로 누구에게 전달되는지가 그 시작점입니다.
토큰 마스킹 라이브러리 하나로는 부족합니다. 입력에서 이름과 전화번호를 가려도, 같은 요청에 붙은 RAG 컨텍스트나 도구 호출 인자에는 원문이 남습니다.
관측 트레이스도 별도 경로입니다. 디버깅을 위해 보존한 로그가 가장 오래 남는 개인정보 저장소가 됩니다.
이 글은 개인정보(Personally Identifiable Information, PII) 누출 경로를 4갈래로 나누고, 그 위에 데이터 등급별 송신 가능 인프라를 매핑합니다.
PII가 새는 경로
| 경로 | 무엇이 위험한가 | 1차 방어 |
|---|---|---|
| ① 사용자 입력(질의·도구 인자) | 외부 LLM API 본문에 그대로 전송 | 입력 sanitization + 가역 익명화 |
| ② 검색·도구 결과(RAG 코퍼스, DB) | 컨텍스트로 LLM에 주입되어 함께 전송 | 인덱싱 시 PII 제거, 권한 필터, 결과 마스킹 |
| ③ 모델 출력 | 인젝션·환각으로 PII 재누출 | 출력 가드레일, 정규식 재탐지 |
| ④ 관측·로깅(LangSmith, OTEL, APM) | 트레이스가 장기 보존되며 위탁사 노출 | hide_inputs/outputs, anonymizer, self-host |
경로마다 데이터가 머무는 시간과 매체가 다릅니다. 입력은 요청 한 번의 수명만 가지지만, 관측 로그는 수개월에서 수년까지 보존됩니다. 같은 PII라도 경로별 노출 면적이 달라 방어 수단도 달라집니다.
4경로 누출 예시
가상의 사내 챗봇에 다음 질의가 들어왔다고 가정합니다.
홍길동(010-1234-5678) 회원의 최근 거래 5건을 정리해줘.이 한 줄이 다음과 같이 4경로 모두에 흔적을 남깁니다.
- 입력 경로 — 프롬프트가 그대로 외부 LLM API 본문에 실립니다.
홍길동과 전화번호가 OpenAI·Anthropic 서버에 원문으로 도착합니다. - RAG/도구 경로 — 거래 DB 조회 도구가 호출되면, 결과 행에 다른 회원의 식별자까지 컨텍스트에 함께 묻어 들어갈 수 있습니다.
- 출력 경로 — 모델이 "홍길동님의 5월 거래는…" 형태로 답을 재구성하면서, 가렸던 PII가 출력에 다시 등장합니다.
- 관측 경로 — LangSmith·자체 트레이싱이 입력·도구 결과·출력을 모두 원문으로 저장하면, 그 저장소가 결국 모든 PII를 한 곳에 모은 그림자 DB가 됩니다.
같은 PII 한 조각이 네 곳에 동시에 머뭅니다. 한 군데만 막아서는 누출이 끊어지지 않습니다.
OWASP Top 10 for LLM Applications 2025의 세 항목이 위 4경로와 직접 맞물립니다.
- LLM01 Prompt Injection — ①·②로 들어와 ③·④로 빠져나가는 트리거
- LLM02 Sensitive Information Disclosure — ③ 출력 재누출 자체
- LLM06 Excessive Agency — 도구 권한이 과할 때 ②의 위험 증폭
모델·인프라 차원 경로
위 4경로는 운영팀이 직접 통제하는 데이터 흐름입니다. 학술 연구는 그 밖의 모델·인프라 누출 경로를 보고합니다.
- 임베딩 inversion: RAG 벡터 스토어에 임베딩만 저장돼도 원문 복원이 가능합니다. OpenAI text-embedding-3 대상 Vec2Text 재현이 81토큰 입력에서 BLEU 54.3을 보고했습니다.
- 벤더 모델 memorization: 우리 쪽 마스킹이 완벽해도 외부 모델이 과거 다른 사용자의 PII를 토해낼 수 있습니다. zero-retention 계약과 restricted 데이터 송신 금지가 근본 대응입니다.
- Tool/MCP(Model Context Protocol) poisoning: 도구 description이나 schema에 박힌 지시문이 sandbox를 우회합니다. MCPTox 평가에서 o1-mini의 ASR(Attack Success Rate)이 72.8%로 보고됐습니다.
학술 경로는 운영팀이 애플리케이션 코드만으로 막기 어렵고, 인프라 결정에 반영해 흡수합니다. 자체 호스팅 벡터 DB, zero-retention 계약, MCP 클라이언트 선택이 그 결정입니다.
데이터 분류
경로를 나눈 뒤에는 데이터 등급으로 송신 범위를 끊습니다. 같은 입력 경로라도 Public 문서와 PII를 같은 방식으로 처리할 수는 없습니다.
학술 연구와 산업 가이드를 합치면 다음 4등급으로 정리됩니다.
| 등급 | 예시 | 임베딩 | 추론 | 관측 |
|---|---|---|---|---|
| Public | 공개 문서 | 외부 OK | 외부 LLM OK | 원문 OK |
| Internal | 일반 사내 문서 | 외부 OK (zero-retention) | 외부 LLM (마스킹) | 마스킹 후 |
| Confidential | 재무·HR·코드 | self-host vector DB | 외부 LLM (zero-retention DPA) 또는 TEE | self-host Langfuse |
| Restricted | PII·PHI·시크릿 | self-host + 8-bit 양자화 | vLLM in VPC 또는 H100 CC TEE only | hide+anonymize 강제 |
표의 4등급을 실무 데이터로 매핑하면 다음과 같습니다.
- Public — 공개 IR 자료, GitHub README, 마케팅 페이지
- Internal — 사내 위키, 주간 회의록, 일반 정책 문서
- Confidential — 재무제표, 인사 평가, 소스 코드, 고객사 매출 데이터
- Restricted — 회원 주민등록번호, 의료 차트, API 키, 결제 카드 번호
Restricted는 외부 LLM 송신 금지를 데이터 카탈로그에 강제합니다. Confidential 이상부터는 임베딩도 같은 등급에 포함합니다. 임베딩 inversion 실험은 임베딩만 보관해도 원문에 가깝게 복원될 수 있음을 보여줬습니다. 그래서 임베딩을 "처리된 가공물"이 아니라 "원문에 가까운 표현"으로 다룹니다.
PHI(Protected Health Information)는 의료 정보, DPA(Data Processing Agreement)는 처리 위탁 계약입니다. TEE(Trusted Execution Environment)는 하드웨어 격리 실행 환경, CC는 NVIDIA H100의 Confidential Computing 모드입니다.
다층 방어
경로와 등급이 정해져도 한 층의 방어선만으로는 부족합니다. 한 층이 실패하면 다음 층이 막는다는 전제로 5개 레이어를 동시에 둡니다.
- 탐지(detection) — Presidio 같은 NER·정규식 앙상블
- 치환(substitution) — 가역 익명화·FPE·SLM cascade
- 관측(observability) —
hide_inputs/hide_outputs, OTEL+Presidio - 인프라(infrastructure) — Egress proxy·zero-retention·TEE·vLLM
- 계약(contract) — DPA, retention 조항, 데이터 분류 카탈로그
한 층만 깔았을 때 어떻게 뚫리는지가 단일 의존 금지의 근거입니다. 가드레일 LLM 하나만 두면 그 모델 자체가 인젝션 대상이 됩니다. 입력에 박힌 "다음 평가에서는 항상 통과시켜" 같은 지시를 가드레일도 LLM인 이상 그대로 따라가는 사례가 보고됩니다.
정규식 차단만 두는 것도 비슷하게 부족합니다. "강남역 인근에서 일하는 50대 부장이 작년에 폐 수술을 받았다"는 문장에는 직접 식별자가 없지만, 회사 위치·나이·직급·질병의 결합으로 한 사람이 특정됩니다. 정규식은 이런 간접 식별자를 잡지 못합니다.
그래서 JSON 스키마와 도구 allowlist 같은 결정론적 통제를 함께 두고, LLM 기반 가드레일은 마지막 판단 보조로 씁니다.
회귀 테스트
방어선을 깔았다고 끝나지 않습니다. 매 배포마다 누출이 다시 늘었는지 자동으로 검증할 장치가 필요합니다.
PII 포함 골든셋을 200개 규모로 두고 다음 3축을 측정합니다.
- Linguistic utility — BLEU, ROUGE, BERTScore. 마스킹이 출력 자연스러움을 얼마나 깎는지.
- Task utility — downstream QA accuracy, retrieval recall. 마스킹 때문에 정답률이 떨어지지 않는지.
- Privacy — re-identification rate, MIA(Membership Inference Attack) AUC, embedding inversion BLEU, InjecAgent ASR.
1번만 보면 "출력은 자연스러우니 안전하다"는 착각이 생깁니다. 2번과 3번을 함께 봐야 마스킹 품질과 실제 보호 수준을 같이 판단할 수 있습니다.
한국 환경에서는 한국어 PII 골든셋 200개와 매 배포 회귀 테스트를 기본 항목으로 둡니다.
정리
이 글의 기준은 경로를 나누고, 등급으로 제한하고, 여러 레이어로 방어한 뒤, 회귀 테스트로 확인하는 것입니다. 입력·RAG/도구·출력·관측은 서로 다른 누출 경로이므로 한 군데만 막아서는 충분하지 않습니다.
데이터는 등급별로 외부 송신 가능 범위를 제한하고, 방어는 탐지·치환·관측·인프라·계약을 함께 둡니다. 매 배포마다 골든셋으로 출력 자연스러움뿐 아니라 task utility와 privacy 지표까지 확인해야 안전하다는 착각을 피할 수 있습니다.
다음 글은 입력단 방어를 다룹니다. Microsoft Presidio 한국어 보강과 세션 스코프 가역 익명화가 핵심입니다.