참고자료 · Sandboxing
에이전트 샌드박싱 — 5가지 격리 솔루션 비교
에이전트가 생성하거나 외부 플러그인이 실행하는 코드는 메인 개발 환경과 직접 접촉하면 안 됩니다. 이 페이지는 실무에서 자주 쓰이는 다섯 가지 격리 솔루션을 같은 축으로 비교하고, “브라우저 자동화” · “단일 함수 평가” · “컨테이너 격리” 같은 실제 시나리오에서 무엇을 고를지 정리합니다.
1. 비교 표 — 한 장으로 보는 다섯 솔루션
| 솔루션 | 격리 방식 | 시작 시간 | 언어 지원 | 비용 | 추천 시나리오 |
|---|---|---|---|---|---|
| Vercel Sandbox | Firecracker microVM (전용 커널 + 하드웨어 경계) | ~ms (snapshot) · 콜드는 의존성 설치 시간 | Amazon Linux 2023 기반 Node.js 24/22, Python 3.13, 브라우저, Chromium | Vercel 요금제 기준 · 초 단위 VM time + 네트워크 | 브라우저 자동화, 에이전트 실행 환경, AI 생성 코드 격리 테스트 |
| isolated-vm | V8 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 기본 제공 | 컨테이너보다 강한 격리가 필요할 때 · 신뢰할 수 없는 코드 실행 |
| E2B | Firecracker 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 스킬 문서에 나와 있는 기본 패턴을 단순화한 것입니다.
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 안에서 보이지 않습니다.
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. 같이 읽으면 좋은 페이지
Zero Trust 플러그인 (우산 페이지)
이 페이지의 sandbox 는 zero-trust 4계층 방어 중 두 번째 층입니다. 전체 그림을 먼저 보려면 여기로.
하네스 보안과 가드레일 (기본)
sandbox · rules · hooks · MCP governance 네 층을 기본 수준에서 소개하는 페이지입니다.
MCP 지형도
외부 도구를 붙이는 MCP 생태계 현황과 주요 서버 목록입니다.
10. Sources
- Vercel Sandbox 공식 문서: vercel.com/docs/sandbox
- @vercel/sandbox npm 패키지: npmjs.com/package/@vercel/sandbox
- laverdet/isolated-vm GitHub 저장소: github.com/laverdet/isolated-vm
- Docker 공식 문서 — 격리 개념: docs.docker.com/engine/security
- gVisor 공식 문서: gvisor.dev/docs
- Google Cloud Run — gVisor 기반 격리: cloud.google.com/run/docs
- GKE Sandbox 공식 가이드: cloud.google.com/kubernetes-engine/docs/how-to/sandbox-pods
- E2B 공식 문서: e2b.dev/docs
- Firecracker microVM 공식 사이트: firecracker-microvm.github.io