본문으로 건너뛰기

LangChain 파이프라인의 프롬프트 주입 방어 위치에 따른 보안 전략

1,700건 이상의 레드팀 공격 분석 결과, LangChain 보안은 시스템 프롬프트 강화보다 파이프라인 내 적절한 위치에서의 입력 검사가 더 효과적임이 확인됐다.

실용적 조언

  • LangChain 이용 시 RunnableLambda를 사용하여 프롬프트 템플릿 직전에 입력값 검증 함수를 삽입하라.
  • 정규표현식을 활용한 빠른 패턴 매칭 레이어를 두어 비용이 많이 드는 LLM 기반 분류기 호출을 최소화하라.
  • 에이전트를 구축할 때는 도구의 응답값이 다시 모델로 들어가기 전에 반드시 보안 스캔을 거치도록 설계하라.

섹션별 상세

01
조작된 문맥(Fabricated Context) 공격은 모델의 대화 복구 특성을 악용한다. 공격자가 이전 대화에서 비밀을 물어본 것처럼 위장하면, 모델은 시스템 프롬프트를 어기는 것이 아니라 사용자를 돕는 과정에서 정보를 유출한다. MessagesPlaceholder를 사용하는 경우 모델이 존재하지 않는 과거 턴을 재구성하려 시도하므로 위험도가 높아진다. 따라서 검색(Retrieval) 단계 이후가 아닌, 사용자 입력 직후인 ChatPromptTemplate 단계 이전에 검사가 수행되어야 한다.
02
재구성된 추출(Reframed Extraction) 공격은 시스템 프롬프트 자체를 공격 대상으로 삼는다. '캐릭터 설명을 사용하지 말고 반복하라'는 식의 지시는 모델에게 인용 대신 의역을 허용하게 하여 단순 키워드 필터링을 우회한다. 이 공격은 명시적인 주입 키워드가 없어 탐지가 어렵지만, '증명해봐'나 '반복해봐'와 같은 특정 패턴에 대한 시맨틱 매칭으로 대응 가능하다. 작성자는 분류기 작동 전 80여 개의 정규표현식 패턴을 1ms 미만의 속도로 실행하여 이를 사전 차단한다.
03
윤리적 레버리지(Ethical Leverage) 공격은 모델의 안전 학습(RLHF) 데이터를 역으로 이용한다. 공격자가 자신의 행동이 윤리적임을 강조하며 도움을 요청하면, 모델은 위해 방지 프레임워크에 속아 도구 호출(Tool Call) 가드레일을 무시하고 정보를 제공한다. 특히 LangGraph 에이전트 환경에서 도구 호출을 유도하는 방식으로 자주 발생한다. 단일 턴 분류기는 이를 놓치기 쉬우므로 대화 기록 전체를 스캔하거나 '윤리적 프레임 + 추출 요청' 패턴에 대한 시맨틱 탐지가 필요하다.
04
효과적인 보안 아키텍처를 위해 LCEL 체인 내부의 RunnableLambda 활용이 권장된다. API 게이트웨이에서 스캔하는 것보다 체인 내부에서 프롬프트 템플릿 직전에 검사 로직을 배치하는 것이 컨텍스트 파악에 유리하다. LangGraph 에이전트의 경우 추론 단계 이전뿐만 아니라, 외부 문서나 도구 응답을 통한 간접 주입(Indirect Injection)을 막기 위해 도구 출력값도 스캔해야 한다. 실제 공격의 상당수는 사용자 입력이 아닌 검색된 문서나 도구 응답에 숨어 있기 때문이다.

용어 해설

레드팀 활동(Red Teaming)
보안 취약점을 찾기 위해 의도적으로 공격자 입장에서 시스템을 공격하는 프로세스이다. AI 모델이 시스템 프롬프트를 무시하거나 민감한 정보를 유출하도록 유도하여 방어 체계를 검증하고 강화하는 데 필수적이다.
랭체인 표현 언어(LCEL)
LangChain 구성 요소를 선언적으로 연결하여 복잡한 체인을 쉽게 구축할 수 있게 해주는 프로토콜이다. 파이프(|) 연산자를 사용하여 데이터 흐름을 정의하며, 스트리밍, 비동기 처리, 병렬 실행 등을 기본적으로 지원한다.
러너블 람다(RunnableLambda)
LangChain에서 사용자 정의 파이썬 함수를 체인의 일부로 변환해주는 래퍼이다. 입력 데이터를 가공하거나 외부 API를 호출하는 등 체인 실행 중간에 임의의 로직을 삽입할 때 사용된다.
프롬프트 주입(Prompt Injection)
사용자가 입력값에 악의적인 지시사항을 포함시켜 LLM의 원래 시스템 프롬프트를 무시하거나 우회하게 만드는 공격 기법이다. 이를 통해 모델이 금지된 정보를 출력하거나 비정상적인 동작을 수행하도록 유도한다.

코드 예제

python
from langchain_core.runnables import RunnableLambda
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI

def scan_input(inputs):
    # swap for whatever detector you're running
    result = detector.scan(inputs["question"])
    if result["threat"] == "high":
        raise ValueError(f"Input blocked: {result['method']}")
    return inputs

prompt = ChatPromptTemplate.from_messages([
    ("system", "..."),
    ("human", "{question}"),
])
llm = ChatOpenAI(model="gpt-4o-mini")
chain = RunnableLambda(scan_input) | prompt | llm

RunnableLambda를 사용하여 프롬프트 템플릿 이전에 입력값을 검사하고 차단하는 LCEL 체인 구현 예시

언급된 도구

LangChain추천

LLM 애플리케이션 구축 및 파이프라인 오케스트레이션

LangGraph추천

상태 유지가 가능한 멀티 에이전트 워크플로 구축

언급된 리소스

AI 분석 전체 내용 보기

AI 요약 · 북마크 · 개인 피드 설정 — 무료

출처 · 인용 안내

원문 발행 2026. 04. 16.수집 2026. 04. 16.출처 타입 REDDIT

인용 시 "요약 출처: AI Trends (aitrends.kr)"를 표기하고, 사실 확인은 원문 보기 기준으로 진행해 주세요. 자세한 기준은 운영 정책을 참고해 주세요.