들어가며: 왜 AI 에이전트 전용 샌드박스가 필요한가?

AI 에이전트가 단순한 챗봇을 넘어 코드를 작성하고, 테스트를 실행하며, 개발 서버를 띄우는 '가상 개발자' 역할을 하기 시작했습니다. 하지만 이런 에이전트에게 '안전한 작업 공간'을 제공하는 것은 생각보다 까다로운 문제입니다.

예를 들어 에이전트가 GitHub 레포지토리를 클론하고, npm install을 실행한 뒤, 개발 서버를 구동해야 한다고 가정해 보세요. 기존에는 VM을 띄우거나 컨테이너를 직접 관리해야 했고, 다음과 같은 난관에 부딪힙니다.

  • 버스티니스(Burstiness): 세션마다 별도 샌드박스가 필요한데, 요청이 갑자기 몰리면 빠르게 많은 인스턴스를 생성해야 합니다. 하지만 대기 중인 유휴 컴퓨팅 비용을 지불하고 싶지 않죠.
  • 빠른 상태 복원: 각 세션이 빠르게 시작되고, 이전 상태를 그대로 이어받을 수 있어야 합니다.
  • 보안: 에이전트가 서비스에 접근할 수 있어야 하지만, 민감한 자격 증명(credential)을 에이전트에게 직접 맡길 수는 없습니다.
  • 제어: 샌드박스 라이프사이클, 명령어 실행, 파일 처리 등을 프로그래밍 방식으로 간단히 제어할 수 있어야 합니다.
  • 인체공학(Ergonomics): 사람과 에이전트 모두가 공통 작업을 쉽게 수행할 수 있는 단순한 인터페이스가 필요합니다.

Cloudflare는 이런 문제를 해결하기 위해 지난 6월 샌드박스 베타를 출시했고, 이제 **정식 버전(GA)**을 발표했습니다. Figma와 같은 파트너가 이미 프로덕션에서 사용 중이며, 이번 GA에서는 보안 자격 증명 주입, PTY 지원, 영구 코드 인터프리터, 스냅샷 등 대폭 개선된 기능을 만나볼 수 있습니다.

Cloudflare Sandbox dashboard showing multiple agent sessions and container instances Technical Structure Concept

핵심 기능 살펴보기

1. 보안 자격 증명 주입 (Secure Credential Injection)

에이전트 워크로드에서 가장 까다로운 문제 중 하나는 **인증(Authentication)**입니다. 에이전트가 내부 서비스에 접근해야 하는데, raw 자격 증명을 에이전트에게 완전히 신뢰할 수는 없습니다.

Cloudflare Sandboxes는 **프로그래밍 가능한 이그레스 프록시(egress proxy)**를 통해 네트워크 레벨에서 자격 증명을 주입합니다. 에이전트는 절대 자격 증명에 접근할 수 없으며, 인증 로직을 완전히 커스터마이징할 수 있습니다.

class OpenCodeInABox extends Sandbox {
  static outboundByHost = {
    "my-internal-vcs.dev": (request, env, ctx) => {
      const headersWithAuth = new Headers(request.headers);
      headersWithAuth.set("x-auth-token", env.SECRET);
      return fetch(request, { headers: headersWithAuth });
    }
  }
}

2. 진짜 터미널 (PTY 지원)

초기 에이전트 시스템은 셸 접근을 요청-응답 루프로 모델링했습니다. 명령어 실행 → 출력 수집 → 프롬프트에 다시 넣기. 이 방식은 작동하지만, 개발자가 실제로 터미널을 사용하는 방식과는 거리가 멉니다.

Cloudflare는 **PTY(Pseudo-Terminal)**를 WebSocket으로 프록시하여, xterm.js와 호환되는 실시간 터미널 세션을 제공합니다.

// Worker: WebSocket 연결을 라이브 터미널 세션으로 업그레이드
export default {
  async fetch(request: Request, env: Env) {
    const url = new URL(request.url);
    if (url.pathname === "/terminal") {
      const sandbox = getSandbox(env.Sandbox, "my-session");
      return sandbox.terminal(request, { cols: 80, rows: 24 });
    }
    return new Response("Not found", { status: 404 });
  },
};
// 브라우저: xterm.js를 샌드박스 셸에 연결
import { Terminal } from "xterm";
import { SandboxAddon } from "@cloudflare/sandbox/xterm";

const term = new Terminal();
const addon = new SandboxAddon({
  getWebSocketUrl: ({ origin }) => `${origin}/terminal`,
});
term.loadAddon(addon);
term.open(document.getElementById("terminal-container")!);
addon.connect({ sandboxId: "my-session" });

3. 영구 코드 인터프리터 (Persistent Code Interpreter)

데이터 분석, 스크립팅, 탐색적 워크플로우를 위해 영구적인 코드 실행 컨텍스트를 제공합니다. 핵심은 '영구적(Persistent)'이라는 점입니다. 일반적인 코드 인터프리터는 각 스니펫을 격리된 상태에서 실행하므로, 호출 간 상태가 사라집니다.

Sandboxes는 Jupyter 노트북처럼 변수와 임포트가 호출 간에 유지되는 컨텍스트를 생성할 수 있습니다.

// Python 컨텍스트 생성. 상태는 수명 동안 유지됩니다.
const ctx = await sandbox.createCodeContext({ language: "python" });

// 첫 번째 실행: 데이터 로드
await sandbox.runCode(`
import pandas as pd
df = pd.read_csv('/workspace/sales.csv')
df['margin'] = (df['revenue'] - df['cost']) / df['revenue']
`, { context: ctx });

// 두 번째 실행: df는 여전히 존재
const result = await sandbox.runCode(`
df.groupby('region')['margin'].mean().sort_values(ascending=False)
`, { context: ctx, onStdout: (line) => console.log(line.text) });

4. 백그라운드 프로세스와 라이브 프리뷰 URL

에이전트가 개발 서버를 시작하고, 준비 상태를 확인한 뒤, 사용자에게 라이브 링크를 공유할 수 있습니다.

// 백그라운드 프로세스로 dev 서버 시작
const server = await sandbox.startProcess("npm run dev", {
  cwd: "/workspace",
});

// 서버가 실제로 준비될 때까지 대기 — 그냥 sleep 하지 않음
await server.waitForLog(/Local:.*localhost:(\d+)/);

// 실행 중인 서비스를 공개 URL로 노출
const { url } = await sandbox.exposePort(3000);
console.log(`Preview: ${url}`);

5. 파일시스템 감시 (Filesystem Watching)

sandbox.watch()는 Linux 커널 메커니즘인 inotify를 기반으로 하는 SSE(Server-Sent Events) 스트림을 반환합니다. 에이전트가 파일 변경을 실시간으로 감지하고, 즉시 재빌드나 테스트 재실행을 트리거할 수 있습니다.

import { parseSSEStream, type FileWatchSSEEvent } from '@cloudflare/sandbox';

const stream = await sandbox.watch('/workspace/src', {
  recursive: true,
  include: ['*.ts', '*.tsx']
});

for await (const event of parseSSEStream(stream)) {
  if (event.type === 'modify' && event.path.endsWith('.ts')) {
    await sandbox.exec('npx tsc --noEmit', { cwd: '/workspace' });
  }
}

6. 스냅샷 (Snapshots) — 곧 출시 예정

개발자가 노트북을 열고 닫는 것처럼, 에이전트도 작업을 중단했다가 재개할 수 있어야 합니다. 스냅샷은 컨테이너의 전체 디스크 상태(OS 설정, 설치된 의존성, 수정된 파일, 데이터 파일 등)를 보존하고, 나중에 빠르게 복원할 수 있게 해줍니다.

class AgentDevEnvironment extends Sandbox {
  sleepAfter = "5m";
  persistAcrossSessions = {type: "disk"}; // 개별 디렉토리 지정도 가능
}

프로그래밍 방식으로 스냅샷을 생성하고 수동 복원도 가능합니다. 체크포인트를 만들거나 세션을 포크(fork)하는 데 유용합니다.

async function forkDevEnvironment(baseId: string, numberOfForks: number) {
  const baseInstance = await getSandbox(baseId);
  const snapshotId = await baseInstance.snapshot();
  const forks = Array.from({ length: numberOfForks }, async (_, i) => {
    const newInstance = await getSandbox(`${baseId}-fork-${i}`);
    return newInstance.start({ snapshot: snapshotId });
  });
  await Promise.all(forks);
}

스냅샷은 계정 내 R2에 저장되어 내구성과 위치 독립성을 보장합니다. R2의 계층형 캐싱 시스템 덕분에 전 세계 모든 리전(Region: Earth)에서 빠른 복원이 가능합니다.

참고: 스냅샷이 정식 출시되기 전에도 backuprestore 메서드를 사용할 수 있습니다. 이 메서드들도 R2를 사용해 디렉토리를 저장/복원하지만, 진정한 VM 레벨 스냅샷만큼 성능이 뛰어나지는 않습니다. 그럼에도 'axios' 레포를 클론하고 npm install 하는 데 30초가 걸리던 작업을 백업 복원으로 2초 만에 끝낼 수 있습니다.

AI agent development workflow with secure credential injection diagram Algorithm Concept Visual

가격 정책 및 한도 변경 (Active CPU Pricing)

GA와 함께 가격 정책도 변경되었습니다. 이제 **활성 CPU 사용 시간(Active CPU cycles)**에 대해서만 비용을 지불하면 됩니다. 즉, 에이전트가 LLM 응답을 기다리며 유휴 상태로 CPU를 낭비하는 시간에는 비용이 청구되지 않습니다.

인스턴스 타입동시 실행 가능 인스턴스 수 (표준 요금제)
Lite15,000
Basic6,000
대형 인스턴스1,000+

더 많은 인스턴스가 필요하다면 Cloudflare에 문의하면 됩니다.

한국 개발 생태계에서의 적용 맥락

한국에서는 AI 기반 코드 리뷰, 자동 테스트 생성, CI/CD 파이프라인 연동 등에 Cloudflare Sandboxes를 활용할 수 있습니다. 특히 다음과 같은 시나리오에서 유용합니다.

  • 대규모 SaaS 서비스의 보안 테스트: 에이전트가 격리된 환경에서 취약점을 탐색하고, 자격 증명 없이 내부 API에 접근할 수 있습니다.
  • 교육용 실습 환경: 학생들이 각자 샌드박스를 할당받아 안전하게 코드를 실행하고, 필요 시 스냅샷으로 빠르게 초기화 가능합니다.
  • AI 에이전트 기반 개발 도구: 국내 스타트업이나 SI 업체에서 에이전트가 반복적인 개발 작업(리팩토링, 마이그레이션, 테스트 작성)을 대행하도록 구성할 수 있습니다.

이 기술의 한계 또는 주의사항

  • 스냅샷의 메모리 상태 미포함 (현재): 현재 스냅샷은 디스크 상태만 보존하며, 실행 중인 프로세스의 메모리 상태는 보존되지 않습니다. 곧 라이브 메모리 스냅샷이 출시될 예정이지만, 그전까지는 실행 중인 프로세스가 스냅샷 이후 재시작됩니다.
  • 네트워크 의존성: 모든 샌드박스는 Cloudflare 네트워크를 통해 통신하므로, 인터넷 연결이 불안정한 환경에서는 성능 저하가 발생할 수 있습니다.
  • 비용 관리: Active CPU Pricing은 유휴 시간 비용을 줄여주지만, 동시 실행 인스턴스가 많을 경우 전체 비용을 모니터링해야 합니다.

Developer using terminal with Cloudflare Sandbox PTY for live debugging IT Technology Image

결론: 이제 에이전트도 진짜 개발 환경을 쓴다

9개월 전 Cloudflare는 명령어 실행과 파일 시스템 접근이 가능한 기본적인 샌드박스를 출시했습니다. 지금의 샌드박스는 완전히 다른 수준입니다.

  • 브라우저에 연결할 수 있는 터미널
  • 상태가 유지되는 코드 인터프리터
  • 라이브 프리뷰 URL을 제공하는 백그라운드 프로세스
  • 실시간 파일 변경 이벤트를 방출하는 파일시스템
  • 안전한 자격 증명 주입을 위한 이그레스 프록시
  • 거의 즉각적인 웜 스타트를 가능하게 하는 스냅샷

이 모든 기능이 결합되면, 에이전트가 실제 엔지니어링 작업을 수행하는 피드백 루프가 완성됩니다. 레포 클론 → 설치 → 테스트 실행 → 실패 읽기 → 코드 수정 → 테스트 재실행. 인간 개발자를 효과적으로 만드는 그 tight한 피드백 루프를 이제 에이전트도 누릴 수 있습니다.

SDK는 현재 v0.8.9이며, 다음 명령어로 바로 시작할 수 있습니다.

npm i @cloudflare/sandbox@latest

함께 보면 좋은 글

본 글은 Cloudflare 공식 블로그의 내용을 기반으로, 한국 개발자 커뮤니티 맥락에 맞게 재구성하였습니다.

본 콘텐츠는 신뢰할 수 있는 출처를 바탕으로 AI 도구를 활용하여 초안이 작성되었으며, 편집자의 검토를 거쳐 발행되었습니다. 전문가의 조언을 대체하지 않습니다.