🟡 🛡️ 보안 게시일: · 4 분 읽기 ·

LangChain: 외부 샌드박스 없이 신뢰할 수 없는 에이전트 코드 실행하기

에디토리얼 일러스트레이션: LangChain이 QuickJS 및 WebAssembly 환경 내에서 안전하게 신뢰할 수 없는 에이전트 코드를 실행

LangChain 팀의 Hunter Lovell이 WebAssembly로 컴파일된 QuickJS 엔진 내에서 신뢰할 수 없는 에이전트 코드를 외부 샌드박스 없이 실행하는 기법을 설명합니다. 세 가지 보안 기둥과 두 개의 실험적 오픈소스 라이브러리를 개발 커뮤니티에서 이용할 수 있습니다.

🤖

이 기사는 AI가 1차 출처를 기반으로 생성했습니다.

AI 에이전트가 생성한 코드를 실행하는 것은 항상 내재적인 보안 위험을 수반해 왔습니다: 프롬프트 인젝션으로 조작된 에이전트가 악의적인 코드를 생성한다면 어떻게 될까요? 일반적인 해결책은 외부 샌드박스 — 별도의 프로세스, Docker 컨테이너 또는 가상 머신이었습니다. LangChain 팀의 Hunter Lovell은 이제 더 우아한 솔루션을 제안합니다: 신뢰할 수 없는 에이전트 코드를 프로세스 내에서 실행하되, 견고한 메모리 경계 뒤에서.

고전적 접근 방식이 충분하지 않은 이유는 무엇입니까?

외부 샌드박스는 격리 문제를 해결하지만 자체적인 복잡성을 가져옵니다: 프로세스 간 통신 지연, 복잡한 수명주기 관리, 그리고 에이전트에게 특히 고통스러운 — 인간의 승인을 요구하는 단계 간 자연스러운 상태 유지 불가.

Lovell의 기법은 핵심적인 통찰에 기반합니다: **WebAssembly(WASM)**는 외부 컨테이너 없이 단일 프로세스 내에서 충분한 경계 격리를 제공합니다. AWS, Shopify 및 Figma는 이미 프로덕션 환경에서 유사한 목적으로 WASM 경계를 사용합니다.

이 아키텍처의 세 가지 보안 기둥

Lovell은 신뢰할 수 없는 에이전트 코드를 실행하는 모든 시스템이 충족해야 하는 세 가지 조건을 정의합니다:

실행 격리. 에이전트 코드는 호스트 시스템을 손상시킬 수 없어야 합니다. WASM은 자체 선형 메모리 공간을 통해 이를 달성합니다 — 할당된 영역 외부에서 읽거나 쓸 수 없는 샌드박스 인프로세스 VM. 런타임은 실행되는 코드의 규율에 의존하지 않고 아키텍처 수준에서 메모리 및 실행 경계를 적용합니다.

기능 격리. 에이전트는 기본적으로 파일 시스템, 네트워크 또는 외부 종속성에 대한 접근을 받지 않습니다. 모든 기능은 좁은 계약으로 하네스를 통해 명시적으로 브리징되어야 합니다. 이는 아키텍처 수준에서 최소 권한 원칙을 구현합니다 — 에이전트는 프로그래밍적으로 허용된 것만 할 수 있으며, 그 이상은 없습니다.

상태가 있는 일시 중단. 실행은 중단되어 인간의 승인을 기다릴 수 있어야 하며, 컨텍스트 손실 없이 재개할 수 있어야 합니다. Lovell은 인터프리터의 선형 메모리 공간을 LangGraph 상태로 직렬화하여 이를 해결합니다 — 저장되고 프로그램이 정확히 중단된 곳에서 재개할 수 있는 스냅샷.

오케스트레이션을 위한 QuickJS 선택

사용 가능한 모든 JavaScript 엔진 중 LangChain은 QuickJS — C로 작성된 작고 빠른 ECMA 호환 런타임 — 을 선택했습니다. 이유는 세 가지입니다: WASM으로 깔끔하게 컴파일됩니다(엔진 자체가 그 옆이 아닌 경계 뒤에 있음을 의미), 오케스트레이션 스크립트에 충분히 표현적이며, 짧은 프로그램에 대해 컴파일 단계가 필요 없습니다 — 에이전트 스크립트 시작 시 레이턴시를 제거합니다.

이 모델의 에이전트는 하위 에이전트를 하나씩 디스패치하는 대신 짧은 JavaScript 오케스트레이션 스크립트를 작성합니다. 이 전환은 작업 모드를 변경합니다: 에이전트는 실행 흐름을 선언적으로 정의하고, 하네스는 기능 확인 및 명시적 브리징으로 이를 실행합니다.

Meta의 보안 원칙 참조

Lovell은 에이전트가 민감한 데이터에 접근하고, 신뢰할 수 없는 입력에 노출되며, 외부 상태를 변경하거나 외부로 통신할 수 있는 능력을 동시에 가져서는 안 된다는 Meta의 보안 원칙을 명시적으로 인용합니다. 시스템의 나머지 부분의 정교함에 관계없이 세 가지 요소 모두의 조합은 에이전트 아키텍처를 불안전하게 만듭니다.

QuickJS-WASM 접근 방식은 두 번째와 세 번째 조건을 직접 해결합니다: 기본 네트워크 또는 시스템 접근 없이는 손상된 에이전트조차 극적으로 제한된 영향 반경을 가집니다.

두 개의 새로운 오픈소스 라이브러리

글 발표와 함께 LangChain은 두 개의 실험적 오픈소스 라이브러리를 공개했습니다:

  • quickjs-rs — WASM을 통한 QuickJS용 런타임 및 Python 바인딩, 자체 구현을 위한 기반으로 개발 커뮤니티에 제공
  • langchain-quickjs — 단계 간 지속적 일시 중단 및 상태 직렬화 메커니즘을 포함하여 quickjs-rs를 LangGraph와 통합하는 Deep Agents 미들웨어

둘 다 실험적으로 표시되어 있습니다 — API는 버전 간에 변경될 수 있지만 기본 아키텍처와 보안 모델은 안정적입니다.

프로덕션 에이전트 아키텍처에 대한 시사점

생성된 코드의 신뢰할 수 있는 실행 해결은 프로덕션에서 강건한 자율 에이전트로 가는 경로에서 핵심적인 기술적 과제 중 하나입니다. 프롬프트 인젝션은 여전히 열린 문제로 남아 있습니다 — 하지만 에이전트가 성공적으로 조작된 경우에도 명시적 승인 없이 파일 시스템, 네트워크 또는 외부 서비스에 접근할 수 없다면 가능한 피해의 반경이 극적으로 줄어듭니다.

LangChain의 접근 방식은 마법의 지팡이가 아닙니다: 기능 브리징의 신중한 설계와 좁은 API 계약을 정의하는 데 있어서의 규율이 요구됩니다. 하지만 외부 컨테이너 없이, 레이턴시 타협 없이 하나의 솔루션으로 실행, 기능, 상태 격리를 해결하는 아키텍처는 2026년에 프로덕션 에이전트 시스템을 구축하는 모든 사람에게 관련 있는 발전입니다.

자주 묻는 질문

다른 JavaScript 엔진 대신 QuickJS가 선택된 이유는 무엇입니까?
QuickJS는 가볍고 ECMA 호환이며 짧은 프로그램에 대한 컴파일 단계 없이 WebAssembly로 깔끔하게 컴파일되어, 최소한의 레이턴시로 인프로세스 에이전트 오케스트레이션에 이상적입니다.
Lovell이 인용하는 Meta의 '둘의 규칙'은 무엇입니까?
보안 원칙은 에이전트가 민감한 데이터에 접근하고, 신뢰할 수 없는 입력을 수신하며, 외부 상태를 수정하는 것을 동시에 할 수 없다고 말합니다 — 이 세 가지의 조합은 아키텍처를 불안전하게 만듭니다.
이 글과 함께 발표된 오픈소스 라이브러리는 무엇입니까?
두 개의 실험적 라이브러리가 발표되었습니다 — quickjs-rs(QuickJS용 런타임 및 Python 바인딩)와 langchain-quickjs(LangGraph 통합을 위한 Deep Agents 미들웨어).