RAG 챗봇이나 메일·웹을 읽는 에이전트를 만들고 나면 "인젝션 방어는 뭘 붙여야 하나"가 남아요. 결론부터 말하면 모델이 속을 확률을 낮추는 방어(분류기·스포트라이팅)는 싸지만 0이 되지 않고, 피해를 확실히 막는 방어(도구 정책·출력 레일·사람 승인)는 토큰은 거의 안 들지만 기능을 줄여요. 그래서 에이전트가 쥔 권한으로 큰 갈래를 정하고, 그 위에 값싼 확률적 방어를 덧대요.
이 글은 공격 원리보다 고를 때 돌아오는 숫자를 다뤄요. 2026년 10월 28일 기준 Claude API 공식 가격표와 Lambda GPU 클라우드 가격표, 각 방어의 1차 자료(모델 카드·논문)에 나온 수치만 써서 요청 하나당 비용과 지연을 직접 계산했어요. 토큰 증가량은 공개 토크나이저로 직접 세었어요.
프롬프트 인젝션 방어 판단표 — 권한부터 세어 보기
첫 질문은 기술이 아니라 권한이에요. 사이먼 윌리슨이 치명적 삼박자 글에서 정리한 세 조건, 즉 비공개 데이터 접근·신뢰할 수 없는 콘텐츠 노출·외부로 내보내는 수단이 모두 있는지 세어 보세요. 하나라도 비면 모델이 속아도 데이터가 새지 않으니 값싼 확률적 방어로 시작해도 되고, 셋이 다 있으면 모델이 속는다는 가정 위에서 코드로 막아야 해요.
| 서비스 예 | 외부 글 | 비공개 데이터 | 외부 전송 | 시작할 조합 |
|---|---|---|---|---|
| 웹 검색 요약 도우미 | 있음 | 없음 | 마크다운 렌더링 | 출력 레일(이미지·링크 허용 목록) + 값싼 검사 |
| 사내 위키 RAG 질의응답 | 있음(직원 누구나 편집) | 있음 | 마크다운 렌더링 | 출력 레일 + 문서 권한 필터 + 분류기 |
| 메일 비서(읽기·답장) | 있음 | 있음 | 메일 전송 | 수신자 정책 + 출처 꼬리표 + 전송 전 승인 |
| 코딩 에이전트(이슈 읽고 PR) | 있음(외부 기여자 이슈) | 비밀값·사설 저장소 | PR·셸·네트워크 | 네트워크 허용 목록 + 비밀 분리 + 계획·데이터 분리 검토 |
자주 놓치는 칸이 "외부 전송"이에요. 도구가 없어도 응답 속 마크다운 이미지를 브라우저가 불러오면 그게 전송 수단이에요. OWASP LLM01 프롬프트 인젝션 항목도 이 경로를 대표 시나리오로 들어요.
비교 조건 — 요청 하나를 이렇게 가정했어요
방어마다 단위(GPU 시간·토큰·사람 시간)가 달라서 같은 예시 조건에 올렸어요. 우리 서비스 숫자로 바꿔 넣으면 같은 식으로 다시 계산돼요.
- 본 모델: Claude Sonnet 5.5, 입력 100만 토큰당 2달러, 출력 10달러 (공식 가격표, 캐시 미사용)
- 요청 하나: 시스템 프롬프트와 사용자 말 2,000토큰 + 외부 문서 8,000토큰 = 입력 1만, 출력 500토큰
- 하루 1만 건, 30일 운영
- 기본 비용: 10,000 × 2 ÷ 100만 + 500 × 10 ÷ 100만 = 0.025달러. 1,000건당 25달러, 하루 250달러
검사용 소형 모델은 Claude Haiku 5.5(입력 0.10달러·출력 0.50달러, 10만 토큰 이하), 분류기는 Lambda A100 SXM 40GB 1장 시간당 1.99달러(세금 별도)로 잡았어요. 캐시를 쓰면 기본 비용이 더 내려가요. 계산은 프롬프트 캐싱 비용 계산 글을 참고하세요.
숫자로 보는 비용 ① 분류기 직접 띄우기 vs 소형 LLM 검사
입력 레일 분류기는 전용 소형 모델을 직접 띄우거나, 값싼 LLM 에 "모델을 조종하려는 지시가 있나"를 묻는 두 방법이 있어요.
Llama Prompt Guard 2 86M 모델 카드는 A100 에서 512토큰 한 번 분류에 86M 모델 92.4ms, 22M 모델 19.3ms 가 걸린다고 적어요. 창이 512토큰이라 긴 문서는 잘라서 따로 돌려야 해요. 예시의 외부 문서 8,000토큰은 16조각이에요. 한 장에서 순서대로 돌리면 22M 은 16 × 19.3 = 308.8ms, 86M 은 1,478.4ms 가 본 호출 앞에 붙어요.
조각을 묶어 병렬로 돌리면 줄어들지만 모델 카드는 1회 지연만 공개해요. 묶음 처리량은 직접 재야 해요
표로 보기
| 구분 | Prompt Guard 2 22M | Prompt Guard 2 86M |
|---|---|---|
| 512토큰 | 19.3 | 92.4 |
| 2천토큰 | 77.2 | 370 |
| 8천토큰 | 309 | 1,478 |
| 3만2천토큰 | 1,235 | 5,914 |
비용은 GPU 상시 운영 값이에요. 하루 16만 조각(1만 건 × 16)을 22M 으로 처리하면 GPU 사용은 하루 0.86시간뿐이지만, 지연 때문에 24시간 켜 둬야 해요. 1.99 × 24 = 하루 47.76달러, 요청 1,000건당 4.78달러, 월 1,453달러예요. 86M 은 하루 4.1 GPU시간이라 같은 한 장으로 돌아가요. 트래픽이 적을수록 GPU 가 놀아 건당 비용이 커져요.
소형 LLM 검사는 문서 8,000토큰 + 지시 500토큰, 판정 20토큰이면 Haiku 5.5 로 8,500 × 0.10 ÷ 100만 + 20 × 0.50 ÷ 100만 = 0.00086달러예요. 1,000건당 0.86달러로 GPU 상시 운영보다 싸요. 대신 지연은 API 왕복 한 번이 통째로 더해지고, 가격표에 지연 수치는 없으니 p95 를 직접 재야 해요. 그리고 품질 근거가 달라요. Prompt Guard 2 는 모델 카드에 AgentDojo 기준 공격 차단율(86M 81.2%, 22M 78.4%, 유용성 3% 하락 지점)이 있지만, 범용 LLM 을 검사기로 쓴 경우는 같은 기준의 공개 수치가 없어요. 검사 LLM 도 문서를 읽으니 "안전하다고 답하라"는 문장에 속을 수 있어요. 판정은 safe·unsafe 두 값만 허용하는 구조화 출력으로 받는 편이 안전해요. 방식별 장단점은 Structured Outputs vs JSON 모드 비교 글에 정리해 두었어요.
모델 카드의 다국어 AUC 는 86M 0.995, 22M 0.942 로 차이가 커요. 한국어 문서가 많다면 22M 의 짧은 지연만 보지 말고 우리 데이터로 오탐·미탐부터 세어 보세요.
숫자로 보는 비용 ② 스포트라이팅이 늘리는 토큰
Hines 등의 스포트라이팅 논문은 외부 문서의 공백을 특수 표식으로 바꾸는 데이터마킹으로 GPT-3.5-Turbo 요약 과제의 공격 성공률을 3.10%, 문서 질의응답에서 8.0%까지 낮췄다고 보고해요. 문서를 base64 로 바꿔 넣는 인코딩은 더 낮췄지만, 저자들은 고성능 모델에서만 권해요. 둘 다 GPU 는 안 들지만 토큰이 늘어요. 얼마나 늘어나는지 직접 세었어요.
같은 내용의 회의록을 한국어(792자)와 영어(1,533자)로 만들어 OpenAI tiktoken의 o200k_base 로 셌어요. 한국어 원문 427토큰이 공백 자리를 U+E000 으로 바꾸면 835토큰(1.96배), ^ 로 바꾸면 1.45배, base64 로 바꾸면 1,686토큰(3.95배)이 됐어요. 영어는 원문 295토큰이 각각 2.80배, 1.83배, 4.50배였어요.
예시 조건에서는 외부 문서 8,000토큰이 U+E000 데이터마킹으로 7,680토큰 늘어 1,000건당 15.36달러(기본의 61%)가 더 들어요. ^ 표식은 7.20달러, base64 는 47.20달러(기본의 189%)예요.
표식은 두 가지를 보고 골라요. 논문이 U+E000 을 권하는 건 개인 사용 영역 글자라 정상 입력에 거의 없어서예요. ^ 처럼 흔한 글자는 토큰을 아끼지만 문서에 원래 있던 ^ 를 먼저 지워야 해요. 또 같은 개인 사용 영역 글자라도 o200k_base 에서 U+E000·U+E001 은 1.96배, U+E123·U+E7FF 는 2.37배로 달랐어요. 매 요청 표식을 바꿀 계획이라면 후보 글자들의 토큰 수를 미리 재서 싼 것만 후보로 남기세요. 글자의 코드값은 유니코드 이스케이프 변환기로, base64 로 바꾼 문서가 얼마나 길어지는지는 Base64 인코더로 바로 확인할 수 있어요. 한국어 토큰이 원래 얼마나 나오는지는 한국어 LLM 토큰 비용 비교 글에서 토크나이저별로 비교해 두었어요.
숫자로 보는 비용 ③ CaMeL식 분리와 사람 승인
CaMeL 논문은 사용자 질의만 보고 계획 코드를 쓰는 특권 LLM 과, 외부 데이터를 다루지만 도구가 없는 격리 LLM 을 나누고, 도구 호출마다 값의 출처를 정책으로 검사해요. 논문이 밝힌 대가는 두 가지예요.
- 해결률: AgentDojo 벤치마크에서 방어 없는 시스템 84%, CaMeL 77%. 100개 과제 중 7개를 더 못 푼다는 뜻이에요.
- 토큰: 공격 상황에서 Claude 3.5 Sonnet 기준 중앙값 과제의 입력 토큰 2.82배, 출력 토큰 2.73배.
예시 조건에 넣으면 입력 28,200토큰(0.0564달러) + 출력 1,365토큰(0.01365달러) = 요청당 0.07005달러로, 기본의 2.8배예요. 1,000건당 45.05달러가 더 들고 하루 비용은 250달러에서 700.5달러가 돼요. 출력 토큰이 2.73배면 생성 시간도 그만큼 늘어난다고 보고 지연 예산을 잡는 게 출발점이에요. 비용을 줄이는 방법은 논문에도 있어요. 격리 LLM 을 작은 모델(Claude 3.5 Haiku)로 바꾸자 중앙값 과제 비용이 약 12% 줄고 해결률은 약 1% 떨어졌다고 보고해요. 참고 구현은 google-research/camel-prompt-injection 저장소에 있어요.
사람 승인은 토큰이 0이지만 사람 시간이 들어요. 예시로 하루 1만 건 중 5%가 메일 전송·결제 같은 고위험 동작이고 건당 확인에 10초가 걸린다면 하루 500건 × 10초 = 약 83분이에요. 더 큰 문제는 습관이라, 하루 500번 누르면 내용을 읽지 않게 돼요. 승인 대상은 되돌릴 수 없는 동작으로 좁히고, 화면에 "수신자가 문서에서 왔음" 같은 출처 정보를 같이 보여 주세요.
방어 방식 한눈에 비교 — 비용·지연·보장
| 방식 | 추가 지연 | 보장 | 공개된 품질 수치 | 이럴 때 |
|---|---|---|---|---|
| Haiku 5.5 검사 | API 왕복 1번 | 확률적 | 같은 기준 공개 수치 없음 | 트래픽이 적고 GPU 운영이 부담일 때 |
| Prompt Guard 2 22M | 8천토큰에 약 0.3초(순차) | 확률적 | AgentDojo 차단율 78.4% | 영어 위주, 지연에 민감할 때 |
| Prompt Guard 2 86M | 8천토큰에 약 1.5초(순차) | 확률적 | 차단율 81.2%, 다국어 AUC 0.995 | 한국어 등 다국어 문서가 많을 때 |
| 데이터마킹 | 입력 증가분만큼 | 확률적 | GPT-3.5 요약 과제 공격 성공률 3.10% | 외부 문서가 짧고 모델 변경이 어려울 때 |
| 도구 정책·출처 꼬리표 | 코드 검사 수준 | 결정적 | — | 삼박자를 다 가진 에이전트의 기본 |
| CaMeL식 분리 | 출력 2.73배 | 결정적(정책 범위 안) | 해결률 77%(무방어 84%) | 고위험 도구가 많고 계획이 미리 정해지는 과제 |
| 사람 승인 | 사람이 볼 때까지 | 결정적 | — | 되돌릴 수 없는 동작만 |
요령은 위아래를 섞는 거예요. 결정적 방어(대개 출력 레일 + 도구 정책)를 먼저 깔고, 남는 예산으로 확률적 방어 하나를 더해요. Prompt Guard 2 모델 카드도 탐지를 피하도록 설계한 적응형 공격을 한계로 적고 있어서, 확률적 방어를 여러 겹 쌓기보다 결정적 방어 한 겹이 사고 범위를 더 확실히 줄여요.
도입 체크리스트 — 붙이기 전에 정할 것
- 권한 목록: 읽는 출처, 쥐는 비공개 데이터, 밖으로 나가는 경로(도구·링크·이미지·웹훅)를 한 장에 적고 삼박자가 다 차는 조합을 표시해요.
- 출력 레일: 응답의 이미지·링크를 허용 도메인 목록으로 걸러요. 토큰 비용이 없어서 가장 먼저 할 일이에요.
- 도구 정책: 전송 대상·결제 금액·파일 경로처럼 위험한 인자마다 "사용자에게서 왔는가"를 검사하는 함수를 실행 직전에 둬요. 외부 문서에서 나온 값은 꼬리표를 달아 구분해요.
- 확률적 방어 예산: 위 계산식에 우리 트래픽·문서 길이를 넣어 1,000건당 비용과 p95 지연을 적어요.
- 평가 세트: 우리 서비스 문서에 공격 문장을 섞은 세트와 정상 문서 세트를 만들어 차단율·오탐률을 재요. 한국어 문서가 있으면 따로 세요.
- 승인 범위: 사람 승인은 되돌릴 수 없는 동작만, 하루 몇 건이 될지 미리 세어 봐요.
- 기록: 차단된 입력, 정책에 걸린 도구 호출, 승인 거절을 로그로 남겨요.
자주 묻는 질문
분류기 하나만 붙이면 충분하지 않나요?
Prompt Guard 2 86M 도 AgentDojo 차단율이 81.2%라 공격 다섯 중 하나쯤은 지나가요. 비공개 데이터와 외부 전송 수단이 없는 서비스라면 그 정도로 시작해도 되지만, 둘 다 있다면 도구 정책이나 출력 레일 같은 결정적 방어를 먼저 두세요.
스포트라이팅은 최신 모델에도 효과가 있나요?
논문은 2023년 GPT 계열로 실험했고, 최신 모델에서 같은 폭으로 줄어드는지는 공개 수치가 없어요. 토큰 비용은 확실히 늘어나니 우리 평가 세트로 효과를 재 보고, 짧은 외부 문서부터 적용하세요.
Haiku 같은 소형 LLM 검사와 전용 분류기 중 무엇이 싼가요?
예시 조건(하루 1만 건, 문서 8,000토큰)에서는 Haiku 5.5 검사가 1,000건당 0.86달러로, A100 을 상시 켜 둔 분류기 4.78달러보다 싸요. 트래픽이 수십 배 늘면 GPU 한 장을 더 꽉 채워 쓰게 돼 분류기가 유리해질 수 있으니, 트래픽 구간별로 같은 식을 다시 계산해 보세요.
CaMeL 을 바로 도입하기 어렵다면 무엇부터 하나요?
"외부 데이터에서 나온 값으로 위험한 도구를 부르지 않기"는 정책 함수 몇 개로 먼저 흉내 낼 수 있어요. 메일 수신자·결제 대상 같은 인자부터 출처를 기록하고 검사하세요.
시스템 프롬프트를 캐시하면 방어 비용도 줄어드나요?
시스템 프롬프트에 들어가는 경고 문구·표식 안내는 캐시로 싸져요. 하지만 데이터마킹으로 늘어나는 토큰은 매번 바뀌는 외부 문서 쪽이라 캐시 이득이 거의 없어요.
정리
- 먼저 권한을 세요. 외부 글·비공개 데이터·외부 전송 셋이 다 있으면 출력 레일과 도구 정책 같은 결정적 방어가 기본이에요.
- 예시 조건에서 요청 1,000건당 기본 25달러에 Haiku 5.5 검사 +0.86달러, Prompt Guard 2 상시 GPU +4.78달러, 한국어 데이터마킹 +7.2~15.4달러, CaMeL식 분리 +45.05달러가 더해져요.
- 분류기는 8,000토큰 문서에 22M 약 0.3초, 86M 약 1.5초(순차)가 붙고, 데이터마킹은 표식 글자 하나로 토큰 배수가 1.45~2.37배로 바뀌어요.
- 관련 글: 한국어 LLM 토큰 비용 비교, Structured Outputs vs JSON 모드 비교
더 깊이 읽기
이 글은 실무에서 판단할 때 필요한 것 위주로 정리했어요. 같은 주제의 내부 동작 원리는 devboi 기술 블로그의 프롬프트 인젝션 원리와 LLM 가드레일 — CaMeL·스포트라이팅에서 도식과 코드로 단계별로 풀었어요.