Codex CLI를 사용하기 시작하면서 가장 헷갈렸던 부분이 바로 샌드박스(sandbox)와 승인(approval) 설정이었습니다. 매번 승인을 받는 것은 번거롭지만, 전체 접근 권한을 허용하는 것은 위험합니다. 그래서 중간 단계인 workspace-write가 실제로 어디까지 제한해 주는지, codex sandbox를 이용해 하나씩 테스트했습니다. 그 결과, /tmp에는 파일을 쓸 수 있었지만, 홈 디렉토리와 .git에 대한 쓰기 및 통신은 차단되었습니다. 이 때문에 샌드박스 내부에서는 git commit조차 할 수 없었습니다.
확인 환경
확인 조건: Codex CLI 0.163.0 (npm i -g @openai/codex) / Linux 6.12 / bubblewrap 0.12.0 (Linux에서 샌드박스를 만드는 도구) / 2026-10-18
codex sandbox를 이용해 명령어를 직접 실행하며 테스트했습니다. 에이전트와의 대화(모델이 스스로 명령을 선택하는 상태)에서는 시도하지 않았습니다. 승인 프롬프트가 어떻게 나타나는지는 확인하지 못했으므로, 이 부분은 공식 문서를 참고하여 작성합니다. 테스트는 Linux 환경에서만 진행했으며, macOS, Windows, WSL2에서는 테스트하지 않았습니다.
샌드박스 3종류와 승인 정책 2종류
--sandbox (-s)의 값은 다음 세 가지입니다.
read-only: 읽기 전용
workspace-write: 작업 폴더(및 임시 디렉토리)에만 쓰기 가능
danger-full-access: 제한 없음
--ask-for-approval (-a)는 이번 버전의 도움말에서는 on-request와 never 두 가지뿐이었습니다. 이전에 있던 untrusted(폐지 경위는 공식 문서를 확인)를 전달하면 다음과 같은 오류가 발생합니다.
error: invalid value 'untrusted' for '--ask-for-approval <APPROVAL_POLICY>'
[possible values: on-request, never]
오래된 기사의 설정을 그대로 복사할 경우 문제가 생길 수 있으니 주의해야 합니다.
codex sandbox로 테스트하기
codex sandbox는 Codex가 제공하는 샌드박스 내에서 임의의 명령어를 실행하는 서브 커맨드입니다. 공식 문서에서도 이 명령어가 Codex의 샌드박스 환경 하에서 어떻게 작동하는지 확인할 수 있는 방법으로 소개되고 있습니다. 모델을 호출하지 않기 때문에 토큰은 사용되지 않습니다.
참고로, 문서에 있는 codex sandbox linux … 형태는 이번 버전에서는 오류가 발생했기 때문에, 이 글에서는 codex sandbox -- <명령어> 형태를 사용했습니다.
작업용 git 리포지토리를 만들고 그 안에서 다음과 같이 실행했습니다.
mkdir -p ~/sbtest ~/sbout && cd ~/sbtest
git init -q && echo a > a.txt && git add . && git commit -qm init
codex sandbox -c 'sandbox_mode=
| 작업 | 결과 |
|---|---|
| 작업 폴더 내에 파일 생성 | 됨 |
작업 폴더의 파일을 삭제 (`rm a.txt`) | 됨 |
| 홈 하위의 다른 폴더에 쓰기 | 중단됨 |
`/tmp`에 쓰기 | 됨 |
`.git` 안에 쓰기 | 중단됨 |
`git add` / `git commit` / `git reset --hard` |
| 중단됨 (`.git/index.lock`을 생성할 수 없음) |
`rm -rf .git` | 중단됨. 히스토리는 남아 있음 |
작업 폴더 내의 `.codex` / `.agents`에 쓰기 | 중단됨 |
`curl https://example.com` | 중단됨 (`000`) |
`git status` 등 읽기 작업 | 됨 |
옵션 없이 `codex sandbox`를 실행한 경우 `read-only` 처리가 되어, 작업 폴더 내와 `/tmp` 어디에도 쓸 수 없었습니다 (만약 `~/.codex/config.toml`에서 `sandbox_mode`를 변경하지 않은 경우).
## 주의해야 할 3가지 동작
### /tmp에는 쓰기 가능
'작업 폴더 외부에서는 모두 중단된다'고 생각했지만, `/tmp`에는 쓸 수 있었습니다. 공식 문서에도 워크스페이스에는 현재 디렉터리 외에 `/tmp`와 같은 임시 디렉터리가 포함된다고 적혀 있습니다.
`/tmp`도 막고 싶다면 다음 두 가지를 활성화했을 때 중단되었습니다 (환경 변수 `TMPDIR`가 설정되지 않은 환경에서 확인).
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
codex sandbox -c 'sandbox_mode="workspace-write"'
-c 'sandbox_workspace_write.exclude_slash_tmp=true'
-c 'sandbox_workspace_write.exclude_tmpdir_env_var=true'
...
다만, 테스트나 빌드에서 임시 파일을 사용하는 도구는 작동하지 않을 수 있습니다. 이 부분은 시도해 보지 않았습니다.
### 샌드박스 내에서는 git commit 불가
`.git`이 읽기 전용이기 때문에 히스토리가 지워지는 것은 막아주지만, 샌드박스 내에서는 `git add`도 `git commit`도 할 수 없습니다. 커밋은 본인이 하는 것이 확실합니다. 공식 문서에는 `on-request`가 샌드박스 외부로 나갈 필요가 있을 때 승인을 요청하는 설정이라고 되어 있으므로, 승인받아 샌드박스 외부에서 실행해 주는 방법도 있을 것 같지만, `git commit`으로 그 흐름은 시도하지 않았습니다.
### 작업 폴더 내 파일은 평소처럼 삭제 가능
당연하지만, 작업 폴더 안의 파일은 `rm`으로 지울 수 있었습니다. `.git`이 보호되고 있기 때문에 커밋된 내용은 샌드박스 외부에서 `git restore`를 하면 되돌릴 수 있습니다 (샌드박스 내부의 `git restore`는 `.git/index.lock`을 생성하지 못해 실패했습니다). 아직 커밋하지 않은 변경 사항은 되돌릴 수 없으므로, 맡기기 전에 커밋해 두는 것이 안전합니다.
## 통신은 network_access로 허용 가능
패키지 설치 등으로 통신이 필요할 때는 `network_access`를 활성화합니다. 다음 설정으로 `curl`이 `200`을 반환했습니다.
codex sandbox -c 'sandbox_mode="workspace-write"'
-c 'sandbox_workspace_write.network_access=true'
-- sh -c 'curl -s -o /dev/null -w "%{http_code}\n" https://example.com'
...
이 설정으로 example.com, github.com, pypi.org를 시도해 본 결과 모두 `200`을 받았습니다. 문서에도 `network_proxy`를 활성화하지 않는 한 외부 통신은 목적지에 관계없이 그대로 통한다고 적혀 있습니다. 목적지를 제한하려면 `features.network_proxy`를 활성화하고 도메인을 지정해야 하지만, 그 부분은 시도해 보지 않았습니다.
## 평소 사용은 workspace-write와 on-request로
일반적으로는 공식 문서에서도 Auto 프리셋으로 소개된 다음 조합부터 시작하는 것이 안전하다고 생각합니다.
codex -s workspace-write -a on-request
문서에 따르면, 이 설정은 작업 폴더 외부로의 쓰기나 통신이 필요할 때 승인을 요청합니다. 실제 확인 화면은 시도해 보지 않았지만, 위의 결과와 종합해 볼 때, 승인 없이 통과하는 것은 '작업 폴더(`.git` 등을 제외)와 /tmp에 대한 쓰기'와 '읽기'라고 생각됩니다.
`--dangerously-bypass-approvals-and-sandbox`
은 도움말에서 외부에서 샌드박스화된 환경에서만 사용하도록 되어 있습니다. 컨테이너 등 외부 격리가 없는 환경에서는 선택하지 않는 것이 좋습니다.
`~/.codex/config.toml`
에서 기본값을 변경하면 결과가 달라지므로, 자신의 환경에서도 위의 명령어를 한 번 실행해 보는 것을 추천합니다. 모델을 호출하는 것이 아니기 때문에 제 컴퓨터에서는 1초도 걸리지 않았습니다.
## 참고
Codex를 포함한 각 도구에서 .env나 API 키를 읽히지 않게 하는 설정은 note의 유료 매거진에 모아두었습니다 → https://note.com/agentkiyaku/m/m179e3a155323
### 토론

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19