2026년 8월
진행 중프롬프트 공격이 뚫리는 장면과 막히는 장면을 나란히
같은 프롬프트를 모델로 직행시키는 경로와 가드레일을 통과시키는 경로로 동시에 실행하고, 두 파이프라인을 실시간으로 흘려보내는 PoC입니다. "가드레일이 없으면 어떻게 되는가"를 말로 설득하는 대신 보여줍니다. (진행 중)
- AI 보안
- LLM
- 프롬프트 인젝션
- 가드레일
- Python
- Docker
개요
“LLM 앞에 가드레일을 두자”는 말하기는 쉽고 예산 받기는 어렵습니다. 회의실에 있는 누구도 가드레일이 없을 때 무슨 일이 벌어지는지 본 적이 없기 때문입니다. 이 PoC는 그 논증을 눈으로 보게 만듭니다. 프롬프트 하나를 두 경로로 동시에 실행합니다 — 하나는 모델로 직행, 하나는 입력·출력 가드레일 경유 — 그리고 각 파이프라인 단계를 SSE로 실행되는 대로 흘려보냅니다.
무방비 경로는 실패를 실제로 재현합니다. 시스템 프롬프트가 통째로 뽑히고, 개인정보가 그대로 되돌아오고, 자격증명이 반출됩니다. 방어 경로는 그것을 정확히 어느 단계가, 왜 잡았는지 보여줍니다.

상태: 진행 중 — 가드레일의 필요성을 구체적으로 보여주기 위한 PoC.
다층 방어를 눈으로
설계의 핵심은 필터 하나는 가드레일이 아니라는 것입니다. 입력에서 놓친 요청은 나가는 길에 죽어야 합니다.
- 입력 파이프라인 — 모델에 닿기 전에 요청 자체를 차단.
- 출력 파이프라인 — 모델이 생성한 것을 검사. 입력을 말솜씨로 통과한 프롬프트도 여기서 걸립니다.
가장 명확한 사례가 카나리아 토큰입니다. 시스템 프롬프트에 심어둔 고유 표식이 응답에 나타났다면 시스템 프롬프트가 유출된 것이고, 휴리스틱 탐지와 달리 이것은 오탐이 원천적으로 불가능한 신호입니다. 다른 무엇일 수가 없습니다.
입력 파이프라인
| 단계 | 역할 |
|---|---|
normalizer | base64/hex/URL 디코딩, 제로위드스페이스·호모글리프 제거 — 인코딩으로 후속 탐지를 우회하지 못하게 |
anomaly | 길이 폭탄, 반복 플러드, 문자 체계 혼합, 위조된 대화 기록 탐지 |
secrets | API 키·토큰·개인키·DB 접속 문자열 탐지 및 마스킹, 엔트로피 검사로 플레이스홀더 제외 |
pii | 주민번호·카드번호(체크섬 검증)·연락처·계좌·이메일 탐지 및 마스킹 |
injection | 지시 무시·역할 조작·시스템 프롬프트 탈취·구분자 위조를 기법별로 채점, 여러 기법이 겹치면 가중 |
harmful | 무기·악성코드·침입·약물 분류. 실행 의도와 유해 주제가 만날 때만 점수화해 방어 목적 표현은 완화 |
rag_access | RAG 권한 접근통제 — 요청자의 권한 등급에 따라 지식베이스를 검색 단계에서 필터링 |
data_classifier | 데이터 분류 5등급 — 프롬프트 민감도를 1~5등급으로 라벨링하고 등급별 외부 AI 허용 범위를 제시 |
출력 파이프라인
| 단계 | 역할 |
|---|---|
canary | 시스템 프롬프트에 심은 카나리아 토큰이 응답에 나타나면 오탐 없이 유출 확정 |
secrets_leak / pii_leak | 응답에 자격증명·개인정보가 노출됐는지 검사 |
exfil | 마크다운 이미지·링크를 통한 데이터 반출 탐지 |
refusal_consistency | 입력 위험도가 높았는데 모델이 거절하지 않은 경우를 표시 |
같은 질의, 다른 답
가장 보여줄 만하다고 생각하는 부분이 RAG 권한 접근통제입니다. 지식베이스를 요청자 권한 등급에 따라 검색 단계에서 필터링합니다 — 외부·비로그인(CLR0), 재학생(CLR1), 교직원(CLR2), 학사관리자(CLR3). CLR1로 타 학생 성적을 조회하면 요청은 검색 단계에서 죽습니다. 모델은 그 데이터를 애초에 보지 못하므로, 유출할 수도 없습니다.

이것을 의도적으로 프롬프트 수준의 방어로 두지 않았습니다. 모델에게 “다른 학생 성적을 알려주지 마”라고 말하는 것은 부탁이고, 검색 전에 행을 걷어내는 것은 통제입니다.
점수는 합산이 아니다
위험도 점수는 단순 합산이 아니라 최악 항목 + 감쇠된 보강 근거 방식입니다. LOW가 아무리 쌓여도
CRITICAL 하나를 넘지 못합니다. 프레임워크식 채점과 비교할 수 있도록 합산 방식도 옵션으로 둡니다.
정책 프로파일은 strict / balanced / permissive 세 가지로, 임계치와 카테고리별 차단·마스킹
규칙이 다릅니다.
엔지니어링
- Python, 컨테이너화.
docker compose up이면 뜹니다. 단계 애니메이션은 SSE로 구동합니다. - 탐지기 플러그인 구조.
Detector프로토콜을 두어 오픈소스 엔진을 어댑터로 결합합니다 — Microsoft Presidio(정규식이 못 잡는 PII를 spaCy NER로 보강, full 이미지에서 완전 오프라인 동작), NVIDIA NeMo Guardrails(주제 제어·탈옥 자가검사). 둘 다 선택 사항이며, 라이브러리가 없으면 내장 탐지기로 자동 폴백합니다. POST /api/inspect는 모델을 호출하지 않고 가드레일만 실행합니다. 데모가 아니라 임베더블 게이트웨이로도 쓸 수 있게 한 지점입니다.- 테스트 69개 — 탐지기 단위, 엔진 정책, API, 그리고 라벨링된 공격 코퍼스 평가. 같은
attacks/samples.json이 데모 프리셋과 평가에 함께 쓰입니다. - CI/CD — GitHub 호스티드에서 ruff → pytest → Docker 빌드 → 컨테이너 E2E 스모크 테스트,
main푸시 시 self-hosted 러너로 배포 후 헬스체크.
만들면서 남은 것
필터를 만드는 것보다 공격을 만드는 쪽이 훨씬 많이 남았습니다. 인코딩 우회, 위조된 대화 기록, 마크다운 링크를 통한 반출 — 셋 다 단일 패스 필터를 그냥 통과합니다. 그게 실제로 뚫리는 장면을 보고 나면 두 파이프라인 구조가 꼼꼼함이 아니라 필요라는 게 납득됩니다.