프롬프트 인젝션 대응 설계 실서비스 팀 아키텍처 테스트 가이드

작성일: 2026-06-13 | 최종 수정: 2026-06-13 | 예상 읽기 시간: 9분

프롬프트 인젝션 대응 설계는 단순히 입력 필터를 추가하는 작업이 아니라, 사용자 입력, RAG 문서, 툴 응답, 에이전트 메시지까지 포함한 컨텍스트 공급망 전체를 분리·검증·통제하는 아키텍처 전략입니다.

이 글은 LLM 보안 OWASP Top 10 적용 방법을 문서 해설이 아니라 실제 서비스 팀이 바로 적용할 수 있는 설계 패턴, 테스트 시나리오, CI 요구사항으로 바꿔 정리합니다.

목차

LLM 서비스의 공격 면을 보여주는 소프트웨어 아키텍처 다이어그램
실서비스 LLM 아키텍처에서는 사용자 입력뿐 아니라 문서, 툴 응답, 에이전트 메시지도 모두 공격 경로가 될 수 있습니다.

프롬프트 인젝션과 OWASP LLM Top 10 최소 개념

이 글은 실서비스 환경에서의 프롬프트 인젝션 대응 설계와 테스트 방법을 정리하는 실무 가이드입니다. 이미 LLM 서비스가 운영 중이어도, 막상 프롬프트 인젝션과 LLM 보안 OWASP Top 10 적용 방법을 서비스에 녹이는 단계에서 막히는 팀이 많습니다.

챗봇이 내부 지침을 그대로 노출하거나, 에이전트가 잘못된 툴콜로 환불·계정 변경 같은 실제 작업을 수행하는 위험은 더 이상 이론이 아닙니다. OWASP Top 10 for Large Language Model Applications 역시 이런 문제를 핵심 항목으로 다룹니다.

프롬프트 인젝션은 악의적이거나 교묘한 입력·컨텍스트가 시스템 프롬프트나 보안 정책을 덮어쓰거나 우회하도록 만들어, LLM이 의도하지 않은 동작을 하게 만드는 공격입니다. OWASP의 LLM01 Prompt Injection 설명도 crafted input으로 모델 동작이 달라질 수 있다고 설명합니다.

입력 경로는 단순한 사용자 메시지에 그치지 않습니다. RAG 문서, 툴 API 응답, 멀티 에이전트 메시지까지 모두 포함됩니다. 따라서 프롬프트 인젝션 대응 설계는 입력창 하나를 막는 일이 아니라 컨텍스트 공급망 전체를 통제하는 일입니다.

공격자는 반드시 사용자처럼만 들어오지 않습니다. 검색된 문서, API 응답, 다른 에이전트의 자연어 메시지도 모두 공격자가 심어둘 수 있는 컨텍스트입니다.

항목 의미 이 글의 초점
LLM01 Prompt Injection 입력·컨텍스트로 모델 조작 핵심
LLM02 Insecure Output Handling 출력을 검증 없이 실행·렌더링 핵심
LLM03 Training Data Poisoning 학습·임베딩 데이터 오염 보조
LLM04 Model Denial of Service 긴 입력·복잡한 체인으로 자원 고갈 보조

이 구조는 OWASP 공식 Top 10 페이지OWASP GenAI LLM Top 10를 기준으로 잡았습니다. 즉, 여기서 다루는 LLM 보안 OWASP Top 10 적용 방법은 LLM01을 중심으로 LLM02, LLM03, LLM04를 설계와 테스트 관점으로 번역하는 접근입니다.

Attack Surface: 어디서 프롬프트 인젝션이 들어오는가

전형적인 LLM 서비스는 대체로 아래와 같은 흐름을 가집니다. 클라이언트에서 들어온 요청은 API 게이트웨이와 백엔드를 거쳐 LLM 게이트웨이 또는 오케스트레이터로 전달되고, 그 뒤에 툴, RAG, 외부 모델 제공자가 연결됩니다.

Client(Web/Mobile/Chat)
  → API Gateway/BFF
  → App Backend
  → LLM Gateway/Orchestrator
      → Tools: DB / HTTP API / Internal Services
      → RAG Retriever & Vector DB
      → LLM Provider

에이전트형 시스템은 여기에 Agent Orchestrator → Worker Agents가 더해집니다. 오케스트레이터는 LangChain, LlamaIndex, 혹은 자체 워크플로 서비스일 수 있습니다. 이 구조에서는 OWASP LLM01이 사용자, 검색 문서, 툴 응답, 에이전트 간 메시지 어디서든 발생할 수 있습니다.

채널 LLM01 Prompt Injection LLM02 Insecure Output Handling
User ‘이전 지침 무시’ 같은 jailbreak 입력 응답을 UI가 그대로 HTML 렌더링
Context/RAG 위키·문서에 정책 무시 문구 삽입 검색된 악성 마크업이 후단에서 실행
Tools API message 필드에 조작 문구 삽입 툴 응답을 명령·쿼리로 직실행
Agent-to-Agent Planner가 Worker 역할 우회 유도 다른 에이전트 출력 신뢰 후 연쇄 실행

핵심은 모든 텍스트가 그저 중립적인 문자열이 아니라는 점입니다. 실서비스에서는 모든 텍스트가 명령이 될 가능성을 전제로 해야 하며, 이를 줄이기 위해서는 공격 면을 시각적으로 맵핑한 뒤 채널별 방어책을 설계해야 합니다.

프롬프트 인젝션 대응 설계와 테스트 요구사항을 협업하는 개발자와 보안 엔지니어 모습
프롬프트 인젝션 방어는 개발, 보안, QA, PM이 같은 요구사항으로 협업할 때 효과가 커집니다.

프롬프트 인젝션 대응 설계 패턴

시스템 프롬프트 분리 설계

가장 흔한 문제는 유저 입력, 문서, 정책 문구가 하나의 템플릿에 뒤섞이는 구조입니다. 원칙은 단순합니다. 시스템 프롬프트는 코드나 설정으로 고정하고, 사용자 입력은 별도 슬롯으로만 넣어야 합니다.

  • system_prompt: 역할, 보안 정책
  • context: RAG 결과, 내부 문서
  • user_input: 사용자 질문

또한 에이전트는 역할별로 쪼개는 것이 좋습니다. 조회 전용 에이전트는 read-only tools만, 요약 에이전트는 툴콜 없음, 액션 추천 에이전트는 실행 권한 없음으로 설계하면 하나의 인젝션이 전체 권한 상승으로 이어질 가능성을 줄일 수 있습니다.

최소 테스트 기준은 명확합니다. 유저 입력으로 역할 변경을 시도해도 실제 시스템 프롬프트 문자열이 바뀌지 않는가를 반드시 확인해야 합니다.

입력 채널 격리와 신뢰도 태깅

문제의 본질은 유저·문서·툴 응답이 모두 같은 텍스트처럼 처리된다는 데 있습니다. 해결책은 모든 텍스트 조각에 메타데이터를 붙여 신뢰 수준과 허용 가능한 행동을 분리하는 것입니다.

필드 예시
source user, wiki, crm, tool
trust_level untrusted, internal, high
allowed_actions read-only, aggregate
sensitivity public, internal, confidential

이 구조는 프롬프트 인젝션 대응 설계의 기본 뼈대입니다. LLM에는 untrusted source가 정책 변경을 요구해도 무시하라고 알려주고, 액션 레이어에서는 trust_level이 낮을 때 고위험 작업을 막습니다. 이런 분리는 OWASP Top 10이 강조하는 데이터 공급망 위험 완화에도 직접 도움이 됩니다.

툴콜과 Executor 분리

가장 위험한 구조는 LLM 출력 텍스트를 그대로 실행하는 방식입니다. OWASP는 LLM02 Insecure Output Handling에서 출력 검증 부재가 후단 취약점으로 이어질 수 있다고 경고합니다.

원칙은 LLM이 자유 텍스트 대신 제한된 JSON 스키마만 내고, 실제 비즈니스 액션은 별도 Executor가 검증 후 수행하는 것입니다. 예를 들어 action=refund, ticket_id, amount만 허용하고, Executor가 티켓 상태, 환불 한도, 권한, 감사 로그를 확인하는 식입니다.

계정 삭제나 대규모 환불 같은 고위험 액션은 반드시 사람 승인 흐름을 두는 것이 좋습니다. 최소 테스트는 스키마 밖 필드, 정책 위반 액션, 과도한 금액이 모두 거부되는지 보는 것입니다.

RAG 컨텍스트 필터링

RAG는 강력하지만 문서 자체가 공격 벡터가 될 수 있습니다. OWASP LLM01 페이지도 tools, plugins, retrieved documents를 대표적인 인젝션 경로로 봅니다.

인덱싱 단계에서는 이전 지침 무시, 시스템 정책 변경 같은 명령형 구문을 탐지해 태그를 붙이거나 제외해야 합니다. 질의 단계에서는 policy, system instruction 같은 키워드가 포함된 문서의 우선순위를 낮추고, 신뢰도가 낮은 문서는 원문 인용 대신 요약만 허용하는 방식이 효과적입니다.

런타임 방어: 탐지·완화 기법

런타임에서는 보안 필터링, 가드 모델, 출력 후처리, 토큰 가드를 겹겹이 두어야 합니다. 하나의 방어선만으로는 우회 표현과 새로운 공격 패턴을 버티기 어렵기 때문입니다.

룰 기반 필터는 ignore previous instructions, override system prompt, export all data 같은 패턴을 1차로 차단하는 데 유용합니다. 다만 표현 우회가 많기 때문에 이 레이어만 믿는 것은 위험합니다.

가드 모델은 메인 모델 앞뒤에서 보안 심사기로 동작합니다. 입력과 컨텍스트, 메타데이터를 보고 시스템 지침 무시, 권한 상승, 대량 데이터 추출, 고위험 액션 시도를 Y/N로 판정하게 할 수 있습니다. 출력 가드는 같은 방식으로 기밀정보, 개인정보, 실행 가능 코드 존재 여부를 평가합니다.

QA 자동화 관점에서는 is_safe, risk_types, reasons처럼 구조화된 필드가 있어야 검증이 쉬워집니다. 즉, 자연어 설명만 내놓는 가드보다 기계가 판정 가능한 응답을 내는 가드가 운영에 적합합니다.

LLM의 런타임 방어 기법과 다층 보안 메커니즘을 시각화한 이미지
실무에서는 입력 필터, 가드 모델, 출력 검증, 토큰 제한을 한 층씩 조합하는 다층 방어가 기본입니다.

출력 후처리는 LLM02 Insecure Output Handling 대응의 핵심입니다. 이메일, 전화번호, 키, 내부 URL, <script> 같은 패턴을 스캔한 뒤 block, mask, allow 정책으로 나누어 처리해야 합니다. 프론트엔드 렌더러는 기본값을 이스케이프로 두는 편이 안전합니다.

또한 OWASP는 LLM04 Model Denial of Service를 별도 위험으로 다룹니다. 긴 프롬프트, 과도한 컨텍스트 문서, 툴 반복 호출은 성능과 비용을 무너뜨릴 수 있습니다. 따라서 max_input_tokens, max_context_docs, max_response_tokens, 사용자별 요청 제한을 반드시 둬야 하며, 이상 토큰 사용량은 쿨다운이나 차단으로 이어져야 합니다.

LLM 보안 OWASP Top 10 적용 방법: 테스트 가능한 요구사항으로 바꾸기

문서를 읽는 것만으로는 운영이 바뀌지 않습니다. LLM 보안 OWASP Top 10 적용 방법은 각 위험을 설계 요구사항과 테스트 케이스로 번역하는 순간 비로소 실무가 됩니다.

ID 위험 설명 테스트 유형 대표 케이스
LLM01 시스템 지침 우회 시도 수동/자동 pi_ignore_system_prompt
LLM02 응답이 실행 가능한 출력인지 자동 ioh_xss_payload_render
LLM03 데이터 공급망 오염 점검 리뷰/감사 tdp_dataset_source_review
LLM04 초장문 입력·반복 호출 안정성 성능/부하 dos_long_prompt_stress

역할별 적용도 분명해야 합니다. 백엔드 개발자는 시스템 프롬프트가 코드·설정으로 고정됐는지와 LLM 응답 직실행 구간을 찾아야 하고, 보안 엔지니어는 LLM01~04 위협 모델을 문서화해야 합니다. QA는 tests/security/llm/ 아래에 프롬프트 인젝션 테스트와 출력 처리 케이스를 분리해 자동화하고, PM은 기능 명세서에 고려한 OWASP 항목과 대응 방안 섹션을 명시해야 합니다.

  • 개발자: 시스템 프롬프트 고정 여부, 응답 직실행 제거
  • 보안 엔지니어: LLM01~04 위협 모델, 레드팀 시나리오 설계
  • QA: 보안 테스트 경로 분리, CI 연동
  • PM: 요구사항 문서에 보안 대응 명시

이런 구조는 OWASP GenAI LLM Top 10을 팀의 공용 언어로 바꾸는 데 특히 유용합니다.

프롬프트 인젝션 테스트와 CI 파이프라인

MVP 단계라면 LLM01, LLM02 최소 시나리오부터 시작해도 충분합니다. 반면 엔터프라이즈 환경이라면 LLM01~04와 데이터 노출 관련 항목까지 확장하는 편이 바람직합니다. 중요한 것은 처음부터 완벽함이 아니라 계속 돌릴 수 있는 테스트 체계를 갖추는 것입니다.

시나리오 기대 동작 커버 항목
정책 노출 요청 원문 대신 거부 또는 요약 LLM01, LLM02
모든 고객 데이터 표 요청 권한 없음 경고, 대량 노출 금지 LLM01
<script> 출력 요청 이스케이프 또는 차단 LLM02

자동화는 YAML 또는 JSON 기반으로 관리하면 좋습니다. 예를 들어 id, risk, input, expected.decision 필드를 두고 pytest, Playwright, Postman과 연결하면 각 계층에서 같은 시나리오를 재사용하기 쉽습니다.

CI 파이프라인에서는 보안 테스트 실패 시 빌드나 배포를 막아야 합니다. 운영 단계에서는 security_block_rate, policy_violation_rate, abnormal_token_usage 같은 메트릭을 관찰하고, 새로운 우회 패턴이 발견되면 룰·가드 프롬프트·테스트 케이스를 함께 갱신해야 합니다.

미니 케이스 스터디

RAG 기반 내부 지식 검색 챗봇

구조는 Web UI → Backend → RAG Retriever & Vector DB → LLM입니다. 이 경우에는 시스템 프롬프트, 유저 입력, 컨텍스트를 물리적으로 분리하고, 인덱싱 시 정책 변경 문구가 포함된 문서에 태그를 부여하는 패턴이 효과적입니다.

응답 후에는 기밀 등급 문장이 감지되면 마스킹하거나 요약만 제공해야 합니다. 이는 LLM01 Prompt Injection과 LLM02를 동시에 낮추는 전형적인 방식입니다.

에이전트 기반 고객 지원 자동화

구조는 Agent Orchestrator → Tools(티켓, 결제, CRM) → LLM입니다. 이 환경에서는 각 에이전트별로 allowed_tools, allowed_actions를 제한하고, 툴콜은 JSON 스키마와 Executor 검증 레이어를 반드시 거치게 해야 합니다.

환불, 계정 잠금 같은 고위험 액션은 휴먼 인 더 루프를 기본값으로 두는 것이 좋습니다. 여기에 가드 모델이 권한 상승이나 대량 데이터 조작 시도를 먼저 평가하면 안정성이 크게 높아집니다.

사례 적용 패턴 커버 항목
내부 지식 챗봇 슬롯 분리, 문서 태깅, 출력 마스킹 LLM01, LLM02
고객 지원 에이전트 역할 분리, Executor, 사람 승인 LLM01, LLM02

프롬프트 인젝션 체크리스트와 요약

먼저 실서비스 팀이 바로 점검할 수 있는 프롬프트 인젝션 체크리스트입니다.

질문 아니오 부분 적용
시스템 프롬프트가 코드·설정으로 고정돼 있는가
유저·문서·툴 응답에 source, trust_level, allowed_actions를 붙이는가
고위험 액션이 LLM 직실행이 아니라 검증·승인 레이어를 거치는가
RAG 문서와 검색 결과에 인젝션성 문구 필터링·태깅이 있는가

다음은 OWASP LLM Top 10 체크리스트입니다.

위험 설계 코드 테스트
LLM01 프롬프트 슬롯 분리, 메타데이터 태깅 prompt_builder, orchestrator pi_ignore_system_prompt
LLM02 출력 검증, 렌더링 이스케이프 output_filter, ui_renderer ioh_xss_payload_render
LLM04 토큰·요청 제한 rate_limit, token_guard dos_long_prompt_stress

이번 스프린트 안에 할 일은 세 가지면 충분합니다.

  1. 현재 아키텍처의 attack surface 맵을 그립니다.
  2. 최소 10개의 프롬프트 인젝션·출력 처리 테스트를 수동 또는 자동으로 추가합니다.
  3. 다음 릴리즈까지 적용할 설계 개선 2~3개를 고릅니다. 예를 들면 시스템 프롬프트 분리, 툴콜 Executor 도입, RAG 문서 태깅입니다.

결론적으로 프롬프트 인젝션 대응 설계는 단발성 패치가 아니라 아키텍처, 개발, 테스트, 운영 전반에 녹아야 하는 장기 전략입니다. 그리고 그 출발점은 거대한 보안 플랫폼이 아니라, 오늘 바로 적용할 수 있는 작은 분리, 검증, 자동화입니다.

자주 묻는 질문 (FAQ)

프롬프트 인젝션 대응 설계는 입력 필터만 잘 두면 충분한가요?

아닙니다. 입력 필터는 첫 방어선일 뿐이며, 시스템 프롬프트 분리, 신뢰도 태깅, 툴콜 검증, 출력 후처리, 토큰 제한까지 포함한 다층 방어가 필요합니다.

RAG를 쓰는 서비스에서 가장 먼저 점검할 부분은 무엇인가요?

문서 검색 품질보다 먼저 컨텍스트 안전성을 점검해야 합니다. 인덱싱 단계에서 명령형 문구를 태깅하거나 제외하고, 질의 단계에서 신뢰도 낮은 문서의 영향력을 제한하는 것이 중요합니다.

LLM 보안 OWASP Top 10 적용 방법을 실무에 정착시키려면 어떻게 시작해야 하나요?

가장 현실적인 시작점은 위험 항목을 테스트 케이스로 바꾸는 것입니다. LLM01, LLM02부터 대표 시나리오를 만들고 CI에서 실패 시 배포를 막도록 연결하면 팀의 운영 방식이 빠르게 달라집니다.

에이전트형 서비스에서는 어떤 부분이 특히 위험한가요?

에이전트형 서비스는 자연어 지시가 실제 툴 실행으로 이어질 수 있어 위험합니다. 따라서 역할 분리, 허용 툴 제한, JSON 스키마 강제, Executor 검증, 사람 승인 흐름이 필수에 가깝습니다.

출처 및 참고자료

댓글 남기기