LLM 에이전트 보안, AgentCore로 프롬프트 인젝션 완벽 방어!

by DD
1일 전
조회수 6

LLM 에이전트의 프롬프트 인젝션(Prompt Injection) 취약점으로 인한 사용자 데이터 노출 및 보안 사고 방지가 핵심 과제임

보안 경계(Security Boundary)를 LLM 외부에 두어, 모델의 확률적 한계를 시스템 차원에서 보완하는 다층 방어 설계가 필수적임

Amazon Bedrock AgentCore를 활용하여 JWT 기반 인증(Authentication) 및 인가(Authorization) 파이프라인을 구축하고, Row Level Security(RLS)를 적용하여 데이터 접근 통제 강화

에이전트 컨텍스트에 내부 식별자 노출 방지를 위해 세션별 Index Mapper와 민감 필드 스트립(Strip) 기법을 적용하여 데이터 격리(Data Isolation) 강화

프롬프트 인젝션의 근본적 한계와 다층 방어 전략

LLM은 확률적 모델이므로 프롬프트 인젝션(Prompt Injection) 공격에 완전히 면역될 수 없으며, 가장 강력한 모델조차 간접 프롬프트 인젝션(Indirect Prompt Injection)에 취약함. 본문에서는 이러한 LLM의 본질적 한계를 인정하고, 보안 경계를 LLM 외부에 두는 시스템 차원의 제어를 강조함. 이는 사용자 입력뿐 아니라 도구 응답, 메모리 요약, 검색 결과 등 신뢰할 수 없는 입력(Untrusted Input) 소스를 모두 고려한 다층 방어 전략의 필요성을 시사함. Row Level Security(RLS)와 같은 인프라 수준의 통제가 핵심이며, LLM의 판단에 의존하는 것은 근본적인 해결책이 아님을 명확히 함.

JWT 기반 인증 및 인가 파이프라인의 작동 원리

본 설계는 AgentCore RuntimeAgentCore Gateway에서 각각 JWT를 독립적으로 검증하는 이중화된 인증 구조를 채택함. AgentCore Runtime은 CUSTOM_JWT 권한 부여자(Authorizer)를 통해 초기 검증을 수행하고, AgentCore Gateway는 Interceptor Lambda를 통해 검증된 JWT를 대상 Lambda 함수로 안전하게 전파함. 이 과정에서 Authorization 헤더 전파(Header Propagation)는 명시적으로 허용되어야 하며, 세션 격리(Session Isolation)는 AgentCore Runtime의 기본 기능으로 보장됨. 최종적으로 Lambda 함수는 주입된 JWT claims에서 사용자 ID를 추출하여 백엔드 API 호출 시 사용자별 데이터 접근(User-Scoped Access)을 강제함. 이 파이프라인은 단일 진실의 원천(Single Source of Truth)으로서 토큰 관리의 복잡성을 줄이고 보안을 강화함.

Row Level Security(RLS)와 데이터 격리 아키텍처(Data Isolation Architecture)

안티 패턴으로 제시된 `user_id`를 파라미터로 받는 도구 설계 대신, 인증된 사용자의 JWT claims에서만 사용자 ID를 추출하여 사용하는 것이 핵심임. Lambda 함수는 검증된 claims의 `sub` 값을 사용하여 백엔드 쿼리를 수행하며, DynamoDB의 경우 파티션 키(Partition Key)를 `user_sub`로 설정하여 물리적인 데이터 격리를 구현함. 이는 행 수준 보안(Row Level Security, RLS)의 강력한 이점을 활용하는 것으로, 에이전트가 악의적인 프롬프트로 다른 사용자의 데이터에 접근하려 해도 DB 레벨에서 차단됨. 이 패턴은 PostgreSQL의 `current_setting('app.current_user_id')`나 OpenSearch의 세분화된 접근 제어 등 다양한 데이터스토어에 확장 가능하며, 데이터스토어 종류보다 검증된 claims를 사용하는 것이 중요함을 강조함.

Index Mapper를 통한 민감 식별자 노출 방지

RLS가 사용자 간 데이터 접근을 막더라도, 에이전트가 내부 상품 ID나 SKU 같은 민감 식별자(Sensitive Identifier)를 인지하는 것 자체는 로그 유출이나 인젝션 증폭의 위험을 내포함. 이를 해결하기 위해 세션별 Index Mapper를 도입하여, 에이전트에게는 1-based 인덱스만 노출하고 실제 ID는 런타임에서 복원하는 방식을 사용함. 또한, 에이전트로 전달되는 도구 응답에서 `resource_id`, `sku` 등의 민감 필드를 스트립(Strip)하여 모델 컨텍스트에 노출되지 않도록 함. 이 기법은 에이전트가 내부 시스템 구조(Internal System Structure)를 학습하거나 유출하는 것을 방지하며, 데이터 격리(Data Isolation)를 한층 강화함.

AgentCore Identity와 외부 서비스 연동

AgentCore Identity는 에이전트가 사용자 대신 외부 서비스(Google API, Slack 등)에 접근해야 할 때 필요한 자격 증명 교환(Credential Exchange)을 관리함. 사용자의 OIDC 토큰을 받아 대상 서비스에 필요한 토큰으로 교환하고, 수명 주기 및 회전을 관리하여 에이전트나 Lambda 함수에 장기 지속형 시크릿(Long-lived Secret)이 남지 않도록 함. 이는 서비스 간 통신(Inter-service Communication) 시 보안을 강화하고, 사용자별 스코프(User-specific Scope)를 유지하는 데 중요한 역할을 함. 결과적으로 에이전트 보안 설계는 특정 데이터스토어에 국한되지 않고, JWT 기반 인가를 지원하는 모든 백엔드 시스템으로 확장 가능함을 보여줌.

프롬프트 인젝션 방어: AgentCore 기반 다층 보안 설계 패턴