"Tools & Sandboxing — 에이전트가 행동하는 영역 (하네스 시리즈 4/6)"

모델은 추론한다. 하네스는 행동한다. 도구 호출이 잘못되면 에이전트가 사용자 시스템을 망가뜨릴 수 있다. 이 글은 그 행동 영역의 안전 설계를 다룬다.

시리즈 (6편)

  1. 하네스 엔지니어링이란
  2. Context Engineering
  3. Memory Systems
  4. Tools & Sandboxing ← 이 글
  5. Multi-Provider Routing
  6. Evaluation & Ops

1. 도구 = 모델의 손

LLM은 추론만 한다. 파일을 읽고, 명령을 실행하고, API를 호출하는 은 별도 컴포넌트 — 도구다.

Claude Code 분석 (arXiv 2604.14228) 인용: "When your agent reads a file, the harness decides whether the read is allowed, what happens to the result, and how much of the response fits in the next prompt. The model never touches the file system directly."

이게 핵심이다. 모델 ↔ 시스템 사이에 항상 하네스가 있다.


2. Tool Spec — 모델이 도구를 부르는 방법

Function Calling (OpenAI)

{
  "name": "read_file",
  "description": "Read a file from disk",
  "parameters": {
    "type": "object",
    "properties": {
      "path": {"type": "string"}
    }
  }
}

Tool Use (Anthropic)

같은 구조이지만 응답에 tool_use 블록 별도 존재. Claude Code/Cursor가 이걸 사용.

MCP (Model Context Protocol)

  • Anthropic이 2024-11에 공개한 프로토콜
  • 서버가 도구를 노출하면 어떤 클라이언트든 사용 가능
  • Claude Code, Cursor, Codex CLI 모두 MCP 서버 지원

Skills (CLAUDE.md 패턴)

  • 도구가 아니라 재사용 가능한 절차를 캡슐화
  • 트리거(키워드)로 활성화
  • Claude Code, OpenClaw가 이 패턴 사용

3. Permission System — 무엇을 막을 것인가

Claude Code: 7가지 permission 모드 + ML 기반 분류기 (arXiv 2604.14228)

Claude Code의 7-mode 시스템 (2026)

  1. default — 매 도구 호출마다 사용자 확인
  2. acceptEdits — 파일 편집은 자동, 나머지는 확인
  3. bypassPermissions — 모든 도구 자동 (위험)
  4. plan — 도구 사용 안함, 계획만
  5. doNotAllow — 명시 차단 목록
  6. allow — 명시 허용 목록
  7. dynamic — ML 분류기로 안전 판단

권한 설계 원칙

  • 기본 deny, 화이트리스트로 허용
  • 디렉터리 단위 격리: /Users/foo/project/** 허용, ~/.ssh 차단
  • Bash 명령은 프리픽스 매칭 권장: git status 허용, git push --force 차단

CLAUDE.md 권한 패턴

{
  "permissions": {
    "allow": ["Read(./**)", "Bash(git status)", "Bash(npm test:*)"],
    "deny": ["Read(~/.ssh/*)", "Bash(rm -rf:*)", "Bash(curl http*)"]
  }
}

4. Sandboxing — 격리의 단계

4-1. Process Isolation

  • 별도 프로세스에서 도구 실행
  • 메인 에이전트 프로세스가 죽지 않음
  • 가벼움, 보호 약함

4-2. Container (Docker)

  • 파일시스템 분리
  • 네트워크 정책 가능
  • 메모리/CPU 제한
  • 도구 호출 단위로 컨테이너 spin up도 가능

4-3. VM Isolation

Cursor 3 (2026-04 출시): "Cursor Cloud Agents run autonomous coding tasks in isolated Linux VMs with full dev environments"

  • 완전한 OS 격리
  • 가장 안전, 가장 무거움
  • 클라우드 에이전트의 표준

4-4. Worktree (Git)

  • 같은 리포 별도 브랜치 디렉터리
  • 메인 작업 트리에 영향 없음
  • Claude Code, Cursor 3 모두 지원

CLAUDE.md 권장: "execution: ... Use git worktree for risky changes."


5. 도구별 보안 패턴

File Reads

  • 파일 경로 검증 (../ 차단)
  • 심볼릭 링크 따라가기 차단
  • 크기 제한 (큰 파일은 청크로)

Bash 실행

  • 명령어 화이트리스트
  • 위험 패턴 차단 (rm -rf /, :(){:|:&};:, sudo, etc.)
  • 타임아웃 (default 2분)
  • stdout/stderr 크기 제한

Web Fetch / URL

  • localhost 차단 (SSRF 방지)
  • 프라이빗 IP 대역 차단 (10.x, 172.16.x, 192.168.x)
  • HTTPS 강제
  • Redirect 제한 (loop 방지)

Database / API

  • read-only 자격증명 (가능하면)
  • Rate limiting
  • Query timeout

6. MCP 보안 (2026-04 시점)

MCP 서버는 외부 코드

  • 서드파티 MCP 서버를 설치하면 그 서버 코드가 사용자 시스템에서 실행
  • 신뢰 검증 필수
  • 공식 서버 선호 (anthropic, openai, vercel 등)

MCP 토큰 한도 (Claude Code)

  • 도구 결과 25K 토큰 한도, 10K에서 경고
  • 서버가 명시 허용 시 500K 문자까지 디스크 저장
  • 컨텍스트 폭발 방지

MCP 권한 위임

사용자가 MCP 서버를 추가할 때 어떤 도구가 노출되는지 명시 확인. 자동 허용 금지.


7. Hooks — 도구 실행 전후 가드레일

CLAUDE.md 패턴: - PreToolUse(Bash|Write|Edit): 입력 단계 가드레일. 위험 패턴 + 차단 경로 사전 차단 - PostToolUse(Edit|Write): 디버그 statement + credential leak 감지

Claude Code 훅 시스템: 4 lifecycle 이벤트. 각 단계에서 사용자 정의 셸 명령 실행.

실전 훅 예

if [[ "$1" =~ "rm -rf" ]]; then
  echo "BLOCKED: rm -rf detected"
  exit 1
fi
if grep -q "API_KEY=" "$1"; then
  echo "WARNING: hardcoded credential"
fi

8. 격리 단계 매핑

사용 사례 격리 단계 이유
로컬 개인 프로젝트 (단일 사용자) Process + 권한 가벼움, 충분
팀 코딩 어시스턴트 (다중 사용자) Worktree + Container 실수 격리, 빠름
클라우드 에이전트 (untrusted code) VM 완전 격리 필수
MCP 서버 호스팅 Container per server 서버 간 격리
AutoML / Code Interpreter VM + 네트워크 차단 외부 유출 방지

9. 실패 처리 — Tool Loop Reliability

도구는 실패한다. 네트워크 끊김, 권한 부족, 파일 없음, 타임아웃.

실패 분류 (CLAUDE.md docs/patterns/error-handling.md 패턴)

  • Transient (재시도 가능): 네트워크 일시 오류
  • Permanent (재시도 무의미): 파일 없음, 문법 오류
  • Permission: 사용자 추가 권한 필요
  • Resource: 토큰 부족, 디스크 가득

재시도 정책

  • Transient: 지수 백오프 (1s → 2s → 4s, 최대 3회)
  • Permanent: 즉시 모델에게 보고, 다른 접근 모색
  • Permission: 사용자에게 즉시 위임

3-failure circuit breaker

CLAUDE.md "execution: 3-failure circuit breaker → revisit architecture"

같은 도구가 3회 실패하면 전략 재검토. 무한 재시도는 사용자 토큰만 태우고 같은 결과.


10. 도구 출력 처리

큰 결과 처리

  • 50K SQL row → 첫 100행만 컨텍스트, 나머지는 파일 저장
  • 모델은 "결과 100K rows in /tmp/result.csv. Schema: ..." 만 봄
  • 필요 시 추가 도구 호출로 부분 fetch

결과 파싱 실패

  • JSON 파싱 실패 → 원본 + 에러를 모델에게 (재시도 정보 제공)
  • 재시도 시 다른 표현 시도 (e.g., schema 명시)

비결정적 결과

  • 같은 입력 다른 출력이 나오면 → 캐싱 무의미
  • 도구 자체에 결정성 보장 (random seed, 시점 명시)

정리

영역 권장
권한 기본 deny + 화이트리스트
격리 작업 위험도에 비례 (process → worktree → container → VM)
MCP 신뢰 검증 + 토큰 한도 + 명시 허용
PreToolUse/PostToolUse 양쪽 모두
실패 분류 + 지수 백오프 + 3-failure circuit breaker

핵심 한 문장: "모델은 도구를 부르고 싶어한다. 하네스의 일은 부를 수 있는 도구부를 방법을 정하는 것."

다음 편(5/6)은 도구 호출의 더 위 레벨 — 어느 모델에게 어떤 작업을 보낼지 결정하는 Multi-Provider Routing.


참고 자료 (1차 출처)

  • "Dive into Claude Code": arxiv.org/abs/2604.14228
  • Anthropic MCP 명세: modelcontextprotocol.io
  • Cursor 3 cloud agents: cursor.com/cloud (2026-04)
  • Martin Fowler 하네스 글: martinfowler.com/articles/harness-engineering.html

댓글

이 블로그의 인기 게시물

"LLM 핵심 학습 (1/6) — 기본: 토큰화·임베딩·어텐션·위치 인코딩"

"LLM 핵심 학습 (2/6) — 파인튜닝: LoRA·QLoRA·증류·Adapter"

"ML 기초 학습 (1/9) — 머신러닝과 sklearn: 학습의 좌표계"