외부 API 전송 전 민감한 개인정보를 로컬 Ollama로 먼저 식별하고 마스킹하는 보안 파이프라인 구축법
외부 API 기반의 대형 언어 모델(LLM)을 기업 업무에 도입할 때 가장 먼저 맞닥뜨리는 걸림돌은 바로 ’보안’입니다. ChatGPT나 Claude 같은 강력한 외부 모델을 활용하고 싶지만, 직원이 실수로 고객의 개인정보(PII), 기업 비밀, 소스 코드 등을 프롬프트에 포함해 전송하는 순간 심각한 규제 위반 및 정보 유출 사고로 이어질 수 있기 때문입니다.
이 문제를 해결하는 가장 확실한 방법은 외부 API로 데이터를 전송하기 전, 사내 인프라 내부(On-Premise)에서 민감 정보를 완벽히 식별하고 마스킹(Masking)하는 전처리 단계를 두는 것입니다.
이 글에서는 오픈소스 LLM 구동 엔진인 로컬 Ollama 개인정보 필터링 기술을 활용하여, 외부 클라우드 API로 데이터가 넘어가기 전에 민감 정보를 실시간으로 감지하고 안전하게 변환하는 하이브리드 보안 파이프라인 구축법을 깊이 있게 다룹니다.
1. 정규식(Regex)의 한계와 로컬 Ollama의 필요성
기존의 개인정보 필터링 시스템은 주로 정규표현식(Regular Expression)이나 사전 정의된 패턴 매칭 기술에 의존해 왔습니다. 전화번호, 주민등록번호, 이메일 주소처럼 정형화된 데이터는 정규식으로도 쉽게 걸러낼 수 있습니다.
하지만 실제 비정형 텍스트 안의 개인정보는 그리 단순하지 않습니다.
- 맥락 의존성 탐지 오류: “회사 대표는 김철수입니다”에서 ’김철수’는 인명이지만, “오늘 철수(撤收) 작업을 진행합니다”에서의 ’철수’는 군사/작업 용어입니다. 정규식이나 단순 사전 매칭은 이러한 맥락을 구분하지 못해 정상적인 업무 텍스트까지 과도하게 마스킹하는 오류(False Positive)를 범합니다.
- 비정형 개인정보 식별 불가능: “서울시 마포구 아현동 레미안 아파트 101동 202호에 사는 홍길동의 연락처”와 같이 서술형으로 작성된 주소와 이름의 조합은 정규식 패턴만으로 완벽히 잡아내기 어렵습니다.
로컬 Ollama 개인정보 필터링은 바로 이 지점에서 강력한 대안이 됩니다. 네트워크가 완전히 차단된 사내 서버(로컬 환경)에서 소형 언어 모델(sLLM)을 구동하기 때문에, 외부 유출 걱정 없이 문맥을 이해하는 고성능 NLP 필터링 시스템을 구현할 수 있습니다.
2. 하이브리드 보안 파이프라인 설계 아키텍처
우리가 구축할 보안 파이프라인의 핵심 개념은 ’가역적 마스킹(Reversible Masking)’입니다. 외부 LLM에 보낼 때는 개인정보를 식별자(예: [NAME_1], [PHONE_1])로 치환하여 보내고, 외부 LLM이 답변을 생성해 돌려주면 다시 원본 데이터로 복원(Unmasking)하여 사용자에게 보여주는 구조입니다.
[사용자 입력]
│ (예: "홍길동 대리에게 010-1234-5678로 연락해줘.")
▼
┌────────────────────────────────────────┐
│ 1단계: 로컬 Ollama 개인정보 필터링 │ ◀── 사내망 내부 (On-Premise)
│ - 맥락 분석 및 민감 정보 식별 │
│ - 매핑 테이블 생성 (홍길동 -> NAME_1) │
└────────────────────────────────────────┘
│ (변환: "[NAME_1] 대리에게 [PHONE_1]로 연락해줘.")
▼
┌────────────────────────────────────────┐
│ 2단계: 외부 LLM API 전송 (OpenAI 등) │ ◀── 외부 클라우드 (Public)
│ - 비식별화된 상태로 추론 수행 │
└────────────────────────────────────────┘
│ (답변 수신: "[NAME_1] 대리에게 [PHONE_1]로 연락 요청을 보냈습니다.")
▼
┌────────────────────────────────────────┐
│ 3단계: 가역적 복원 (Unmasking) │ ◀── 사내망 내부 (On-Premise)
│ - 매핑 테이블을 기반으로 원본 복구 │
└────────────────────────────────────────┘
│ (최종 변환: "홍길동 대리에게 010-1234-5678로 연락 요청을 보냈습니다.")
▼
[최종 사용자 화면]
이 방식을 사용하면 외부 API 제공업체(OpenAI, Anthropic 등)에는 단 한 글자의 개인정보도 전송되지 않으면서도, 외부 모델의 뛰어난 논리적 추론 능력은 그대로 활용할 수 있습니다.
3. 실전 구현: Ollama 프롬프트 엔지니어링 및 파이썬 파이프라인
로컬 Ollama 환경에 적합한 sLLM(예: Llama-3-Korean-8B 또는 EEVE-Korean-10.8B)을 준비했다면, 개인정보를 정확히 식별해 JSON 형태로 반환하도록 만드는 프롬프트 엔지니어링이 핵심입니다.
Ollama 전용 마스킹 프롬프트 템플릿
시스템 프롬프트:
당신은 입력된 텍스트에서 개인정보(인명, 전화번호, 상세 주소, 이메일, 계좌번호)를 탐지하고 이를 마스킹하는 보안 필터링 시스템입니다.
반드시 아래의 JSON 구조로만 답변하세요. 다른 설명이나 사설은 절대 금지합니다.
구현 규칙:
1. 식별된 개인정보는 [NAME_1], [PHONE_1], [ADDRESS_1] 등 순차적 태그로 치환합니다.
2. 출력 JSON은 반드시 'masked_text'와 'mapping' 테이블을 포함해야 합니다.
입력 텍스트:
"마케팅팀 김지현 팀장님(010-9876-5432)에게 이번 달 보고서를 서울시 서초구 반포동 12-3번지로 발송해 달라고 전해주세요."
출력 JSON 예시:
{
"masked_text": "마케팅팀 [NAME_1] 팀장님([PHONE_1])에게 이번 달 보고서를 [ADDRESS_1]로 발송해 달라고 전해주세요.",
"mapping": {
"[NAME_1]": "김지현",
"[PHONE_1]": "010-9876-5432",
"[ADDRESS_1]": "서울시 서초구 반포동 12-3번지"
}
}
파이썬 기반의 가역적 마스킹 파이프라인 코드
아래 코드는 로컬에 구동 중인 Ollama API를 호출해 1차 마스킹을 수행한 뒤, 가상의 외부 API로 전송하고 결과를 다시 복원하는 전체 파이프라인의 예시입니다.
import requests
import json
OLLAMA_API_URL = "http://localhost:11434/api/generate"
MODEL_NAME = "eeve-korean:10.8b" # 가벼우면서도 한국어 성능이 우수한 모델 선택
def filter_personal_info(user_input):
system_prompt = (
"당신은 개인정보 필터입니다. 입력 텍스트 내의 이름, 연락처, 주소를 마스킹하고 "
"반드시 {'masked_text': '...', 'mapping': {...}} 형식의 JSON으로만 출력하세요."
)
payload = {
"model": MODEL_NAME,
"prompt": f"{system_prompt}\n\n입력: {user_input}",
"format": "json",
"stream": False
}
response = requests.post(OLLAMA_API_URL, json=payload)
result = json.loads(response.json()['response'])
return result["masked_text"], result["mapping"]
def restore_personal_info(masked_response, mapping):
restored_text = masked_response
for placeholder, original_value in mapping.items():
restored_text = restored_text.replace(placeholder, original_value)
return restored_text
# 실전 흐름 테스트
if __name__ == "__main__":
raw_input = "홍길동 과장에게 010-1111-2222로 연락하라고 전해줘."
print(f"1. 원본 입력: {raw_input}")
# 1단계: 로컬 Ollama로 마스킹
masked_text, mapping_table = filter_personal_info(raw_input)
print(f"2. 마스킹 처리 결과: {masked_text}")
print(f" 매핑 데이터: {mapping_table}")
# 2단계: 외부 API 가상 전송 (여기서는 임의의 외부 처리 결과 가정)
# 외부 LLM은 "[NAME_1] 과장에게 [PHONE_1] 번호로 연락 조치를 취했습니다." 라고 답변했다고 가정
external_llm_response = f"{masked_text.split('로')[0]} 번호로 신속히 연락 조치를 취했습니다."
print(f"3. 외부 LLM 답변 (비식별 상태): {external_llm_response}")
# 3단계: 로컬에서 다시 복원
final_output = restore_personal_info(external_llm_response, mapping_table)
print(f"4. 최종 사용자 제공 화면 (복원 완료): {final_output}")
4. 로컬 오프라인 마스킹 성능 비교표
각 기술 스택별 특징을 직관적으로 이해할 수 있도록 실제 성능 요소를 비교해 보았습니다.
| 비교 항목 | 전통적 정규표현식 (Regex) | Microsoft Presidio (오픈소스 NLP) | 로컬 Ollama (sLLM) |
|---|---|---|---|
| 한국어 문맥 이해도 | 매우 낮음 (패턴 일치만 수행) | 보통 (한국어 개체명 인식 모델 필요) | 매우 높음 (자연스러운 한국어 이해) |
| 처리 속도 (Latency) | 매우 빠름 (1ms 미만) | 빠름 (10ms~50ms 내외) | 보통 (H/W 사양에 의존적, 100ms~1s) |
| 미탐지율 (Leakage) | 높음 (신종 변칙 패턴 방어 불가) | 보통 (사전 학습 데이터 외 오류 가능) | 낮음 (유연한 문맥적 추론 가능) |
| 운영 비용 | 없음 (CPU 자원만 미량 소비) | 매우 낮음 | 보통 (GPU 서버 인프라 구축 필요) |
| 외부 데이터 전송 | 없음 (완전 로컬) | 없음 (완전 로컬) | 없음 (완전 로컬) |
5. 프로덕션 환경 도입 시 필수 고려 사항 및 해결책
로컬 Ollama를 활용한 보안 파이프라인을 실제 운영 환경에 배포할 때는 몇 가지 현실적인 문제를 마주하게 됩니다. 안정적인 시스템 구축을 위한 방안을 미리 검토해야 합니다.
GPU 인프라와 레이턴시(Latency) 병목 현상
외부 API 모델의 응답 속도도 평균 1~3초가 소요되는데, 로컬 필터링에서 추가로 수 초의 레이턴시가 더해진다면 사용자 경험(UX)이 크게 저하됩니다. 로컬 Ollama 서버에는 최적화된 하드웨어가 필수적입니다.
추론 시간은 GPU 사양과 선택한 sLLM의 파라미터 수에 따라 크게 달라지므로, 일반화된 수치를 제시하기보다 도입 전 실제 사용할 하드웨어와 모델 조합으로 직접 벤치마크를 돌려 평균·최대 레이턴시를 측정해 두는 것이 정확합니다.
이 속도 저하를 극복하기 위해 하이브리드 캐싱 모델을 권장합니다. 정규식으로 1차 필터링을 가볍게 수행하여 명백한 정형 개인정보를 먼저 도려내고, 정규식으로 판단이 애매한 문맥적 텍스트 영역만 로컬 Ollama로 보내 정밀 검증을 수행하는 방식입니다. 이렇게 하면 Ollama로 넘어가는 텍스트 비중 자체가 줄어들어 서버의 연산 부하가 낮아지는데, 실제 절감 폭은 원본 텍스트에서 정형 패턴이 차지하는 비율에 따라 달라지므로 자체 데이터로 측정해 보는 것이 좋습니다.
환각 현상(Hallucination)에 의한 매핑 테이블 유실
sLLM이 가끔 엉뚱한 포맷으로 응답을 주거나 JSON 구조를 깨뜨릴 수 있습니다. 매핑 테이블이 유실되면 원본 데이터로 복원할 수 없는 심각한 데이터 에러가 발생합니다.
- 해결책: Ollama 호출 시 반드시
format="json"옵션을 지정하여 반환 구조를 고정하고, 응답받은 JSON 구조가 파이썬 사전 형태에 부합하는지 검증하는 스키마 유효성 검사 코드를 파이프라인 내에 기본 장착해야 합니다. 스키마가 깨진 경우 예외 처리를 통해 하이브리드 정규식 기반의 백업 마스킹 레이어로 즉시 롤백되도록 이중화 장치를 마련하십시오.
6. 성공적인 보안 파이프라인 구축을 위한 로드맵
- 소형 모델 선별 및 테스트: 8B 이하의 소형 모델 중 한국어 지시 이행 능력이 검증된 모델을 Ollama에 적재합니다.
- 소규모 PoC 진행: 사내 특정 부서의 프롬프트 로그를 가공하여 마스킹 정확도와 오탐률을 수동으로 평가합니다. 오탐·미탐 비율과 검증 정확도는 부서별 텍스트 특성과 선택한 모델에 따라 달라지므로, 보편적인 기준치에 기대기보다 이 단계에서 직접 수집한 샘플로 실측하고 그 결과를 기준으로 다음 단계 진행 여부를 판단해야 합니다.
- API 게이트웨이 통합: 사내 AI 게이트웨이(예: LiteLLM, Kong Gateway 등)의 미들웨어 단에 Ollama 필터링 파이썬 스크립트를 배치하여 프롬프트가 외부로 나가기 전 무조건 거치도록 강제 구조화합니다.
- 지속적인 미세 조정(Fine-Tuning): 업무 중 발생하는 새로운 비정형 민감 정보 패턴(예: 사내 고유 프로젝트 코드명 등)이 있을 경우, 해당 키워드를 마스킹 리스트에 점진적으로 추가하고 프롬프트를 보완해 나갑니다.
외부 클라우드 인공지능 기술의 이점을 온전히 누리면서도 사내 보안 컴플라이언스를 완벽히 준수하는 것은 모든 IT 보안 책임자들의 공통된 과제입니다. 네트워크망 내부에 세워둔 로컬 Ollama 개인정보 필터링 파이프라인은 데이터 통제권을 외부에 넘겨주지 않으면서도 스마트한 보안 필터를 완성하는 가장 경제적이고 확실한 돌파구가 될 것입니다.