agentic-harness

참고자료 · Sandboxing

에이전트 샌드박싱 — 5가지 격리 솔루션 비교

에이전트가 생성하거나 외부 플러그인이 실행하는 코드는 메인 개발 환경과 직접 접촉하면 안 됩니다. 이 페이지는 실무에서 자주 쓰이는 다섯 가지 격리 솔루션을 같은 축으로 비교하고, “브라우저 자동화” · “단일 함수 평가” · “컨테이너 격리” 같은 실제 시나리오에서 무엇을 고를지 정리합니다.

1. 비교 표 — 한 장으로 보는 다섯 솔루션

솔루션격리 방식시작 시간언어 지원비용추천 시나리오
Vercel SandboxFirecracker microVM (전용 커널 + 하드웨어 경계)~ms (snapshot) · 콜드는 의존성 설치 시간Amazon Linux 2023 기반 Node.js 24/22, Python 3.13, 브라우저, ChromiumVercel 요금제 기준 · 초 단위 VM time + 네트워크브라우저 자동화, 에이전트 실행 환경, AI 생성 코드 격리 테스트
isolated-vmV8 Isolate (in-process, isolate 별 heap 분리, 기본 128MB)~0ms (같은 Node.js 프로세스 내)JavaScript / TypeScript 한정오픈소스 · 자체 호스팅단일 함수 평가, 유저 제출 코드 실행, 가벼운 플러그인 격리
Docker 컨테이너namespace + cgroup (호스트 커널 공유)~50ms모든 언어자체 호스팅 기본 · 클라우드 컨테이너 서비스표준적인 격리 · CI 빌드 격리 · 중간 수준의 신뢰 환경
gVisor (runsc)user-space kernel (Sentry) + Gofer + seccomp~50ms (Docker 수준)Linux 바이너리 모두 (언어 무관)오픈소스, Google Cloud Run · GKE Sandbox 기본 제공컨테이너보다 강한 격리가 필요할 때 · 신뢰할 수 없는 코드 실행
E2BFirecracker microVM (내부적으로 gVisor · Firecracker 조합)~1초 (pre-warmed template)Python · TypeScript SDK 중심, AI agent template 특화SaaS 요금제 · 샌드박스 시간 단위AI 코드 인터프리터, 에이전트 도구 실행 전용 SaaS

2. Vercel Sandbox — 브라우저와 전체 OS가 필요할 때

Vercel Sandbox 는 Firecracker microVM 기반의 격리 실행 환경으로, 필요할 때마다 임시 Linux VM을 띄워서 명령을 돌리고 즉시 정리합니다. Amazon Linux 기반이라 표준 패키지 매니저 dnf 를 그대로 쓸 수 있고, 브라우저 자동화를 위한 Chromium 시스템 라이브러리도 그 안에서 설치할 수 있습니다. 공식 문서는 다음 URL 입니다 (vercel.com/docs/sandbox).

반복 실행이 잦다면 snapshot 기능으로 의존성이 미리 설치된 VM 이미지를 저장해 두고, 이후 실행은 sub-second 에 시작할 수 있습니다. 아래 코드는 Vercel 공식 sandbox 스킬 문서에 나와 있는 기본 패턴을 단순화한 것입니다.

run-sandbox.tstypescript
import { Sandbox } from "@vercel/sandbox";

async function withBrowser<T>(
  fn: (sandbox: InstanceType<typeof Sandbox>) => Promise<T>,
): Promise<T> {
  const snapshotId = process.env.AGENT_BROWSER_SNAPSHOT_ID;

  const sandbox = snapshotId
    ? await Sandbox.create({ source: { type: "snapshot", snapshotId }, timeout: 120_000 })
    : await Sandbox.create({ runtime: "node24", timeout: 120_000 });

  try {
    return await fn(sandbox);
  } finally {
    await sandbox.stop();
  }
}

// Example: run a shell command in the sandbox
export async function runCmd(cmd: string, args: string[]) {
  return withBrowser(async (sandbox) => {
    const result = await sandbox.runCommand(cmd, args);
    return await result.stdout();
  });
}

3. isolated-vm — 가벼운 JavaScript 함수 평가

전체 OS 수준의 격리는 너무 무겁고, 단지 짧은 JavaScript 함수 하나를 안전하게 평가하면 되는 상황이 있습니다. 이런 경우 laverdet/isolated-vm 같은 V8 isolate 기반 도구가 적합합니다. 같은 Node.js 프로세스 안에서 새로운 V8 isolate 를 만들고, 그 안에서 코드를 돌립니다. 메모리 한도와 실행 시간 제한을 줄 수 있고, 기본적으로 Node.js API (fs, net, child_process 등) 는 isolate 안에서 보이지 않습니다.

isolated-eval.jsjavascript
import ivm from 'isolated-vm';

async function evaluateUntrusted(code) {
  // 메모리 한도 8MB isolate
  const isolate = new ivm.Isolate({ memoryLimit: 8 });
  const context = await isolate.createContext();
  const jail = context.global;
  await jail.set('global', jail.derefInto());

  try {
    // 100ms 이상 걸리면 강제 종료
    const result = await context.eval(code, { timeout: 100 });
    return result;
  } finally {
    context.release();
    isolate.dispose();
  }
}

isolated-vm 은 Cloudflare Workers 이전 세대의 엣지 런타임 격리 방식이기도 합니다. V8 isolate 는 프로세스 단위 격리가 아니라 heap 단위 격리이기 때문에, 같은 프로세스 안에 수백 개의 isolate 를 동시에 운영할 수 있고 오버헤드가 매우 작습니다.

4. Docker — 표준 컨테이너 격리

Docker 는 가장 널리 쓰이는 격리 기술이지만, 에이전트 관점에서는 “중간 수준의 격리” 에 가깝습니다. namespace 와 cgroup 으로 프로세스와 리소스를 분리하지만, 커널은 호스트와 공유합니다. 신뢰 수준이 중간인 플러그인 (예: 내부 팀이 만든 도구) 실행에는 충분하지만, 완전히 신뢰할 수 없는 외부 코드에는 다음 절의 gVisor 같은 추가 층이 권장됩니다.

5. gVisor — 컨테이너 격리를 한 단계 강화

gVisor 는 Google 이 만든 user-space kernel 입니다. 컨테이너가 호스트 커널에 직접 시스템 콜을 보내는 대신, gVisor 의 runsc 런타임이 가로채서 user-space 에서 해석합니다. 이렇게 하면 컨테이너 안의 악성 코드가 실제 커널 취약점을 건드릴 수 있는 범위가 대폭 줄어듭니다. 공식 문서는 gvisor.dev 에 있습니다.

gVisor 는 Google Cloud Run, GKE Sandbox 같은 관리형 서비스에서 이미 기본 또는 옵션 런타임 으로 제공됩니다. 자체 호스팅 Kubernetes 에서는 runsc 를 직접 설치하고 RuntimeClass 로 붙이면 됩니다.

6. E2B — AI 코드 인터프리터에 특화된 SaaS

E2B 는 “AI 에이전트가 생성한 코드를 안전하게 실행” 이라는 시나리오에 특화된 SaaS 입니다. Firecracker microVM 위에 Python, Node.js, 패키지 매니저, Jupyter 커널 같은 코드 인터프리터 환경이 pre-warmed 상태로 준비돼 있어서, 수백 ms 안에 격리 환경을 얻을 수 있습니다. 공식 SDK 문서는 e2b.dev/docs 를 참고하시면 됩니다.

7. 어떤 상황에 무엇을 쓸지 — 의사결정 가이드

시나리오 A — 에이전트가 브라우저를 조작해야 한다

Vercel Sandbox + Chromium + agent-browser 조합을 권장합니다. snapshot 으로 의존성을 미리 구워 두면 실행 시간이 짧고, microVM 이 호스트와 완전히 분리돼 있어 브라우저가 어떤 사이트를 열어도 개발 머신에는 영향이 없습니다.

시나리오 B — 유저 제출 코드를 실시간으로 평가한다 (JavaScript)

isolated-vm 이 가장 가볍고 빠릅니다. 같은 Node.js 프로세스 안에 수백 개의 isolate 를 띄울 수 있어 동시 접속 많은 서비스에도 잘 맞습니다. 단, 네이티브 모듈 접근이 필요하면 이 옵션은 부적합합니다.

시나리오 C — 에이전트가 생성한 Python 코드 실행 + Jupyter 필요

E2B 가 가장 빠른 셋업입니다. 이미 Python · pip · Jupyter 커널이 준비돼 있어서 첫 호출부터 작업을 시작할 수 있습니다. 자체 호스팅이 필요하면 Vercel Sandbox snapshot 으로 같은 환경을 재구성할 수도 있습니다.

시나리오 D — 기존 CI 파이프라인 안에서 격리를 강화하고 싶다

이미 Docker 를 쓰고 있다면 gVisor runsc 를 RuntimeClass 로 붙이는 것이 가장 작은 변경입니다. 커널 공유를 피하고 싶을 때 합리적인 선택입니다.

시나리오 E — 완전 격리된 개발 환경이 필요하지만 여러 언어를 쓴다

Vercel Sandbox 가 현실적입니다. Amazon Linux 기반이라 대부분의 언어 런타임을 dnf 로 설치할 수 있고, 실행마다 새 VM 이라 상태가 남지 않습니다.

8. 같이 주의할 점

  • Sandbox 는 “실행 권한의 경계” 일 뿐, credential 노출이나 간접 프롬프트 인젝션을 직접 막지는 않습니다. 반드시 zero-trust 4계층 전체와 같이 써야 합니다.
  • 네트워크 접근은 기본적으로 “deny by default” 로 시작합니다. Vercel Sandbox 도 network access 를 명시적으로 허용하지 않으면 차단되며, 필요한 도메인만 allowlist 로 여는 것이 안전합니다.
  • 실행 시간과 메모리 한도를 반드시 설정합니다. 무한 루프나 메모리 폭주가 격리 환경을 넘어 호스트에 영향을 주면 안 됩니다.
  • 격리 환경의 로그는 외부로 꼭 수집합니다. 실행 내역이 없으면 사고 대응이 불가능합니다.
  • 가장 흔한 실수는 “첫 실험은 sandbox 없이 그냥 로컬에서” 하는 것입니다. 처음부터 격리 환경을 기본값으로 만드는 편이 안전합니다.

9. 같이 읽으면 좋은 페이지

10. Sources


참고자료 인덱스로 돌아가기