"LLM, 당신의 데이터는 안전할까?"
- sungw98
- 6월 25일
- 4분 분량
최종 수정일: 6월 26일
2022년 겨울, OpenAI가 개발한 ChatGPT가 일반 대중에게 공개되면서 본격적인 생성형 AI 시대가 활짝 열렸다. 사람과의 대화에서 자연스럽게 문맥을 이해하고, 고급 프로그래밍 코드부터 설득력 있는 글쓰기까지 다양한 작업을 수행하는 LLM(Large Language Model)의 등장으로 사용자의 생산성과 창의성은 기하급수적으로 증가했다. 전 세계 수억 명의 사용자들이 업무 자동화, 콘텐츠 제작, 문제 해결 등 다양한 영역에서 LLM을 활용하며 그 편리함과 효용성을 경험했다.
그러나 기술의 가파른 발전과 대중화 속도와 달리 AI 보안에 관한 사회적 논의는 아직 걸음마 단계에 머물고 있다. 특히 LLM 기반 서비스가 널리 보급되면서 사용자의 입력값(프롬프트)을 이용한 해킹 방식인 '프롬프트 인젝션(Prompt Injection)' 공격 사례가 증가하고 있다. 이는 전통적인 보안 취약점과 달리, 모델의 동작 원리를 이용해 시스템을 교묘히 우회하는 새로운 형태의 공격 방식이다.
LLM 에서 최종 프롬프트 (사용자 프롬프트 + 시스템 프롬프트) 처리 과정 이해 feat. 보안 검증
우리가 흔히 사용하는 ChatGPT의 화면에서 질문 입력하는 공간은 "사용자 프롬프트", 질문의 대한 대답을 "최종 프롬프트"라고 한다. 그리고 "시스템 프롬프트"는 모델의 역할과 범위의 초기 설정 지침을 얘기한다.
시스템 프롬프트는 AI의 전반적인 태도와 역할을 정의한다. 예를 들어 AI가 사용자에게 응답할 때 친절하고 정중한 태도를 유지하며, 제공하는 정보의 정확성을 최우선으로 하도록 설정한다.
더불어 시스템 프롬프트는 AI가 처리하거나 출력할 수 있는 정보의 범위를 제한하는 중요한 역할을 한다. 특히 보안이나 개인정보 보호와 같은 민감한 정보에 대해서는 출력하지 않도록 사전에 명확히 설정함으로써 AI 활용의 신뢰성과 안전성을 높인다.
허나 이것은 자연어로 작성된 명령일 뿐이기 때문에 기계적으로 강제력을 가진 문법이나 코드가 아니다. 그렇기 때문에 LLM이 이 지침을 100% 따른다는 보장이 없다.
LLM 최종프롬프트 동작 과정
순서 | 단계 | 설명 |
1 | 시스템 프롬프트 설정 | 모델이 어떻게 행동하고 응답을 생성할지를 정의(예: 개인 정보 노출 금지) |
2 | 사용자 프롬프트 입력 | 사용자가 질문이나 요청을 입력 |
3 | 모델 내부 처리 (Transformer 기반 Autoregressive) | 모델이 "시스템 프롬프트 + 사용자 프롬프트"를 연결한 최종 프롬프트를 입력받아 문맥을 파악하고 출력을 생성 |
4 | 출력 생성 | LLM이 최종 응답(출력 텍스트)을 생성 |
5 | 출력 필터링 및 보안 검증 단계 (Injection Detection) | 생성된 응답에서 민감 정보 노출, 악성 URL, 부적절한 요청이 있는지 최종 검증하여 문제가 있으면 차단하거나 보정 |
프롬프트 인젝션
프롬프트 인젝션(Prompt Injection)이란, 생성형 AI 또는 대규모 언어 모델(LLM)의 동작 원리를 악용하여, 사용자가 모델에게 입력하는 프롬프트(prompt)에 악성적인 명령이나 조작 내용을 은밀히 삽입하여 모델의 정상적인 작동을 방해하거나 악성 행동을 유도하는 공격기법이다.

즉, 사용자의 요청처럼 보이는 정상적인 프롬프트에 악성 명령을 은폐하거나 위장시켜 모델의 기존 정책을 우회하게 만들어 모델이 민감한 정보를 유출하거나 의도하지 않은 행동을 하게 하는 것을 말한다. 직접(Direct) 프롬프트 인젝션
직접 프롬프트 인젝션은 사용자가 직접 입력하는 프롬프트 자체에 명시적이고 의도적인 악성 명령을 삽입하여 모델의 원래 의도나 동작 규칙을 우회하는 공격 방식이다.
즉, 공격자가 직접 모델과의 인터페이스(예: ChatGPT 대화창)에 명령어를 입력하여 모델이 악의적으로 동작하거나 제한된 정보를 유출하게 만드는 방식이다.

간접(Indirect) 프롬프트 인젝션
간접 프롬프트 인젝션은 모델에 입력되는 정보가 제3자나 외부 콘텐츠를 통해 간접적으로 삽입되는 방식의 공격이다. 즉, 사용자는 의도하지 않았지만, 다른 콘텐츠에서 악성 프롬프트가 포함된 내용을 무의식적으로 모델에 입력하게 되는 공격이다.
이는 주로 웹사이트 콘텐츠, 소셜 미디어 게시물, PDF나 워드 문서 등 외부의 신뢰할 수 없어 보이는 소스에서 정보를 복사하거나 참조할 때, 그 과정에서 공격적인 명령어가 자동으로 삽입되어 모델이 악의적으로 동작하도록 하는 방식이다.

프롬프트 인젝션 흐름도

대응 방안
출력 필터링 계층
출력 필터링 계층은 LLM이 생성한 결과물(텍스트)을 사용자에게 전달하기 전에 최종적으로 내용을 점검하고 검증하여, 보안상 문제가 되는 내용을 차단하거나 수정하는 단계이다.
정규표현식(Regex) 기반 필터링
생성된 텍스트에서 특정 금지된 키워드(API 키, 비밀번호 등)를 탐지하여 출력에서 제거하거나 차단
Semantic Filtering (의미론적 필터링)
단순히 특정 키워드나 표현을 탐지하는 수준을 넘어, 텍스트의 의미와 의도를 분석하여 보안적 위협이나 공격 탐지한다.
벡터 기반 유사도 분석
LLM은 내부적으로 입력 문장을 벡터(Embedding) 형태로 표현할 수 있다. "민감 정보를 출력하라", "이전 지시를 무시하라" 같은 알려진 공격적 문장들을 벡터화하여 미리 저장한다.
이후 입력된 문장을 벡터화하여, 이 벡터와 미리 저장된 공격 문장의 벡터 사이의 코사인 유사도(cosine similarity)를 계산하여 특정 문장과 의미가 비슷하면 공격으로 판단하고 필터링 적용.
Spotlighting (스포트라이팅)
Microsoft의 Keegan Hines 등(2024)이 제안한 이 방식은 입력 데이터에 특정한 마커(mark) 또는 인코딩(encoding) 기법을 적용하여 콘텐츠 출처를 명확하게 드러내는 방식이다.
Delimiting (구분자)
입력 데이터를 시스템 프롬프트와 구별하기 위해 특정한 특수 기호나 문자열(<<, >> 등)을 사용하는 방식이다. 이를 통해 모델이 사용자의 입력과 시스템 지시사항을 구분하여 공격자의 명령을 무시할 수 있도록 유도한다.
Datamarking (데이터 마킹)
입력된 텍스트 전체에 특정 특수 문자를 삽입하여(^ 등) 콘텐츠를 명확히 표시하는 방식이다. 이는 단순한 구분을 넘어 입력 전체에 일관되게 특수 문자를 삽입하여, 모델이 이 입력을 시스템 명령이 아닌 순수한 데이터로 처리하도록 강제하는 방식이다.
Encoding (인코딩)
입력 텍스트를 Base64, ROT13 등으로 미리 인코딩하여 시스템 프롬프트와 명확히 구분되는 데이터로 제공하는 방식이다. GPT-4 와 같은 대규모의 크기의 모델은 이러한 인코딩 데이터를 자연스럽게 해독하여 원본 텍스트를 해석할 수 있지만, 데이터로 처리하도록 하는 기능으로 인해, 시스템 프롬프트의 통제 영역을 우회하여 모델의 반응을 조작하거나 민감한 정보를 유도해낼 가능성이 존재한다.
Polymorphic Prompt (다형성 프롬프트)
Polymorphic Prompt는 Pennsylvania State University와 Northern Arizona University 공동연구에 의해 제안된 새로운 접근법으로, 프롬프트 인젝션 공격자가 모델의 시스템 프롬프트 구조를 예측하고 악성 명령을 삽입하는 것을 방지하기 위해, 시스템 프롬프트의 구조를 매번 요청마다 동적으로 변화시키는 방법이다.
Polymorphic Prompt의 핵심 아이디어는 공격자가 프롬프트 구조를 미리 예측하고 공격 페이로드를 제작하는 것이 어렵게 만드는 것이다. 예를 들어, 사용자의 입력을 포함하는 영역을 둘러싼 구분자(Delimiter)를 지속적으로 무작위로 변경하여 공격자가 구분자를 정확히 예측하지 못하도록 한다.
Polymorphic Prompt를 이용한 실험 결과 GPT-3.5, GPT-4 등 여러 모델에서 공격 성공률이 2% 이하로 낮아졌으며, 추가적인 모델 훈련(fine-tuning) 없이 기존 시스템에 매우 가볍게 적용할 수 있다는 장점이 있다.
마지막으로
LLM은 시스템 프롬프트와 사용자 프롬프트를 연결하여 입력을 처리하는 구조적 특성으로 인해, 공격자가 시스템 프롬프트의 내용을 유출하거나 제한 규칙을 우회하는 명령을 주입할 수 있는 취약점을 내재하고 있다. 직접 프롬프트 인젝션은 공격자가 모델의 인터페이스에 명시적이고 악의적인 명령을 입력하여 LLM이 의도된 동작을 벗어나도록 유도하는 방식이며, 간접 프롬프트 인젝션은 신뢰할 수 없는 외부 콘텐츠(웹사이트, 소셜 미디어 등)를 통해 의도하지 않은 채 사용자 입력에 공격적 명령어가 삽입되는 방식으로 이루어진다.
이러한 공격의 핵심은 모델이 입력 데이터를 단순히 명령어가 아닌 데이터로 구분하지 못하고 모두 명령어로 인식할 가능성에 있으며, 특히 구조적 일관성과 명령 수행 방식을 예측 가능한 형태로 유지할 때 공격에 더욱 취약해진다. 따라서 프롬프트 인젝션 공격에 대응하기 위해서는 입력 프롬프트에 대한 철저한 검증과 함께 입력 데이터의 출처와 역할을 명확히 구분할 필요가 있다. 최근 연구들에서 제안된 'Spotlighting' 기법과 'Polymorphic Prompt' 기법은 모델 입력 시 데이터의 출처와 형식을 강조하거나 시스템 프롬프트 구조를 지속적으로 변경하는 방식으로, 공격자가 프롬프트 구조를 예측하거나 악성 명령을 주입하는 것을 어렵게 만들어 공격 성공률을 낮출 수 있음을 실험적으로 증명하고 있다.
종합적으로 기업이나 개인이 LLM을 안전하게 활용하기 위해서는 프롬프트 구조의 예측 가능성을 낮추는 변형된 구조의 채택, 입력 데이터의 출처에 따른 명확한 구분, 의미론적 필터링, 다층적 출력 검증 등을 도입해야 한다. 또한 이러한 보안 대책을 뒷받침할 구체적인 AI 윤리 및 보안 가이드라인을 마련하여 모델의 투명성과 신뢰성을 지속적으로 강화하는 것이 필수적이다.
Reference
Comments