Anthropic은 Claude Code 헤비 유저라면 이미 체감하는 문제에 딱 잘라 숫자를 붙였다. 사용자는 권한 프롬프트의 약 93%를 승인했고, 프롬프트가 쌓일수록 주의력은 떨어진다고 회사는 말한다 (Anthropic). 이게 승인 피로다. 그리고 “human in the loop”를 “Enter만 누르고 있는 사람”으로 바꿔버린다.
잘못된 대응은 노트북에서 --dangerously-skip-permissions를 켜고 모델이 얌전히 굴길 바라는 것이다. 제대로 된 대응은 지루한 보안 엔지니어링이다. Claude Code를 dev container 안에 넣고, repo만 넘기고, outbound traffic을 제한하고, 정책으로 bypass mode를 막고, 실제로 지원되는 곳에서만 auto mode를 쓰는 것이다.
이 가이드는 오늘 바로 repo에 넣어 실행할 수 있는 구성을 보여준다. 요즘 커뮤니티에서 벌어지는 논쟁도 다룬다. 개발자들은 agent가 더 자율적이길 원하지만, 보이지 않는 가드레일이나 블랙박스식 파일 크롤링은 원하지 않는다. 현실적인 답은 “Claude를 더 세게 믿자”가 아니다. “자율성을 받아들일 수 있을 만큼 폭발 반경을 줄이자”다.

논쟁의 핵심은 결국 관찰 가능성과 폭발 반경이다
“Anthropic tries to hide Claude’s AI actions”를 둘러싼 Hacker News 스레드는 그냥 불평 쇼가 아니다. 한 댓글은 개발자의 불안을 잘 요약했다. agent가 오래된 config를 열거나 관련 없는 파일을 뒤지기 시작하면, 운영자는 그걸 멈출 수 있을 만큼 빨리 알아야 한다는 것이다 (Hacker News). Claude Code를 “위험하게” 실행하는 또 다른 스레드도 같은 실용적 패턴으로 수렴했다. agent는 자유롭게 돌리되, 파일과 네트워크 접근이 제한된 sandbox 안에서만 돌리라는 것이다 (Hacker News).
Anthropic의 자체 엔지니어링 글도 같은 결론에 도달한다. 방어선을 environment, model, external content로 나눈다. 이 중 deterministic하게 만들 수 있는 부분은 environment다. credential이 sandbox 안으로 들어가지 않으면, 원인이 prompt injection이든, model overreach든, 잘못된 사용자 지시든, Claude는 그것을 유출할 수 없다 (Anthropic).
auto mode는 여기에 잘 맞지만, 마법은 아니다. Anthropic은 auto mode가 실행 전 action을 검토하기 위해 별도 classifier를 사용한다고 말한다. 문서에서도 이를 민감한 작업에 대한 리뷰를 대체하는 기능이 아니라 research preview라고 부른다 (Claude Code docs). 이 구분은 중요하다. auto mode는 프롬프트를 줄인다. container는 결과를 줄인다.
팀에는 이 입장을 추천한다.
| Mode | 사용할 곳 | 사용하지 말 곳 |
|---|---|---|
plan | 낯선 repo, 위험한 변경 | 오래 unattended로 돌아가는 편집 |
acceptEdits | 일반 기능 개발 | 배포, secrets, infra 변경 |
auto | egress control이 있는 격리된 dev container | production system 또는 알 수 없는 repo |
bypassPermissions | 폐기 가능한 VM에서만 | 개발자 노트북 |
Anthropic 문서에 따르면 auto mode는 Claude Code v2.1.83 이상이 필요하다. Anthropic API에서는 지원 모델에 Claude Opus 4.6 이상과 Sonnet 4.6이 포함된다. Bedrock, Vertex AI, Microsoft Foundry에서는 문서상 auto mode 지원 모델로 Opus 4.7과 Opus 4.8만 나열되어 있다 (Claude Code docs).
Dev Container 만들기
repo에 파일 세 개를 만든다.
.devcontainer/
devcontainer.json
Dockerfile
managed-settings.json
먼저 .devcontainer/devcontainer.json부터 시작한다.
{
"name": "claude-code-safe",
"build": {
"dockerfile": "Dockerfile"
},
"remoteUser": "node",
"mounts": [
"source=claude-code-config-${devcontainerId},target=/home/node/.claude,type=volume"
],
"runArgs": [
"--cap-add=NET_ADMIN",
"--cap-add=NET_RAW"
],
"containerEnv": {
"CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC": "1",
"DISABLE_AUTOUPDATER": "1",
"ANTHROPIC_BASE_URL": "https://api.onehop.ai/anthropic",
"ANTHROPIC_API_KEY": "${localEnv:ONEHOP_API_KEY}"
},
"postCreateCommand": "sudo /usr/local/bin/init-firewall.sh"
}
Anthropic의 dev container 문서는 Claude Code를 container 안에서 실행해 command가 host 밖에서 실행되게 하되, 편집 내용은 mounted repo에 그대로 나타나도록 하라고 권장한다 (Claude Code docs). 또한 ~/.ssh나 cloud credential 파일 같은 host secret을 mount하지 말라고 경고한다. 그대로 따르자. Claude에 repo 범위의 GitHub token이 필요하다면, 수명이 짧은 token을 environment로 넘겨라. 편하다는 이유로 home directory 전체를 bind mount하지 마라.
이제 Dockerfile이다.
FROM mcr.microsoft.com/devcontainers/javascript-node:22
RUN npm install -g @anthropic-ai/claude-code@latest
COPY managed-settings.json /etc/claude-code/managed-settings.json
COPY init-firewall.sh /usr/local/bin/init-firewall.sh
RUN chmod +x /usr/local/bin/init-firewall.sh
Anthropic 문서에는 Dev Container Feature도 있지만, Dockerfile을 통해 설치하면 팀 repo에서 정책과 버전을 추론하기가 더 쉽다. 재현성을 원한다면 @anthropic-ai/claude-code를 특정 버전으로 고정하고 DISABLE_AUTOUPDATER=1을 유지하라.
Auto Mode를 켜기 전에 권한부터 잠그기
.devcontainer/managed-settings.json을 만든다.
{
"permissions": {
"defaultMode": "auto",
"disableBypassPermissionsMode": "disable",
"deny": [
"Read(./.env)",
"Read(./.env.*)",
"Read(./secrets/**)",
"Read(./config/credentials.json)",
"Bash(curl *)",
"Bash(wget *)",
"Bash(git push *)",
"Bash(kubectl *)",
"Bash(terraform apply *)",
"WebFetch(domain:169.254.169.254)"
],
"ask": [
"Bash(npm publish *)",
"Bash(docker push *)",
"Bash(gh release *)"
],
"allow": [
"Bash(npm install)",
"Bash(npm test *)",
"Bash(npm run lint *)",
"Bash(git diff *)",
"Bash(git status *)"
]
},
"autoMode": {
"environment": {
"trustedDomains": [
"registry.npmjs.org",
"github.com"
]
}
}
}
여기서 실제로 일을 하는 디테일은 두 가지다.
첫째, managed settings를 통해 강제하면 disableBypassPermissionsMode가 bypassPermissions를 막고 --dangerously-skip-permissions flag를 비활성화한다. Anthropic은 settings reference에서 이 control을 그대로 문서화하고 있다 (Claude Code docs).
둘째, auto mode에서도 deny rule은 여전히 중요하다. Anthropic은 auto mode가 요청 범위를 넘어서는 action, 인식되지 않은 infrastructure를 겨냥하는 action, 적대적 content에 의해 유도된 것처럼 보이는 action을 차단한다고 말한다. 하지만 팀의 정책을 classifier에 외주 주면 안 된다. agent session에서 누구도 terraform apply를 실행하면 안 된다면, deny rule로 박아 넣어라.
주의할 점도 있다. repo가 관리하는 policy는 repo를 편집할 수 있는 사람이라면 누구나 바꿀 수 있다. Anthropic 문서에 따르면 Linux 안에서는 /etc/claude-code/managed-settings.json이 높은 precedence를 갖지만, 개발자가 repo 파일을 수정해 우회할 수 없는 policy가 필요하다면 server-managed settings나 MDM을 써야 한다 (Claude Code docs). 스타트업 팀이라면 checked-in policy도 좋은 baseline이다. enterprise rollout이라면 거기서 멈추지 마라.

작은 Allowlist로 Egress 제한하기
.devcontainer/init-firewall.sh를 추가한다.
#!/usr/bin/env bash
set -euo pipefail
ALLOWED_HOSTS=(
api.onehop.ai
api.anthropic.com
claude.ai
platform.claude.com
registry.npmjs.org
github.com
raw.githubusercontent.com
)
iptables -P OUTPUT DROP
iptables -A OUTPUT -o lo -j ACCEPT
iptables -A OUTPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
for host in "${ALLOWED_HOSTS[@]}"; do
for ip in $(getent ahostsv4 "$host" | awk '{print $1}' | sort -u); do
iptables -A OUTPUT -p tcp -d "$ip" --dport 443 -j ACCEPT
done
done
iptables -A OUTPUT -p udp --dport 53 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 53 -j ACCEPT
일부러 단순하게 만들었다. 시작 시점에 허용된 hostname을 resolve하고, 해당 IP로 향하는 TCP 443만 허용한다. production-grade control이 필요하다면 container를 proxy 뒤에 두고 모든 request를 log로 남겨라. 그래도 이 정도의 기본 deny-by-default rule만으로도 autonomous coding agent가 인터넷 전체와 대화하게 두는 것보다는 낫다.
Anthropic의 network 문서는 설치와 인증 경로에 따라 api.anthropic.com, claude.ai, platform.claude.com, downloads.claude.ai, storage.googleapis.com, raw.githubusercontent.com 같은 required domain을 나열한다 (Claude Code docs). npm으로 설치하고 auto-update를 끄면 runtime에는 download domain이 필요 없을 수 있다. 목록은 빡빡하게 유지하고, 빌드가 명확한 이유로 실패할 때만 domain을 추가하라.
실행한다.
export ONEHOP_API_KEY=oh_your_key_here
code .
# VS Code: Dev Containers: Rebuild and Reopen in Container
claude --permission-mode auto
container 안에서 확인한다.
whoami
claude --version
curl -I https://api.onehop.ai
curl -I https://example.com
OneHop request는 동작해야 한다. example.com request는 추가하지 않았다면 실패해야 한다.
OneHop으로 Claude Fable 5 라우팅하기
Anthropic은 2026년 6월 9일 Claude Fable 5와 Claude Mythos 5를 공개했다. Fable 5 가격은 input token 100만 개당 $10, output token 100만 개당 $50로, Mythos Preview 가격의 절반보다 낮다 (Anthropic). OneHop은 Claude Fable 5를 anthropic/claude-fable-5로 표시하며, 공식 가격은 input $10/M, output $50/M, OneHop 가격은 input $3/M, output $15/M로 보여준다. 신규 사용자에게는 카드 없이 $10 free credit도 제공한다 (OneHop).
현재 운영상 참고할 점: OneHop Fable 5 페이지는 모델을 listed 상태로 두고 있지만, 일시적으로 unavailable하다고 말한다. config는 그대로 둬도 된다. 다만 계정과 region에서 access가 열렸을 때 사용할 수 있다고 예상하라.
OneHop을 통한 직접 Anthropic Messages call에는 OneHop이 이 모델에 대해 공개한 Anthropic-compatible endpoint를 사용한다.
from anthropic import Anthropic
client = Anthropic(
base_url="https://api.onehop.ai/anthropic",
api_key="oh_your_key_here",
)
message = client.messages.create(
model="anthropic/claude-fable-5",
max_tokens=1024,
messages=[{"role": "user", "content": "Summarize this repo's test strategy."}],
)
print(message.content[0].text)
앱이 이미 OneHop의 OpenAI-compatible gateway를 사용하고 있다면, base URL 한 줄만 바꾸면 된다.
client = OpenAI(base_url="https://api.onehop.ai/v1", api_key="oh_your_key_here")
Claude Code의 경우에는 ANTHROPIC_BASE_URL에 Anthropic-compatible base URL을 사용하라. Claude Code는 Anthropic Messages API로 말하기 때문이다. OneHop의 Fable 5 model page는 현재 Anthropic Messages가 https://api.onehop.ai/anthropic에서 available하다고 표시하고, OpenAI Chat Completions는 이 모델에서 unsupported라고 표시한다 (OneHop).

운영 모델: 덜 믿고, 더 빨리 배포하기
최고의 Claude Code 설정은 가장 permissive한 설정이 아니다. 실수가 싸게 먹히는 설정이다.
Claude가 새 codebase를 탐색할 때는 plan mode를 써라. task 범위가 좁아진 뒤에만 auto로 전환하라. bypassPermissions는 policy로 꺼둬라. secret 읽기는 deny하라. deploy, protected branch로의 push, cloud mutation, metadata endpoint 접근을 deny하라. agent는 non-root dev container에 넣어라. egress는 default로 막아라. merge 전 diff는 review하라.
YOLO mode보다 느리게 들릴 수 있다. 실제로는 더 빠르다. 아무도 사소한 prompt 40개를 지켜보며 승인할 필요가 없고, 방금 누른 승인이 모델에게 token 유출을 허용한 건 아닌지 고민할 필요도 없기 때문이다. Anthropic의 자체 containment 글도 Claude Code가 action마다 승인받지 않고 unattended로 실행될 수 있도록 reference dev container가 존재한다고 말한다 (Anthropic). 빠진 조각은 팀 policy다.
provider stack을 다시 짜지 않고 Fable급 coding work를 가장 짧은 경로로 시험해보고 싶다면 Claude Fable 5 on OneHop으로 라우팅하라. 신규 계정은 $10 free로 시작할 수 있다. base URL 변경은 쉬운 부분이다. 진짜 이득은 자율성을 쓸 만큼 안전하게 만드는 container와 그것을 함께 쓰는 데 있다.