2> Fetch the complete documentation index at: https://code.claude.com/docs/llms.txt2> Fetch the complete documentation index at: https://code.claude.com/docs/llms.txt
3> Use this file to discover all available pages before exploring further.3> Use this file to discover all available pages before exploring further.
4 4
5# 샌드박싱된 Bash 도구 구성5# 샌드박스 Bash 도구 구성
6 6
7> Claude Code의 샌드박싱된 Bash 도구가 파일시스템 및 네트워크 격리를 제공하여 더 안전하고 자율적인 에이전트 실행을 가능하게 하는 방법을 알아봅니다.7> 기본 제공 샌드박스로 Claude Code의 셸 명령이 접근할 수 있는 파일과 네트워크 호스트를 제한합니다. 샌드박스를 켜고, 경계를 설정하고, 샌드박스로 인해 발생하는 문제를 해결합니다.
8 8
9Bash 샌드박스를 사용하면 Claude가 대부분의 셸 명령을 권한을 요청하지 않고 실행할 수 있습니다. 각 명령을 승인하는 대신 명령이 접근할 수 있는 파일과 네트워크 도메인을 정의하면 운영 체제가 모든 Bash, PowerShell 또는 Monitor 명령과 그 자식 프로세스에 대해 해당 경계를 적용합니다.9Bash 샌드박스는 Claude가 사용자의 머신에서 실행하는 셸 명령 주위에 운영 체제가 적용하는 경계입니다. 이러한 명령이 접근할 수 있는 파일과 네트워크 도메인을 설정할 수 있으며, 이 제한은 Bash, PowerShell, Monitor 명령과 이들이 시작하는 프로세스에 적용됩니다. 명령이 실행되는 동안 운영 체제가 제한을 적용하므로, Claude Code는 각 명령마다 승인을 요청하지 않고 [샌드박스 명령을 실행](#sandbox-modes)할 수 있습니다.
10
11샌드박스는 셸 명령에만 적용됩니다. Claude의 파일 도구, MCP 서버, 훅은 [샌드박스 외부에서 실행됩니다](#what-runs-outside-the-sandbox).
12
13샌드박스는 macOS, Linux, WSL2에서 실행됩니다. 네이티브 Windows에서는 Claude Code가 샌드박스 없이 명령을 실행합니다. Windows 머신에서 샌드박스를 사용하려면 WSL2 배포판 내에서 Claude Code를 실행하십시오.
10 14
11<Note>15<Note>
12 dev 컨테이너, 사용자 정의 컨테이너, 가상 머신 등 다른 격리 방식을 비교하려면 [샌드박스 환경](/docs/ko/sandbox-environments)을 참조하세요. Bash 이외의 도구에 대한 권한 프롬프트를 줄이려면 [권한 모드](/docs/ko/permission-modes)를 참조하세요.16 이 페이지에서는 사용자 자신의 머신에서 셸 명령을 둘러싼 샌드박스를 다룹니다. 관련 질문은 다른 페이지에서 다룹니다.
17
18 * 클라우드 세션이 격리되는 방식은 [보안 및 격리](/docs/ko/claude-code-on-the-web#security-and-isolation)를 참조하십시오
19 * 개발 컨테이너, 사용자 지정 컨테이너, 가상 머신 등 다른 격리 방식을 비교하려면 [샌드박스 환경](/docs/ko/sandbox-environments)을 참조하십시오
20 * Bash 이외의 도구에 대한 권한 프롬프트를 줄이려면 [권한 모드](/docs/ko/permission-modes)를 참조하십시오
13</Note>21</Note>
14 22
23<h2 id="what-the-sandbox-restricts">
24 샌드박스가 제한하는 항목
25</h2>
26
27샌드박스가 켜져 있는 동안 Claude가 실행하는 셸 명령은 샌드박스 경계 안에서 시작되며, 해당 명령이 시작하는 프로세스도 마찬가지입니다. 샌드박스는 기본적으로 꺼져 있습니다. 샌드박스를 켜려면 [시작하기](#get-started)에 나온 대로 세션에서 `/sandbox`를 실행하거나, `~/.claude/settings.json` 같은 [설정 파일](/docs/ko/settings)에서 [`sandbox.enabled`](/docs/ko/settings-reference#sandbox-enabled)를 `true`로 설정합니다.
28
29다음 표는 샌드박스 처리된 명령이 기본적으로 접근할 수 있는 항목과 각 기본값을 변경하는 설정을 보여 줍니다.
30
31| 접근 | 기본값 | 변경 방법 |
32| :- | :- | :- |
33| 쓰기 | 작업 디렉터리, 사용자별 임시 디렉터리, [추가한 디렉터리](/docs/ko/permissions#additional-directories-grant-file-access-not-configuration). [보호된 경로](#protected-paths)는 계속 쓰기가 거부됩니다 | [`filesystem.allowWrite`](/docs/ko/settings-reference#sandbox-filesystem-allowwrite), [`filesystem.denyWrite`](/docs/ko/settings-reference#sandbox-filesystem-denywrite) |
34| 읽기 | `~/.ssh` 및 `~/.aws/credentials` 같은 자격 증명 파일을 포함한 머신의 대부분 | [`filesystem.denyRead`](/docs/ko/settings-reference#sandbox-filesystem-denyread), [`credentials`](#protect-credentials) |
35| 네트워크 | 외부로 나가는 직접 경로가 없습니다. 연결은 머신의 프록시를 거치며, 프록시는 각 호스트를 허용된 도메인 목록과 대조합니다. 이 목록은 처음에 비어 있습니다. [다른 호스트에 대한 처리 방식](#hosts-outside-your-allowed-domains)은 권한 모드에 따라 결정됩니다 | [`network.allowedDomains`](/docs/ko/settings-reference#sandbox-network-alloweddomains), [`network.deniedDomains`](/docs/ko/settings-reference#sandbox-network-denieddomains) |
36| 환경 변수 | Claude Code 환경에 있는 모든 시크릿을 포함하여 Claude Code에서 상속됩니다 | [`credentials`](#protect-credentials), [`CLAUDE_CODE_SUBPROCESS_ENV_SCRUB`](/docs/ko/env-vars) |
37
38Claude Code는 오픈 소스 패키지인 [`@anthropic-ai/sandbox-runtime`](https://github.com/anthropics/sandbox-runtime)을 기반으로 샌드박스를 구축합니다.
39
40<h3 id="what-runs-outside-the-sandbox">
41 샌드박스 외부에서 실행되는 항목
42</h3>
43
44샌드박스는 셸 명령을 감쌉니다. 다음 도구와 프로세스는 샌드박스 외부에서 실행됩니다.
45
46* **기본 제공 파일 및 웹 도구**: Read, Edit, Write, WebFetch, WebSearch 같은 도구는 대신 [권한 규칙](/docs/ko/permissions)을 따릅니다. `denyRead` 항목은 Read 도구를 막지 않으며, `allowedDomains`는 WebFetch를 제한하지 않습니다
47* **Claude Code가 시작하는 기타 프로세스**: 명령 [훅](/docs/ko/hooks), 로컬 [MCP 서버](/docs/ko/mcp), [플러그인 모니터](/docs/ko/plugins/components#monitors), [LSP 서버](/docs/ko/tools-reference#lsp-tool-behavior), 그리고 [상태줄](/docs/ko/statusline) 명령 및 `apiKeyHelper` 같은 헬퍼 명령은 사용자의 전체 접근 권한으로 실행됩니다
48
49설정에 따라 일부 셸 명령도 샌드박스 외부에서 실행됩니다.
50
51* **사용자가 직접 입력하는 명령**: [`!` 셸 모드 프롬프트](/docs/ko/interactive-mode#shell-mode-with-prefix)에서 입력하는 명령은 대부분의 세션에서 샌드박스 없이 실행됩니다. 직접 입력한 명령이 샌드박스에서 실행되는 세션은 [엄격한 샌드박스 모드](#turn-off-the-retry-with-strict-sandbox-mode)에 나와 있습니다
52* **제외된 명령**: [`excludedCommands`](#run-commands-outside-the-sandbox-with-excludedcommands)와 일치하는 명령은 샌드박스 없이 실행됩니다
53* **샌드박스 없는 재시도**: Claude는 일반적으로 샌드박스에서 명령이 실패한 후 [샌드박스 없이 명령을 실행하도록 요청](#the-unsandboxed-retry-escape-hatch)할 수 있습니다
54
55이 섹션의 도구, 프로세스, 명령을 하나의 경계 안에 두려면 Claude Code 프로세스 자체를 [컨테이너, 가상 머신 또는 샌드박스 런타임](/docs/ko/sandbox-environments)에서 실행합니다.
56
15<h2 id="get-started">57<h2 id="get-started">
16 시작하기58 시작하기
17</h2>59</h2>
18 60
19샌드박스는 Claude Code에 내장되어 있으며 macOS, Linux 및 WSL2에서 실행됩니다. 기본 Windows는 지원되지 않습니다. Windows에서는 WSL2 배포판 내에서 Claude Code를 실행하세요.61샌드박스는 Claude Code에 내장되어 있습니다. 설치해야 할 항목은 플랫폼에 따라 다릅니다.
20 62
21macOS에서는 설치할 것이 없습니다. 샌드박싱은 기본 제공되는 Seatbelt 프레임워크를 사용합니다. Linux 및 WSL2에서 샌드박스는 두 개의 패키지에 의존하며, 이는 [Linux 및 WSL2 설정](#set-up-linux-and-wsl2)에서 다룹니다. 아직 설치하지 않았더라도 `/sandbox`로 시작할 수 있습니다. 패널에 누락된 항목이 있는지 표시되기 때문입니다.63* **macOS**: 샌드박싱은 내장된 Seatbelt 프레임워크를 사용하므로 바로 아래 단계로 진행할 수 있습니다
64* **Linux 및 WSL2**: 샌드박스는 `bubblewrap`과 `socat`에 의존하며, 이는 [Linux 및 WSL2 설정](#set-up-linux-and-wsl2)에서 다룹니다. 아직 설치하지 않았더라도 `/sandbox`로 시작할 수 있습니다. 해당 패널에 누락된 항목이 표시되기 때문입니다
22 65
23<Steps>66<Steps>
24 <Step title="/sandbox 실행">67 <Step title="/sandbox 실행">
25 Claude Code 세션을 시작하고 `/sandbox` 명령을 실행하세요:68 Claude Code 세션을 시작하고 `/sandbox` 명령을 실행합니다.
26 69
27 ```text theme={null}70 ```text theme={null}
28 /sandbox71 /sandbox
29 ```72 ```
30 73
31 이렇게 하면 세 개의 탭이 있는 샌드박스 패널이 열리며, Linux에서 선택적 seccomp 필터가 누락된 경우 Dependencies 탭이 추가됩니다:74 그러면 세 개의 탭이 있는 샌드박스 패널이 열리며, Linux에서 선택 사항인 seccomp 필터가 누락된 경우 Dependencies 탭이 추가로 표시됩니다.
32 75
33 * **Mode**: 샌드박스된 명령이 승인되는 방식을 선택합니다. 다음 단계에서 다룹니다.76 * **Mode**: 샌드박스 처리된 명령의 승인 방식을 선택합니다. 다음 단계에서 다룹니다
34 * **Overrides**: 샌드박스에서 실패한 명령이 샌드박스 없이 실행되도록 폴백할 수 있는지 선택합니다. 이것은 [`allowUnsandboxedCommands`](/docs/ko/settings-reference#sandbox-allowunsandboxedcommands) 설정입니다.77 * **Overrides**: 샌드박스에서 실패한 명령이 샌드박스 없이 실행되도록 대체할 수 있는지 선택합니다. 이는 [`allowUnsandboxedCommands`](/docs/ko/settings-reference#sandbox-allowunsandboxedcommands) 설정입니다
35 * **Config**: 해결된 샌드박스 설정을 봅니다.78 * **Config**: 확정된 샌드박스 설정을 확인합니다
36 79
37 패널에 Dependencies 탭만 표시되면 필수 패키지가 누락된 것입니다. [Linux 및 WSL2 설정](#set-up-linux-and-wsl2)에 설명된 대로 설치하고, Claude Code를 다시 시작한 후 `/sandbox`를 다시 실행하세요.80 패널에 Dependencies 탭만 표시된다면 필수 패키지가 누락된 것입니다. [Linux 및 WSL2 설정](#set-up-linux-and-wsl2)의 설명에 따라 설치한 후 Claude Code를 재시작하고 `/sandbox`를 다시 실행합니다.
38 </Step>81 </Step>
39 82
40 <Step title="모드 선택">83 <Step title="모드 선택">
41 Mode 탭에서 자동 허용 또는 일반 권한을 선택하세요. 자동 허용은 샌드박스된 명령을 프롬프트 없이 실행하고, 일반 권한은 명령이 샌드박스되었을 때도 일반 권한 프롬프트를 유지합니다. 자동 허용 모드에서 어떤 명령이 여전히 프롬프트되는지는 [샌드박스 모드](#sandbox-modes)를 참조하세요.84 Mode 탭에서 auto-allow 또는 regular permissions를 선택합니다. auto-allow는 샌드박스 처리된 명령을 확인 요청 없이 실행하며, regular permissions는 명령이 샌드박스 처리된 경우에도 일반 권한 프롬프트를 유지합니다. auto-allow 모드에서도 확인을 요청하는 명령은 [샌드박스 모드](#sandbox-modes)를 참조하세요.
42 </Step>85 </Step>
43 86
44 <Step title="Bash 명령 실행">87 <Step title="Bash 명령 실행">
45 Claude에게 빌드 또는 테스트 스위트와 같은 명령을 실행하도록 요청하세요. 기본적으로 샌드박스 내의 명령은 작업 디렉토리, [사용자별 임시 디렉토리](/docs/ko/env-vars) 및 `--add-dir`, `/add-dir` 또는 `permissions.additionalDirectories`로 [추가한 모든 디렉토리](/docs/ko/permissions#additional-directories-grant-file-access-not-configuration)에 쓸 수 있습니다.88 빌드나 테스트 스위트 같은 명령을 실행하도록 Claude에 요청합니다. 기본적으로 샌드박스 내부의 명령은 작업 디렉터리, [사용자별 임시 디렉터리](/docs/ko/env-vars), 그리고 `--add-dir`, `/add-dir` 또는 `permissions.additionalDirectories`로 [추가한 디렉터리](/docs/ko/permissions#additional-directories-grant-file-access-not-configuration)에 쓸 수 있습니다.
46 89
47 명령이 처음으로 새 네트워크 도메인이 필요할 때 Claude Code는 승인을 요청합니다. [자동 모드](/docs/ko/permission-modes#eliminate-prompts-with-auto-mode)에서는 Claude가 대신 명령이 필요한 호스트를 [명령 자체에](#per-command-allowed-domains-in-auto-mode) 이름 지어 분류기가 함께 검토하도록 합니다.90 명령이 처음으로 새 네트워크 도메인을 필요로 하면 Claude Code가 승인을 요청합니다. [자동 모드](/docs/ko/permission-modes#eliminate-prompts-with-auto-mode)에서는 대신 Claude가 명령에 필요한 호스트를 [명령 자체에](#per-command-allowed-domains-in-auto-mode) 명시하여 분류기가 명령과 함께 검토하도록 합니다.
48 91
49 샌드박스에서 실행할 수 없는 명령은 일반 권한 흐름으로 폴백합니다. Claude Code는 권한 프롬프트를 "Bash command"가 아닌 "Bash command (unsandboxed)"로 제목을 지정하므로 어떤 명령이 샌드박스 외부에서 실행되었는지 알 수 있습니다. 샌드박스가 허용하는 범위를 넓히거나 좁히려면 [샌드박싱 구성](#configure-sandboxing)을 참조하세요.92 샌드박스가 허용하는 범위를 넓히거나 좁히려면 [샌드박싱 구성](#configure-sandboxing)을 참조하세요.
50 93
51 샌드박스된 명령이 컨테이너 내에서 `Operation not permitted`로 실패하면 [문제 해결](#troubleshooting)의 Bubblewrap 항목을 참조하세요.94 컨테이너 내부에서 샌드박스 처리된 명령이 `Operation not permitted`로 실패하는 경우 [컨테이너 내부에서 Bubblewrap이 시작되지 않음](#bubblewrap-fails-to-start-inside-a-container)을 참조하세요.
52 </Step>95 </Step>
53</Steps>96</Steps>
54 97
55패널에서 모드를 선택하면 Claude Code는 이를 프로젝트의 로컬 설정인 `.claude/settings.local.json`에 저장하며, 이는 현재 프로젝트에 적용됩니다. Claude Code는 설정을 저장할 때 해당 파일을 전역 gitignore에 추가합니다. 모든 프로젝트에서 샌드박스를 활성화하려면 사용자 설정인 `~/.claude/settings.json`에서 [`sandbox.enabled`](/docs/ko/settings-reference#sandbox-enabled)를 `true`로 설정하세요. 조직의 모든 개발자에게 샌드박싱을 적용하려면 [관리 설정](#enforce-sandboxing-with-managed-settings)을 사용하세요.98패널에서 모드를 선택하면 Claude Code는 이를 현재 프로젝트에 적용되는 프로젝트 로컬 설정 `.claude/settings.local.json`에 저장합니다. Claude Code는 이 파일에 설정을 저장할 때 해당 파일을 전역 gitignore에 추가합니다. 모든 프로젝트에서 샌드박스를 활성화하려면 `~/.claude/settings.json`의 사용자 설정에서 [`sandbox.enabled`](/docs/ko/settings-reference#sandbox-enabled)를 `true`로 설정합니다. 조직의 모든 개발자에게 샌드박싱을 강제하려면 [관리형 설정](#enforce-sandboxing-with-managed-settings)을 사용합니다.
56 99
57한 세션 동안 설정 파일에 쓰지 않고 샌드박스를 변경하려면 [`--settings`](/docs/ko/settings#change-a-setting-for-one-session)로 Claude Code를 시작하세요. 예를 들어 이 명령은 Claude가 차단된 명령을 샌드박스 외부에서 재시도할 수 없는 샌드박스된 세션을 시작합니다:100설정 파일에 쓰지 않고 한 세션에 대해서만 샌드박스를 변경하려면 [`--settings`](/docs/ko/settings#change-a-setting-for-one-session)로 Claude Code를 시작합니다. 예를 들어 다음 명령은 Claude가 차단된 명령을 샌드박스 밖에서 재시도할 수 없는 샌드박스 세션을 시작합니다.
58 101
59```bash theme={null}102```bash theme={null}
60claude --settings '{"sandbox": {"enabled": true, "allowUnsandboxedCommands": false}}'103claude --settings '{"sandbox": {"enabled": true, "allowUnsandboxedCommands": false}}'
61```104```
62 105
63<Warning>106<Warning>
64 기본적으로 종속성이 누락되었거나 플랫폼이 지원되지 않아 샌드박스를 시작할 수 없으면 Claude Code는 경고를 표시하고 샌드박싱 없이 명령을 실행합니다. 이를 하드 실패로 만들려면 [`sandbox.failIfUnavailable`](/docs/ko/settings-reference#sandbox-failifunavailable)을 `true`로 설정하세요. 이는 샌드박싱을 보안 게이트로 요구하는 관리 배포를 위한 것입니다.107 기본적으로 의존성이 누락되었거나 플랫폼이 지원되지 않아 샌드박스를 시작할 수 없으면 Claude Code는 샌드박싱 없이 명령을 실행합니다. 대신 Claude Code가 시작 시 종료되도록 하려면 [`sandbox.failIfUnavailable`](/docs/ko/settings-reference#sandbox-failifunavailable)을 `true`로 설정합니다. 샌드박싱을 보안 관문으로 요구하는 관리형 배포에서 이 설정을 사용할 수 있습니다.
65</Warning>108</Warning>
66 109
110<h3 id="confirm-commands-run-inside-the-sandbox">
111 명령이 샌드박스 내부에서 실행되는지 확인
112</h3>
113
114샌드박스가 작동하는지 확인하려면 표의 각 줄을 실행하도록 Claude에 요청합니다. [`!` 프롬프트](#what-runs-outside-the-sandbox)에 직접 입력한 내용은 일반적으로 샌드박스 밖에서 실행되므로, 직접 입력해서는 테스트가 되지 않습니다.
115
116| 명령 | 샌드박스 내부에서의 결과 |
117| :- | :- |
118| `touch ~/sandbox-probe` | macOS에서는 `Operation not permitted`, Linux 및 WSL2에서는 `Read-only file system`으로 실패합니다 |
119| `curl --noproxy '*' https://example.com` | 명령이 샌드박스 프록시를 우회할 경로가 없으므로 `Could not resolve host`로 실패합니다 |
120
121Claude가 실패한 명령을 샌드박스 밖에서 재시도하겠다고 요청하면 재시도를 거부합니다. `touch`가 성공했고 홈 디렉터리가 샌드박스에서 명령의 쓰기를 허용하는 디렉터리가 아니라면 `~/sandbox-probe`를 삭제합니다. 그런 다음 `/sandbox`를 실행하여 샌드박스가 켜져 있고 의존성이 설치되어 있는지 확인합니다.
122
67<h3 id="set-up-linux-and-wsl2">123<h3 id="set-up-linux-and-wsl2">
68 Linux 및 WSL2 설정124 Linux 및 WSL2 설정
69</h3>125</h3>
70 126
71Linux 및 WSL2에서 샌드박스는 두 개의 패키지에 의존합니다:127Linux 및 WSL2에서 샌드박스는 다음 패키지에 의존합니다.
72 128
73* [`bubblewrap`](https://github.com/containers/bubblewrap): 파일 시스템 격리를 적용하는 권한 없는 샌드박싱 도구129* [`bubblewrap`](https://github.com/containers/bubblewrap): 파일 시스템 격리를 적용하는 비특권 샌드박싱 도구
74* [`socat`](http://www.dest-unreach.org/socat/): 샌드박스 프록시를 통해 네트워크 트래픽을 라우팅하는 데 사용되는 릴레이130* [`socat`](http://www.dest-unreach.org/socat/): 네트워크 트래픽을 샌드박스 프록시를 통해 라우팅하는 데 사용되는 릴레이
75 131
76배포판의 패키지 관리자로 설치하세요:132배포판의 패키지 관리자로 설치합니다.
77 133
78<Tabs>134<Tabs>
79 <Tab title="Ubuntu/Debian">135 <Tab title="Ubuntu/Debian">
89 </Tab>145 </Tab>
90</Tabs>146</Tabs>
91 147
92종속성이 누락되면 `/sandbox`의 Dependencies 탭에 플랫폼이 부족한 `ripgrep`, `bubblewrap`, `socat` 및 seccomp 필터가 나열됩니다. Claude Code를 설치하고 다시 시작한 후 탭이 보이지 않으면 모든 종속성이 있는 것입니다.148의존성이 누락된 경우 `/sandbox`의 Dependencies 탭에 `ripgrep`, `bubblewrap`, `socat`, seccomp 필터 중 플랫폼에 없는 항목이 나열됩니다. 설치 후 Claude Code를 재시작했는데 이 탭이 보이지 않는다면 모든 의존성이 갖춰진 것입니다.
93 149
94Ripgrep은 기본 Claude Code 바이너리와 함께 번들로 제공됩니다. seccomp 필터는 선택 사항이며 Unix 도메인 소켓 차단을 추가합니다. 누락된 경우 `npm install -g @anthropic-ai/sandbox-runtime`으로 설치하세요.150Ripgrep은 네이티브 Claude Code 바이너리에 번들로 포함되어 있습니다. seccomp 필터는 선택 사항이며 Unix 도메인 소켓 차단 기능을 추가합니다. 누락된 경우 `npm install -g @anthropic-ai/sandbox-runtime`으로 설치합니다.
95 151
96필수 종속성이 누락되면 Dependencies 탭이 설치될 때까지 유일한 탭으로 표시됩니다. 선택적 seccomp 필터만 누락되면 Dependencies 탭이 다른 탭과 함께 나타납니다. 종속성 확인은 시작 시 실행되므로 패키지를 설치한 후 Claude Code를 다시 시작하여 `/sandbox`가 이를 감지하도록 하세요.152필수 의존성이 누락된 경우 설치하기 전까지 Dependencies 탭만 표시됩니다. 선택 사항인 seccomp 필터만 누락된 경우에는 Dependencies 탭이 다른 탭과 함께 표시됩니다. 의존성 검사는 시작 시 실행되므로, 패키지를 설치한 후 `/sandbox`가 이를 감지하도록 Claude Code를 재시작합니다.
97 153
98<AccordionGroup>154<AccordionGroup>
99 <Accordion title="Ubuntu 24.04 이상: bubblewrap이 사용자 네임스페이스를 생성하도록 허용">155 <Accordion title="Ubuntu 24.04 이상: bubblewrap이 사용자 네임스페이스를 생성하도록 허용">
100 Ubuntu 24.04 이상에서는 기본 AppArmor 정책이 bubblewrap이 격리에 필요한 사용자 네임스페이스를 생성하는 것을 방지합니다.156 Ubuntu 24.04 이상에서는 기본 AppArmor 정책이 bubblewrap이 격리에 필요한 사용자 네임스페이스를 생성하지 못하도록 막습니다.
101 157
102 WSL2 내부를 포함하여 환경이 이 제한을 적용하는지 확인하려면 `sysctl kernel.apparmor_restrict_unprivileged_userns`를 실행하세요. 명령이 `0`을 반환하면 이 단계를 건너뛰세요. `No such file or directory` 오류를 출력하면 키가 없으므로 이 단계를 건너뛸 수 있습니다. `1`을 반환하면 `bwrap`에 이 기능을 부여하는 AppArmor 프로필을 추가하세요:158 WSL2 내부를 포함해 환경에 이 제한이 적용되는지 확인하려면 `sysctl kernel.apparmor_restrict_unprivileged_userns`를 실행합니다. 명령이 `0`을 반환하면 이 단계를 건너뜁니다. `No such file or directory` 오류가 출력되면 해당 키가 존재하지 않는 것이므로 이 단계를 건너뛸 수 있습니다. `1`을 반환하면 `bwrap`에 이 기능을 부여하는 AppArmor 프로필을 추가합니다.
103 159
104 ```bash theme={null}160 ```bash theme={null}
105 sudo tee /etc/apparmor.d/bwrap > /dev/null <<'EOF'161 sudo tee /etc/apparmor.d/bwrap > /dev/null <<'EOF'
113 EOF169 EOF
114 ```170 ```
115 171
116 프로필은 `bwrap` 자체에만 적용되며 샌드박스 내에서 실행되는 명령에는 적용되지 않습니다. AppArmor를 다시 로드하여 적용하세요:172 이 프로필은 `bwrap` 자체에만 적용되며, 샌드박스 내부에서 실행하는 명령에는 적용되지 않습니다. 적용하려면 AppArmor를 다시 로드합니다.
117 173
118 ```bash theme={null}174 ```bash theme={null}
119 sudo systemctl reload apparmor175 sudo systemctl reload apparmor
120 ```176 ```
121 </Accordion>177 </Accordion>
122 178
123 <Accordion title="WSL2 참고">179 <Accordion title="WSL2 참고 사항">
124 PowerShell에서 `wsl -l -v`로 WSL 버전을 확인하세요. `Sandboxing requires WSL2`가 표시되면 배포판이 WSL1을 실행 중입니다. WSL2로 업그레이드하거나 샌드박싱 없이 Claude Code를 실행하세요.180 PowerShell에서 `wsl -l -v`로 WSL 버전을 확인합니다. `Sandboxing requires WSL2`가 표시되면 배포판이 WSL1에서 실행 중인 것입니다. WSL2로 업그레이드하거나 샌드박싱 없이 Claude Code를 실행합니다.
125 181
126 WSL2에서 WSL은 `cmd.exe`, `powershell.exe` 또는 `/mnt/c/` 아래의 모든 항목과 같은 Windows 바이너리 실행을 Unix 소켓을 통해 Windows 호스트에 전달하므로 샌드박스된 명령이 하나를 실행할 수 있는지 여부는 샌드박스의 [Unix 소켓 설정](/docs/ko/settings-reference#sandbox-network-allowunixsockets)을 따릅니다. 선택적 seccomp 필터를 설치하여 먼저 소켓을 차단해야 합니다. 이러한 실행을 허용하려면 `allowAllUnixSockets`를 설정하세요. 샌드박스에서 완전히 제외하려면 명령을 [`excludedCommands`](/docs/ko/settings-reference#sandbox-excludedcommands)에 추가하세요.182 WSL2에서 WSL은 `cmd.exe`, `powershell.exe` 또는 `/mnt/c/` 아래의 모든 항목과 같은 Windows 바이너리 실행을 Unix 소켓을 통해 Windows 호스트에 넘깁니다. 따라서 샌드박스 처리된 명령이 이를 실행할 수 있는지는 샌드박스의 [Unix 소켓 설정](/docs/ko/settings-reference#sandbox-network-allowunixsockets)을 따르며, 애초에 소켓을 차단하려면 선택 사항인 seccomp 필터가 설치되어 있어야 합니다. 이러한 실행을 허용하려면 `allowAllUnixSockets`를 설정합니다. 이 설정은 샌드박스 처리된 명령에 모든 Unix 소켓을 엽니다.
127 </Accordion>183 </Accordion>
128</AccordionGroup>184</AccordionGroup>
129 185
131 샌드박스 모드187 샌드박스 모드
132</h3>188</h3>
133 189
134Claude Code는 두 가지 샌드박스 모드를 제공합니다. 둘 다에서 샌드박스는 동일한 파일 시스템 및 네트워크 제한을 적용합니다. 차이점은 샌드박스된 명령이 자동으로 승인되는지 또는 명시적 권한이 필요한지 여부뿐입니다.190Claude Code는 두 가지 샌드박스 모드를 제공합니다. 두 모드 모두 샌드박스가 동일한 파일 시스템 및 네트워크 제한을 적용하며, 차이는 샌드박스 처리된 명령이 자동 승인되는지 아니면 명시적 권한이 필요한지뿐입니다.
135 191
136<h4 id="auto-allow-mode">192<h4 id="auto-allow-mode">
137 자동 허용 모드193 Auto-allow 모드
138</h4>194</h4>
139 195
140명령을 샌드박스할 수 있으면 Claude Code는 이를 샌드박스 내에서 실행하고 권한을 요청하지 않고 자동으로 승인합니다. 허용되지 않은 호스트에 대한 네트워크 액세스가 필요한 명령과 같이 샌드박스할 수 없는 명령은 일반 권한 흐름으로 폴백하며, Claude Code는 [권한 규칙](/docs/ko/permissions)을 확인하고 해당 규칙이 이미 허용하지 않는 모든 명령을 수동 모드에서 프롬프트로 제어합니다.196명령이 샌드박스 내부에서 실행되면 Claude Code는 확인 요청 없이 자동으로 승인합니다. 명령이 [`excludedCommands`](#run-commands-outside-the-sandbox-with-excludedcommands)에 해당하거나 Claude가 [샌드박스 없이 재시도](#the-unsandboxed-retry-escape-hatch)하여 샌드박스 밖에서 실행되는 경우에는 일반 [권한 흐름](/docs/ko/permissions)을 거칩니다.
197
198허용하지 않은 호스트에 연결하는 샌드박스 처리된 명령은 샌드박스에 그대로 남습니다. 연결 허용 여부를 누가 결정하는지는 [허용된 도메인 밖의 호스트](#hosts-outside-your-allowed-domains)에서 다룹니다.
141 199
142자동 허용 모드에서도 다음이 적용됩니다:200auto-allow 모드에서도 다음은 계속 적용됩니다.
143 201
144* 명시적 [거부 규칙](/docs/ko/permissions)은 항상 존중됩니다.202* 명시적 [거부 규칙](/docs/ko/permissions)은 항상 준수됩니다
145* [중요 경로](/docs/ko/permission-modes#critical-paths)를 대상으로 하는 `rm` 또는 `rmdir` 명령은 여전히 일반 권한 흐름을 거칩니다.203* [중요 경로](/docs/ko/permission-modes#critical-paths)를 대상으로 하는 `rm` 또는 `rmdir` 명령은 여전히 일반 권한 흐름을 거칩니다
146* `Bash(git push *)`와 같은 콘텐츠 범위 [요청 규칙](/docs/ko/permissions)은 샌드박스된 명령에 대해서도 프롬프트를 강제합니다.204* `Bash(git push *)` 같은 내용 범위 [ask 규칙](/docs/ko/permissions)은 샌드박스 처리된 명령에도 여전히 확인을 요청합니다
147* 기본 `Bash` 요청 규칙 또는 동등한 `Bash(*)` 형식은 샌드박스에서 실행되는 명령에 대해 건너뜁니다. 일반 권한 흐름으로 폴백하는 명령에는 여전히 적용됩니다. [계획 모드](/docs/ko/permission-modes#analyze-before-you-edit-with-plan-mode)에서는 규칙이 건너뛰어지지 않습니다. 읽기 전용 명령을 포함하여 샌드박스된 명령에 대해 프롬프트됩니다. v2.1.212 이전에는 건너뛰기가 계획 모드에도 적용되었습니다.205* 단순 `Bash` ask 규칙 또는 이와 동일한 `Bash(*)` 형식은 샌드박스에서 실행되는 명령에는 건너뛰지만, 일반 권한 흐름으로 대체되는 명령에는 여전히 적용됩니다. [플랜 모드](/docs/ko/permission-modes#analyze-before-you-edit-with-plan-mode)에서는 이 규칙을 건너뛰지 않으며, 읽기 전용 명령을 포함해 샌드박스 처리된 명령에도 확인을 요청합니다
148 206
149<Info>207<Info>
150 자동 허용 모드는 [계획 모드](/docs/ko/permission-modes#analyze-before-you-edit-with-plan-mode)를 제외하고 권한 모드 설정과 독립적으로 작동하며, 자동 모드에서는 [명령별 허용 도메인](#per-command-allowed-domains-in-auto-mode)을 수행하는 명령에 대해 작동하고, [서버 측 분류기 검토](/docs/ko/permission-modes#how-the-classifier-evaluates-actions)는 자동 모드에서 샌드박스된 명령에 대해 작동합니다. "수정 사항 수락" 모드가 아니더라도 자동 허용이 활성화되면 샌드박스된 Bash 명령이 자동으로 실행됩니다. 이는 샌드박스 경계 내에서 파일을 수정하는 Bash 명령이 수동 모드에서도 프롬프트 없이 실행됨을 의미합니다. 파일 편집 도구는 프롬프트됩니다.208 auto-allow 모드는 권한 모드 설정과 독립적으로 작동하지만, 세 가지 예외가 있습니다. [플랜 모드](/docs/ko/permission-modes#analyze-before-you-edit-with-plan-mode), [명령별 허용 도메인](#per-command-allowed-domains-in-auto-mode)을 포함한 자동 모드 명령, 그리고 자동 모드에서 샌드박스 처리된 명령에 대한 [서버 측 분류기 검토](/docs/ko/permission-modes#how-the-classifier-evaluates-actions)입니다. "accept edits" 모드가 아니더라도 auto-allow가 활성화되어 있으면 샌드박스 처리된 Bash 명령은 자동으로 실행됩니다. 즉, 파일 편집 도구가 확인을 요청하는 Manual 모드에서도 샌드박스 경계 내에서 파일을 수정하는 Bash 명령은 확인 요청 없이 실행됩니다.
151 209
152 계획 모드에서는 자동 허용이 승인을 넓히지 않습니다. Claude Code가 계획하는 동안 명령을 제어하는 방법은 [계획 모드](/docs/ko/permission-modes#analyze-before-you-edit-with-plan-mode)를 참조하세요. v2.1.212 이전에는 자동 허용이 계획 모드에서도 프롬프트 없이 샌드박스된 명령을 실행했습니다.210 플랜 모드에서는 auto-allow가 승인 범위를 넓히지 않습니다. 계획하는 동안 Claude Code가 명령을 제어하는 방식은 [플랜 모드](/docs/ko/permission-modes#analyze-before-you-edit-with-plan-mode)를 참조하세요.
153</Info>211</Info>
154 212
155<h4 id="regular-permissions-mode">213<h4 id="regular-permissions-mode">
156 일반 권한 모드214 Regular permissions 모드
157</h4>215</h4>
158 216
159모든 Bash 명령은 샌드박스되었을 때도 일반 권한 흐름을 거칩니다. 이는 더 많은 제어를 제공하지만 더 많은 승인이 필요합니다.217모든 Bash 명령은 샌드박스 처리된 경우에도 일반 권한 흐름을 거칩니다. 더 많은 제어를 제공하지만 더 많은 승인이 필요합니다.
160 218
161<h4 id="the-unsandboxed-retry-escape-hatch">219<h4 id="the-unsandboxed-retry-escape-hatch">
162 샌드박스 해제 재시도 이스케이프 해치220 샌드박스 없는 재시도 탈출구
221</h4>
222
223샌드박스 없는 재시도는 샌드박스와 호환되지 않는 도구처럼 샌드박스 내부에서 실패하는 명령을 위한 탈출구입니다. 샌드박스가 네트워크 연결을 차단하면 Claude Code는 명령 결과에 거부된 호스트를 명시하므로 Claude는 무엇이 차단되었는지 알 수 있습니다. Claude는 실패를 분석하고 `dangerouslyDisableSandbox` 파라미터로 명령을 재시도할 수 있습니다.
224
225재시도된 명령은 샌드박스 없이 실행됩니다. 대화형 터미널 세션에서 누가 이를 승인하는지는 권한 모드에 따라 다릅니다.
226
227* **`bypassPermissions` 모드**: 재시도가 확인 요청 없이 실행됩니다
228* **Manual 모드 및 `acceptEdits` 모드**: "Bash command (unsandboxed)"라는 제목의 프롬프트가 표시됩니다
229* **[자동 모드](/docs/ko/permission-modes#eliminate-prompts-with-auto-mode)**: 별도의 분류기 모델이 기본 명령을 평가합니다
230* **`dontAsk` 모드**: Claude Code가 재시도를 거부합니다
231* **플랜 모드**: [계획하는 동안 Claude Code가 명령을 제어하는 방식](/docs/ko/permission-modes#analyze-before-you-edit-with-plan-mode)을 참조하세요
232
233다음 규칙과 설정은 재시도를 승인하는 주체를 변경합니다.
234
235* **일치하는 allow 규칙**: `Bash(curl *)` 같은 allow 규칙이 명령과 일치하면 재시도도 승인하므로, 명령이 확인 요청 없이 샌드박스 밖에서 실행됩니다
236* **파라미터에 대한 ask 규칙**: `Bash(dangerouslyDisableSandbox:true)`에 대한 [ask 규칙](/docs/ko/permissions#match-by-input-parameter)을 추가하면 Bash 재시도 시 확인을 요청받습니다. 자동 모드와 `bypassPermissions` 모드에서도 프롬프트가 표시되며, 이 규칙은 일치하는 allow 규칙보다 우선합니다
237* **[`permissions.blockReadsOutsideWorkingDirectories`](/docs/ko/settings-reference#permissions-blockreadsoutsideworkingdirectories)**: 이 설정이 켜져 있을 때 확인을 요청하는 재시도는 [어떤 모드도 자동 승인하지 않는 작업](/docs/ko/permission-modes#actions-no-mode-auto-approves)에서 다룹니다
238
239<h4 id="turn-off-the-retry-with-strict-sandbox-mode">
240 strict 샌드박스 모드로 재시도 끄기
163</h4>241</h4>
164 242
165일부 명령은 샌드박스 내에서 전혀 실행할 수 없습니다. 예를 들어 호환되지 않는 도구나 허용하지 않은 호스트가 필요한 도구입니다. Claude Code는 차단된 명령의 결과에서 샌드박스 위반을 보고하며, 샌드박스가 거부한 경로 또는 호스트의 이름을 지정하므로 Claude는 샌드박스가 차단한 것을 봅니다. 작업을 실패하거나 샌드박싱을 끄도록 요구하는 대신 Claude Code는 이스케이프 해치를 포함합니다. Claude는 위반을 분석하고 `dangerouslyDisableSandbox` 매개변수로 명령을 재시도할 수 있습니다.243[샌드박스 설정](/docs/ko/settings-reference#sandbox-settings)에서 `"allowUnsandboxedCommands": false`를 설정하여 샌드박스 없는 재시도를 비활성화할 수 있습니다. 재시도가 비활성화되면 Claude Code는 `dangerouslyDisableSandbox` 파라미터를 무시합니다. 그러면 샌드박스가 실행 중인 동안 Claude가 실행하는 명령은 `excludedCommands` 항목과 일치하지 않는 한 샌드박스 처리됩니다. 샌드박스를 시작할 수 없을 때 Claude Code가 샌드박스 없이 명령을 실행하지 않도록 하려면 [`failIfUnavailable`](/docs/ko/settings-reference#sandbox-failifunavailable)도 설정합니다. `/sandbox` **Overrides** 탭에서는 이 설정이 **Strict sandbox mode**로 표시됩니다.
166 244
167재시도된 명령은 샌드박스 외부에서 실행되므로 일반 권한 흐름을 거칩니다. 수동 모드에서는 확인 프롬프트를 받습니다. [자동 모드](/docs/ko/permission-modes#eliminate-prompts-with-auto-mode)에서는 분류기가 기본 명령을 평가합니다. [`permissions.blockReadsOutsideWorkingDirectories`](/docs/ko/settings-reference#permissions-blockreadsoutsideworkingdirectories)가 켜져 있는 동안 샌드박스 외부에서 실행하기 위해 승인이 필요한 재시도는 대신 프롬프트됩니다. 자동 모드에서도 샌드박스 해제된 모든 재시도에 대해 프롬프트되도록 하려면 `Bash(dangerouslyDisableSandbox:true)`에 대한 [요청 규칙](/docs/ko/permissions#match-by-input-parameter)을 추가하세요.245사용자 설정, `--settings` 또는 관리형 설정의 `false`는 프로젝트 설정이 `true`로 설정하더라도 유지됩니다. 사용자 설정의 `false`는 샌드박스를 관리자 필수로 만들지 않으므로 프로젝트의 다른 샌드박스 설정은 계속 적용됩니다. v2.1.285 이전에는 프로젝트의 `true`가 사용자 설정의 `false`를 재정의했습니다.
168 246
169[샌드박스 설정](/docs/ko/settings-reference#sandbox-settings)에서 `"allowUnsandboxedCommands": false`를 설정하여 이 이스케이프 해치를 비활성화할 수 있습니다. 이스케이프 해치가 비활성화되면 Claude Code는 `dangerouslyDisableSandbox` 매개변수를 무시하고 Claude가 실행하는 모든 명령은 `excludedCommands`에 나열하지 않는 한 샌드박스에서 실행되어야 합니다. `/sandbox` **Overrides** 탭은 이 설정을 **Strict sandbox mode**로 표시합니다.247사용자 또는 관리자가 관리형 설정이나 `--settings` 플래그로 재시도를 비활성화하면 샌드박스는 관리자 필수가 됩니다. 그러면 Claude Code는 저장소 파일에서 샌드박스를 완화하는 설정을 `excludedCommands` 항목을 포함해 무시합니다. 해당 설정 목록은 [관리자 필수 샌드박스에서의 저장소 설정](#repository-settings-under-an-admin-required-sandbox)에 나와 있습니다.
170 248
171엄격한 샌드박스 모드는 Claude가 실행하는 명령에 적용됩니다. [`!` 셸 모드 프롬프트](/docs/ko/interactive-mode#shell-mode-with-prefix)에서 직접 입력하는 명령은 세션이 다음 중 하나가 아닌 한 샌드박스 외부에서 실행됩니다:249strict 샌드박스 모드는 Claude가 실행하는 명령에 적용됩니다. [`!` 셸 모드 프롬프트](/docs/ko/interactive-mode#shell-mode-with-prefix)에 직접 입력한 명령은 세션이 다음 중 하나가 아닌 한 샌드박스 밖에서 실행됩니다.
172 250
173* **[백그라운드 세션](/docs/ko/agent-view)**: 엄격한 샌드박스 모드는 셸 모드 명령도 포함합니다.251* **[백그라운드 세션](/docs/ko/agent-view)**: strict 샌드박스 모드가 셸 모드 명령에도 적용됩니다
174* **[`CLAUDE_CODE_SUBPROCESS_ENV_SCRUB`](/docs/ko/env-vars#variables)가 설정된 Linux 세션**: 모든 명령이 샌드박스되며, 셸 모드 명령 포함252* **[`CLAUDE_CODE_SUBPROCESS_ENV_SCRUB`](/docs/ko/env-vars#variables)이 설정된 Linux 세션**: 셸 모드 명령을 포함해 모든 명령이 샌드박스에서 실행됩니다
175 253
176v2.1.260 이전에는 엄격한 샌드박스 모드가 모든 세션에서 셸 모드 명령을 샌드박스했습니다.254v2.1.260 이전에는 strict 샌드박스 모드가 모든 세션에서 셸 모드 명령을 샌드박스 처리했습니다.
177 255
178<h4 id="temporary-directories">256<h4 id="temporary-directories">
179 임시 디렉토리257 임시 디렉터리
180</h4>258</h4>
181 259
182사용자별 임시 디렉토리는 기본적으로 작업 디렉토리와 함께 샌드박스 내에서 쓰기 가능합니다. [파일 시스템 격리를 비활성화](#disable-filesystem-isolation)하지 않는 한 Claude Code는 샌드박스된 명령에 대해 `$TMPDIR`을 이 디렉토리로 설정하므로 임시 파일을 쓰는 도구는 추가 구성 없이 작동합니다.260기본적으로 작업 디렉터리와 함께 사용자별 임시 디렉터리도 샌드박스 내부에서 쓰기가 가능합니다. [파일 시스템 격리를 비활성화](#disable-filesystem-isolation)하지 않는 한, Claude Code는 샌드박스 처리된 명령에 대해 `$TMPDIR`을 이 디렉터리로 설정하므로 임시 파일을 쓰는 도구가 추가 구성 없이 작동합니다.
183 261
184샌드박스 해제된 명령은 셸의 `$TMPDIR`을 변경하지 않고 상속하므로 파일 시스템 격리가 켜져 있는 동안 샌드박스된 명령과 샌드박스 해제된 명령은 `$TMPDIR`을 다른 디렉토리로 해결합니다. 셸이 `$TMPDIR`을 설정하지 않거나 비워두면 `$TMPDIR`을 참조하는 샌드박스 해제된 명령은 [`CLAUDE_CODE_TMPDIR`](/docs/ko/env-vars) 재정의를 받거나, 설정하지 않았거나 재정의가 긴 경로인 경우 운영 체제의 임시 디렉토리를 받으므로 변수가 빈 문자열로 확장되지 않습니다. 두 명령 간에 임시 파일을 전달하려면 대신 작업 디렉토리 아래에 작성하세요.262샌드박스 없는 명령은 셸의 `$TMPDIR`이 설정되어 있으면 이를 상속하므로, 파일 시스템 격리가 켜져 있는 동안 샌드박스 처리된 명령과 샌드박스 없는 명령은 `$TMPDIR`을 서로 다른 디렉터리로 해석합니다. 셸에서 `$TMPDIR`이 설정되지 않았거나 비어 있으면, `$TMPDIR`을 참조하는 샌드박스 없는 명령은 [`CLAUDE_CODE_TMPDIR`](/docs/ko/env-vars) 재정의 값을 받거나, 이를 설정하지 않았거나 재정의 값이 긴 경로인 경우 운영 체제의 임시 디렉터리를 받으므로 변수가 빈 문자열로 확장되지 않습니다. 두 명령 간에 임시 파일을 주고받으려면 대신 작업 디렉터리 아래에 파일을 씁니다.
185 263
186<h2 id="configure-sandboxing">264<h2 id="configure-sandboxing">
187 샌드박싱 구성265 샌드박싱 구성
188</h2>266</h2>
189 267
190`settings.json` 파일을 통해 샌드박스 동작을 사용자 정의합니다. 전체 구성 참조는 [설정](/docs/ko/settings-reference#sandbox-settings)을 참조하세요.268`settings.json` 파일을 통해 샌드박스 동작을 사용자 지정할 수 있습니다. 전체 구성 참조는 [설정](/docs/ko/settings-reference#sandbox-settings)을 참조하세요.
191 269
192기본적으로 샌드박싱된 명령은 현재 작업 디렉터리, 사용자별 임시 디렉터리, 그리고 `--add-dir`, `/add-dir`, 또는 `permissions.additionalDirectories`로 [추가한 모든 디렉터리](/docs/ko/permissions#additional-directories-grant-file-access-not-configuration)에 쓸 수 있습니다. `kubectl`, `terraform`, 또는 `npm`과 같은 하위 프로세스 명령이 해당 디렉터리 외부에 쓸 필요가 있으면 `sandbox.filesystem.allowWrite`를 사용하여 특정 경로에 대한 액세스 권한을 부여합니다:270기본적으로 샌드박스 처리된 명령은 현재 작업 디렉터리, 사용자별 임시 디렉터리, 그리고 `--add-dir`, `/add-dir` 또는 `permissions.additionalDirectories`로 [추가한 디렉터리](/docs/ko/permissions#additional-directories-grant-file-access-not-configuration)에 쓸 수 있습니다. `kubectl`, `terraform`, `npm` 같은 하위 프로세스 명령이 이 디렉터리 외부에 써야 하는 경우 `sandbox.filesystem.allowWrite`를 사용하여 특정 경로에 대한 접근 권한을 부여합니다:
193 271
194```json theme={null}272```json theme={null}
195{273{
202}280}
203```281```
204 282
205이러한 경로는 OS 수준에서 적용되므로 샌드박스 내에서 실행되는 모든 명령(자식 프로세스 포함)이 이를 준수합니다. 이는 도구를 `excludedCommands`로 샌드박스에서 완전히 제외하는 것보다 도구가 특정 위치에 대한 쓰기 액세스가 필요할 때 권장되는 방법입니다.283이 경로들은 OS 수준에서 적용되므로 샌드박스 내부에서 실행되는 모든 명령과 그 하위 프로세스가 이를 따릅니다. 도구에 특정 위치에 대한 쓰기 권한이 필요한 경우, `excludedCommands`로 해당 도구를 샌드박스에서 완전히 제외하는 대신 이 방법을 사용하는 것이 권장됩니다.
206 284
207여러 [설정 범위](/docs/ko/settings#settings-precedence)에서 동일한 파일 시스템 배열을 정의하면 Claude Code는 한 범위의 배열을 다른 범위의 배열로 바꾸지 않고 모든 범위의 경로를 결합하여 병합합니다.285동일한 파일 시스템 배열을 여러 [설정 범위](/docs/ko/settings#settings-precedence)에서 정의하면 Claude Code는 이를 병합하며, 한 범위의 배열을 다른 범위의 배열로 대체하는 대신 모든 범위의 경로를 결합합니다.
208 286
209CLI에서 [`--setting-sources`](/docs/ko/cli-reference)를 사용하거나 Agent SDK에서 [`settingSources`](/docs/ko/agent-sdk/claude-code-features#control-filesystem-settings-with-settingsources)를 사용하여 소스를 제외하면 Claude Code는 샌드박스 구성을 구축할 때 해당 `sandbox.filesystem` 항목, `Edit` 권한 규칙, 및 `Read` 거부 규칙을 무시합니다. Claude Code v2.1.246 이상이 필요합니다.287CLI에서 [`--setting-sources`](/docs/ko/cli-reference)로, 또는 Agent SDK에서 [`settingSources`](/docs/ko/agent-sdk/claude-code-features#control-filesystem-settings-with-settingsources)로 특정 소스를 제외하면, Claude Code는 샌드박스 구성을 만들 때 해당 소스의 `sandbox.filesystem` 항목, `Edit` 권한 규칙, `Read` 거부 규칙을 무시합니다. Claude Code v2.1.246 이상이 필요합니다.
210 288
211세션 중에 이러한 파일 시스템 목록을 편집하면 Claude Code는 [실행 중인 세션에 변경 사항을 적용](/docs/ko/settings#when-edits-take-effect)하므로 다음 샌드박싱된 명령은 새로운 경로에서 실행됩니다.289세션 중에 이 파일 시스템 목록을 편집하면 Claude Code는 [실행 중인 세션에 변경 사항을 적용](/docs/ko/settings#when-edits-take-effect)하므로, 다음에 실행되는 샌드박스 명령은 새 경로로 실행됩니다.
212 290
213경로 접두사는 경로가 어떻게 확인되는지를 제어합니다:291샌드박스 파일 시스템 경로는 표준 규칙을 따릅니다. `/tmp/build`는 절대 경로이고 `~/.kube`는 홈 디렉터리 기준 상대 경로입니다. 이는 절대 경로에 `//path`를, 프로젝트 기준 상대 경로에 `/path`를 사용하는 [Read 및 Edit 권한 규칙](/docs/ko/permissions#read-and-edit)과 다릅니다. 상대 경로, 후행 슬래시, 와일드카드에 대해서는 [샌드박스 경로 접두사](/docs/ko/settings-reference#sandbox-path-prefixes)를 참조하세요.
214 292
215| 접두사 | 의미 | 예시 |293`sandbox.filesystem.denyWrite` 및 `sandbox.filesystem.denyRead`를 사용하여 쓰기 또는 읽기 접근을 거부할 수도 있으며, `sandbox.filesystem.allowRead`를 사용하여 거부된 영역 내의 특정 경로를 다시 허용할 수 있습니다. 읽기 규칙이 겹치는 경우 더 좁은 경로의 규칙이 적용됩니다:
216| :- | :- | :- |
217| `/` | 파일 시스템 루트의 절대 경로 | `/tmp/build`는 `/tmp/build`로 유지됨 |
218| `~/` | 홈 디렉터리에 상대적 | `~/.kube`는 `$HOME/.kube`가 됨 |
219| `./` 또는 접두사 없음 | 프로젝트 설정의 경우 프로젝트 루트에 상대적이거나, 사용자 설정의 경우 `~/.claude`에 상대적 | `.claude/settings.json`의 `./output`은 `<project-root>/output`으로 확인됨 |
220
221이 구문은 절대의 경우 `//path`를 사용하고 프로젝트 상대의 경우 `/path`를 사용하는 [Read 및 Edit 권한 규칙](/docs/ko/permissions#read-and-edit)과 다릅니다. 샌드박스 파일 시스템 경로는 표준 규칙을 사용합니다: `/tmp/build`는 절대입니다. Claude Code가 이러한 경로의 후행 슬래시 또는 와일드카드를 어떻게 처리하는지는 [샌드박스 경로 접두사](/docs/ko/settings-reference#sandbox-path-prefixes)를 참조하세요.
222
223`sandbox.filesystem.denyWrite` 및 `sandbox.filesystem.denyRead`를 사용하여 쓰기 또는 읽기 액세스를 거부할 수도 있으며, `sandbox.filesystem.allowRead`를 사용하여 거부된 영역 내의 특정 경로를 다시 허용할 수 있습니다. 읽기 규칙이 겹칠 때는 더 좁은 경로를 가진 규칙이 적용됩니다:
224 294
225| 예시 규칙 | 결과 |295| 예시 규칙 | 결과 |
226| :- | :- |296| :- | :- |
227| `"denyRead": ["~/"]`과 `"allowRead": ["~/projects"]` | `~/projects`는 읽을 수 있고 홈 디렉터리의 나머지는 차단된 상태로 유지됩니다. 더 좁은 허용이 거부된 영역의 해당 부분을 다시 엽니다 |297| `"denyRead": ["~/"]`와 `"allowRead": ["~/projects"]` | `~/projects`는 읽을 수 있고 홈 디렉터리의 나머지 부분은 차단된 상태로 유지됩니다. 더 좁은 허용 규칙이 거부된 영역의 해당 부분을 다시 엽니다 |
228| `"allowRead": ["~/"]`과 `"denyRead": ["~/.env"]` | `~/.env`는 차단된 상태로 유지되고 홈 디렉터리의 나머지는 읽을 수 있습니다. 거부가 더 넓은 허용 내에서 유지되므로 광범위한 허용이 비밀을 조용히 다시 노출할 수 없습니다 |298| `"allowRead": ["~/"]`와 `"denyRead": ["~/.env"]` | `~/.env`는 차단된 상태로 유지되고 홈 디렉터리의 나머지 부분은 읽을 수 있습니다. 거부 규칙은 더 넓은 허용 규칙 안에서도 유지되므로, 광범위한 허용 규칙이 비밀 정보를 조용히 다시 노출할 수 없습니다 |
229| `"allowRead": ["~/"]`과 `"denyRead": ["~/**/.env"]` | 홈 디렉터리 아래의 모든 `.env`는 차단된 상태로 유지되고 나머지는 읽을 수 있습니다. [와일드카드 거부](/docs/ko/settings-reference#sandbox-path-prefixes)는 정확한 경로와 동일한 방식으로 더 넓은 허용 내에서 유지됩니다 |299| `"allowRead": ["~/"]`와 `"denyRead": ["~/**/.env"]` | 홈 디렉터리 아래의 모든 `.env`는 차단된 상태로 유지되고 나머지는 읽을 수 있습니다. [와일드카드 거부 규칙](/docs/ko/settings-reference#sandbox-path-prefixes)은 정확한 경로와 같은 방식으로 더 넓은 허용 규칙 안에서도 유지됩니다 |
230 300
231아래 예시는 전체 홈 디렉터리에서의 읽기를 차단하면서도 현재 프로젝트에서의 읽기를 허용합니다. 상대 경로 `.`이 프로젝트 설정에 있을 때만 프로젝트 루트로 확인되므로 프로젝트의 `.claude/settings.json`에 배치합니다:301아래 예시는 현재 프로젝트에서의 읽기는 허용하면서 홈 디렉터리 전체에서의 읽기를 차단합니다. 상대 경로 `.`는 구성이 프로젝트 설정에 있을 때만 프로젝트 루트로 해석되므로, 이 구성을 프로젝트의 `.claude/settings.json`에 배치합니다:
232 302
233```json theme={null}303```json theme={null}
234{304{
242}312}
243```313```
244 314
245동일한 구성을 `~/.claude/settings.json`에 배치했다면 `.`은 `~/.claude`로 확인되고 프로젝트 파일은 `denyRead` 규칙에 의해 차단된 상태로 유지됩니다.315동일한 구성을 `~/.claude/settings.json`에 배치하면 `.`가 대신 `~/.claude`로 해석되므로, 프로젝트 파일은 `denyRead` 규칙에 의해 계속 차단됩니다.
316
317작업 디렉터리는 읽을 수 있도록 유지하면서 샌드박스 처리된 명령의 홈 디렉터리 및 마운트된 볼륨 읽기 접근을 거부하려면, 경로 규칙을 작성하는 대신 [`permissions.blockReadsOutsideWorkingDirectories`](/docs/ko/settings-reference#permissions-blockreadsoutsideworkingdirectories)를 설정합니다.
318
319<h3 id="run-commands-outside-the-sandbox-with-excludedcommands">
320 `excludedCommands`로 샌드박스 외부에서 명령 실행
321</h3>
322
323[`sandbox.excludedCommands`](/docs/ko/settings-reference#sandbox-excludedcommands)에 명령 패턴을 나열하면 일치하는 명령이 샌드박스 외부에서 실행되며, 이는 파일 시스템 제한과 네트워크 프록시가 모두 적용되지 않음을 의미합니다. 샌드박스 내부에서 작동할 수 없고 전체 접근 권한을 맡길 만큼 신뢰하는 도구에 사용합니다. 디렉터리 하나나 호스트 하나만 더 필요한 도구는 명령을 샌드박스 안에 유지하는 `allowWrite` 또는 `allowedDomains`로 작동할 수 있습니다.
324
325이 예시는 `docker compose` 명령을 샌드박스에서 제외합니다. 모든 프로젝트에 적용하려면 `~/.claude/settings.json`에 저장합니다:
326
327```json theme={null}
328{
329 "sandbox": {
330 "enabled": true,
331 "excludedCommands": ["docker compose *"]
332 }
333}
334```
335
336Claude Code는 각 Bash 및 Monitor 호출을 항목과 대조합니다. 호출은 Claude가 보내는 전체 명령줄이며, 여러 명령을 연결할 수 있습니다. 호출이 샌드박스를 벗어나는지 여부는 다음 규칙으로 결정됩니다:
337
338* **패턴을 ` *`로 끝내기**: 항목은 `Bash(...)` [권한 규칙](/docs/ko/permissions#permission-rule-syntax)과 동일한 구문을 사용하며, 와일드카드가 없는 패턴은 정확히 일치해야 합니다. `docker`는 인수가 없는 `docker`에만 일치합니다. `docker *`는 인수 유무와 관계없이 `docker`에 일치합니다
339* **호출의 모든 명령이 일치해야 함**: `npm ci && docker compose build`는 다른 항목이 `npm ci`를 포함하지 않는 한 샌드박스 안에 유지됩니다
340* **Claude Code는 호출의 텍스트를 대조함**: 내부적으로 `docker`를 호출하는 스크립트나 `make` 타깃은 일치하지 않으며, `/usr/local/bin/docker`도 일치하지 않습니다
341* **일부 호출은 샌드박스 안에 유지됨**: 파일로의 리디렉션, `cd`, 또는 `$(...)` 같은 명령 치환이 있으면 전체 호출이 샌드박스 안에 유지됩니다. [참조 항목](/docs/ko/settings-reference#sandbox-excludedcommands)에 샌드박스 안에 유지되는 더 많은 호출이 나열되어 있습니다
342* **항목을 저장하는 위치가 중요할 수 있음**: 샌드박스가 [관리자 필수](#repository-settings-under-an-admin-required-sandbox)인 동안 Claude Code는 `.claude/settings.json` 및 `.claude/settings.local.json`의 항목을 무시합니다
343
344제외된 명령은 일반 권한 흐름을 거칩니다:
246 345
247샌드박싱된 명령이 홈 디렉터리 및 마운트된 볼륨에 대한 읽기 액세스를 거부하면서 작업 디렉터리를 읽을 수 있게 유지하려면 경로 규칙을 작성하는 대신 [`permissions.blockReadsOutsideWorkingDirectories`](/docs/ko/settings-reference#permissions-blockreadsoutsideworkingdirectories)를 설정합니다.346* [읽기 전용 명령](/docs/ko/permissions#read-only-commands)과 허용 규칙에 포함된 명령은 프롬프트 없이 실행됩니다
347* 자동 모드에서는 분류기가 그 외의 제외된 명령을 검토합니다
348* `bypassPermissions` 모드에서는 확인 규칙이 일치하지 않는 한 제외된 명령이 프롬프트 없이 실행됩니다
349
350항목이 일치하는지 확인하려면 Manual 모드로 전환한 뒤 Claude에게 `docker compose up -d`처럼 무언가를 변경하는 일치 명령을 실행하도록 요청합니다. 권한 프롬프트의 제목은 "Bash command (unsandboxed)"입니다.
351
352<Warning>
353 제외된 명령은 사용자의 전체 접근 권한으로 실행됩니다. `docker *` 같은 광범위한 항목은 해당 도구가 할 수 있는 모든 작업을 포함합니다. 인터프리터, 작업 디렉터리 내부의 스크립트, 또는 `docker compose`가 compose 파일에 대해 작동하듯 그곳의 파일에 작용하는 도구를 포함하는 패턴을 작성하면, Claude가 해당 파일을 작성한 다음 샌드박스 외부에서 실행할 수 있습니다. 더 좁은 패턴을 사용할수록 Claude가 샌드박스 외부에서 실행할 수 있는 범위가 줄어듭니다.
354</Warning>
248 355
249<h3 id="disable-filesystem-isolation">356<h3 id="disable-filesystem-isolation">
250 파일 시스템 격리 비활성화357 파일 시스템 격리 비활성화
251</h3>358</h3>
252 359
253`sandbox.filesystem.disabled`를 `true`로 설정하여 네트워크 격리를 유지하면서 파일 시스템 격리를 건너뜁니다. 아래 예시는 네트워크 도메인의 허용 목록을 유지하면서 파일 시스템 격리를 끕니다:360네트워크 격리는 유지하면서 파일 시스템 격리를 건너뛰려면 `sandbox.filesystem.disabled`를 `true`로 설정합니다. 아래 예시는 네트워크 도메인 허용 목록을 유지하면서 파일 시스템 격리를 끕니다:
254 361
255```json theme={null}362```json theme={null}
256{363{
266}373}
267```374```
268 375
269샌드박스에는 두 개의 독립적인 계층이 있습니다: [파일 시스템 격리](#filesystem-isolation)는 샌드박싱된 명령이 읽고 쓸 수 있는 경로를 제어하고, [네트워크 격리](#network-isolation)는 도달할 수 있는 도메인을 제어합니다. 파일 시스템 계층이 꺼져 있으면 샌드박싱된 명령은 호스트 파일 시스템에 대한 무제한 읽기 및 쓰기 액세스를 얻지만 네트워크 송신은 허용된 도메인으로 제한됩니다. 명령이 쓰는 내용이 아니라 연결하는 위치를 제어하기 위해 샌드박싱할 때 계층을 끕니다.376샌드박스에는 두 개의 독립적인 계층이 있습니다. [파일 시스템 격리](#filesystem-isolation)는 샌드박스 처리된 명령이 읽고 쓸 수 있는 경로를 제어하고, [네트워크 격리](#network-isolation)는 접근할 수 있는 도메인을 제어합니다. 파일 시스템 계층을 끄면 샌드박스 처리된 명령은 호스트 파일 시스템에 대한 무제한 읽기 및 쓰기 접근 권한을 얻지만, 네트워크 송신은 허용된 도메인으로 계속 제한됩니다. 명령이 무엇을 쓰는지보다 어디에 연결하는지를 제어하기 위해 샌드박스를 사용하는 경우 이 계층을 끕니다.
270 377
271설정은 기본적으로 꺼져 있으며 샌드박스가 실행되는 플랫폼(macOS, Linux, WSL2)에 적용됩니다. Claude Code v2.1.216 이상이 필요합니다.378`sandbox.filesystem.disabled`의 기본값은 `false`입니다. Claude Code v2.1.216 이상이 필요합니다.
272 379
273<Warning>380<Warning>
274 파일 시스템 격리가 꺼져 있고 명령이 자동으로 허용되면 샌드박싱된 명령은 나중에 명령이 실행하거나 읽는 파일(예: 셸 시작 파일, `$PATH`의 실행 파일, 또는 `~/.claude/settings.json`)을 쓸 수 있으며 다음 실행에서 자신의 액세스를 확대하는 데 사용할 수 있습니다. `filesystem.disabled`를 `true`로 설정하는 것은 자신의 액세스를 확대하지 않도록 신뢰하는 워크로드에만 해당합니다. [`allowManagedDomainsOnly`](#keep-developers-from-widening-the-policy)로 네트워크 도메인을 잠그면 위험을 좁히지만 제거하지는 않습니다. 해당 잠금은 샌드박스 내에서 실행되는 명령에만 적용되기 때문입니다.381 파일 시스템 격리가 꺼져 있고 명령이 자동 허용되는 경우, 샌드박스 처리된 명령은 셸 시작 파일, `$PATH`에 있는 실행 파일, `~/.claude/settings.json`처럼 이후 명령이 실행하거나 읽는 파일을 작성하고, 이를 이용해 다음 실행 시 자신의 접근 권한을 넓힐 수 있습니다. 자신의 접근 권한을 확대하지 않을 것으로 신뢰하는 워크로드에 대해서만 `filesystem.disabled`를 `true`로 설정하세요. [`allowManagedDomainsOnly`](#keep-developers-from-widening-the-policy)로 네트워크 도메인을 잠그면 위험이 줄어들지만 제거되지는 않습니다. 이 잠금은 샌드박스 내부에서 실행되는 명령에만 적용되기 때문입니다.
275</Warning>382</Warning>
276 383
277<h4 id="which-settings-can-disable-it">384<h4 id="which-settings-can-disable-it">
278 어떤 설정이 이를 비활성화할 수 있는지385 비활성화할 수 있는 설정
279</h4>386</h4>
280 387
281파일 시스템 격리를 끄면 샌드박싱된 명령이 수행할 수 있는 작업이 확대되므로 Claude Code는 `filesystem.disabled`를 이러한 설정 소스에서만 인정합니다:388파일 시스템 격리를 끄면 샌드박스 처리된 명령이 할 수 있는 작업이 넓어지므로, Claude Code는 다음 설정 소스의 `filesystem.disabled`만 적용합니다:
282 389
283* 사용자 설정, 관리 설정, 및 `--settings` CLI 플래그가 이를 설정할 수 있습니다. `.claude/settings.json` 및 `.claude/settings.local.json`의 프로젝트 설정은 할 수 없으므로 체크아웃된 프로젝트는 파일 시스템 격리를 끌 수 없습니다.390* 사용자 설정, 관리형 설정, `--settings` CLI 플래그에서 설정할 수 있습니다. `.claude/settings.json` 및 `.claude/settings.local.json`의 프로젝트 설정에서는 설정할 수 없으므로, 체크아웃한 프로젝트가 파일 시스템 격리를 끌 수 없습니다.
284* 관리 설정이 `sandbox.filesystem`을 전혀 구성하거나 `"mode": "deny"`를 가진 `sandbox.credentials.files` 항목을 나열하면 관리 설정만 키를 설정할 수 있습니다. 이는 관리자가 배포한 파일 시스템 제한을 유지합니다. 이러한 배포를 완화하려면 관리 설정에서 `"disabled": true`를 설정합니다.391* 관리형 설정이 `sandbox.filesystem`을 조금이라도 구성하거나 `"mode": "deny"`인 `sandbox.credentials.files` 항목을 하나라도 나열하는 경우, 관리형 설정만 이 키를 설정할 수 있습니다. 이를 통해 관리자가 배포한 파일 시스템 제한이 계속 적용됩니다. 이러한 배포를 완화하려면 관리형 설정에서 `"disabled": true`를 설정합니다.
285* [`CLAUDE_CODE_SUBPROCESS_ENV_SCRUB`](/docs/ko/env-vars)가 설정되면 Claude Code는 관리 설정을 포함한 모든 소스에서 `filesystem.disabled`를 무시하고 파일 시스템 격리를 유지합니다.392* [`CLAUDE_CODE_SUBPROCESS_ENV_SCRUB`](/docs/ko/env-vars)이 설정된 경우, Claude Code는 관리형 설정을 포함한 모든 소스의 `filesystem.disabled`를 무시하고 파일 시스템 격리를 켜 둡니다.
286 393
287관리 `credentials.files` 항목이 `filesystem.disabled`를 고정하여 개발자가 파일 시스템 격리를 끌 수 없도록 키를 관리 설정으로 잠그는지 여부는 항목의 `mode`와 샌드박스가 시작될 때 항목에 어떤 일이 발생하는지에 따라 달라집니다:394[유효한](/docs/ko/settings-reference#invalid-credential-entries-in-managed-settings) `mask` 항목은 시작 시 Claude Code가 해당 항목에 대해 [`deny`로 폴백](#mask-credential-files)하더라도 키를 고정하지 않습니다. 자격 증명 디렉터리처럼 마스킹할 수 없는 경로는 관리형 설정에서 명시적인 `deny` 항목으로 나열하면 키가 고정됩니다.
288
289| 관리 항목 | `filesystem.disabled` 고정 | 격리가 꺼져 있을 때 파일을 보호하는 것 |
290| - | - | - |
291| `"mode": "deny"` | 예 | 없음: 읽기 차단은 파일 시스템 계층의 일부입니다 |
292| `"mode": "mask"`, 마스크로 적용됨 | 아니오 | 마스킹 자체: Linux 및 WSL2의 [센티널 복사 및 프록시](#mask-credential-files), macOS의 샌드박스 자체 읽기 규칙 |
293| `"mode": "mask"`, [설정 시 `deny`로 폴백됨](#mask-credential-files) | 아니오 | 없음, `deny`와 동일합니다. 디렉터리와 같이 마스크할 수 없는 경로를 명시적 `deny` 항목으로 나열합니다. 이는 키를 고정합니다 |
294| `"mode": "mask"`, [검증에 의해 `deny`로 저하됨](/docs/ko/managed-settings#invalid-entries-in-managed-settings) | 예, 명시적 `deny`처럼 | 없음, `deny`와 동일합니다 |
295
296폴백은 Claude Code가 이미 설정을 읽은 후 샌드박스가 시작될 때 발생하므로 폴백된 항목은 절대 고정하지 않습니다. 검증은 설정이 로드되는 동안 유효하지 않은 항목을 `deny`로 다시 쓰므로 저하된 항목은 `deny`로 작성한 것처럼 고정합니다.
297 395
298<h4 id="what-changes-when-filesystem-isolation-is-off">396<h4 id="what-changes-when-filesystem-isolation-is-off">
299 파일 시스템 격리가 꺼져 있을 때 무엇이 변하는지397 파일 시스템 격리가 꺼지면 달라지는 점
300</h4>398</h4>
301 399
302`filesystem.disabled`를 설정하면 파일 시스템 계층 자체가 적용하는 보호가 해제됩니다. 다른 계층이 적용하는 보호는 계속 적용됩니다:400`filesystem.disabled`를 설정하면 파일 시스템 계층 자체가 적용하는 보호가 해제됩니다. 다른 계층이 적용하는 보호는 계속 적용됩니다:
303 401
304| 보호 | 파일 시스템 격리가 꺼져 있을 때 |402| 보호 | 파일 시스템 격리가 꺼진 경우 |
305| - | - |403| - | - |
306| `filesystem.denyRead` 및 [`credentials.files`](#protect-credentials) `deny` 읽기 차단 | 적용되지 않음. 파일 시스템 계층이 둘 다 적용합니다 |404| `filesystem.denyRead` 및 [`credentials.files`](#protect-credentials) `deny` 읽기 차단 | 적용되지 않습니다. 둘 다 파일 시스템 계층이 적용합니다 |
307| `credentials.envVars` `deny` 및 `mask` 항목 | 적용됨. 환경 변수 스크러빙은 파일 시스템 계층과 독립적입니다 |405| `credentials.envVars` `deny` 및 `mask` 항목 | 적용됩니다. 환경 변수 제거는 파일 시스템 계층과 독립적입니다 |
308| [`credentials.files` `mask` 항목](#mask-credential-files) 마스크로 적용됨 | 적용됨: 마스킹은 파일 시스템 계층과 독립적입니다. [폴백된](#mask-credential-files) 항목은 적용되지 않으며, 모든 `deny` 항목과 같습니다 |406| 마스크로 적용된 [`credentials.files` `mask` 항목](#mask-credential-files) | 적용됩니다: 마스킹은 파일 시스템 계층과 독립적입니다. [`deny`로 폴백된](#mask-credential-files) 항목은 다른 `deny` 항목과 마찬가지로 적용되지 않습니다 |
309 407
310두 가지가 더 변합니다:408다른 두 가지도 달라집니다:
311 409
312* 샌드박싱된 명령은 모든 임시 디렉터리가 쓸 수 있고 Claude Code가 더 이상 명령을 사용자별 임시 디렉터리로 리디렉션하지 않기 때문에 사용자별 임시 디렉터리 대신 셸의 `$TMPDIR`을 상속합니다.410* 모든 임시 디렉터리에 쓸 수 있게 되어 Claude Code가 더 이상 명령을 사용자별 임시 디렉터리로 리디렉션하지 않으므로, 샌드박스 처리된 명령은 사용자별 임시 디렉터리 대신 셸의 `$TMPDIR`을 상속합니다.
313 411
314 Linux에서 변수는 종종 부모 셸에서 설정되지 않습니다. Bash 도구 지침은 Claude에게 `$TMPDIR`에 의존하는 대신 `mktemp -d`로 스크래치 디렉터리를 만들도록 지시합니다.412 Linux에서는 상위 셸에 이 변수가 설정되지 않은 경우가 많습니다. Bash 도구 지침은 Claude에게 `$TMPDIR`에 의존하는 대신 `mktemp -d`로 임시 작업 디렉터리를 만들도록 안내합니다.
315* [`autoAllowBashIfSandboxed`](/docs/ko/settings-reference#sandbox-autoallowbashifsandboxed)는 여전히 기본값 `true`이므로 샌드박싱된 명령은 프롬프트 없이 계속 실행됩니다. 샌드박싱된 명령에 대한 프롬프트를 표시하려면 `false`로 설정합니다.413* [`autoAllowBashIfSandboxed`](/docs/ko/settings-reference#sandbox-autoallowbashifsandboxed)는 여전히 기본값이 `true`이므로 샌드박스 처리된 명령은 계속 프롬프트 없이 실행됩니다. 샌드박스 처리된 명령에 대해 확인을 요청하려면 `false`로 설정합니다.
316 414
317<h3 id="protect-credentials">415<h3 id="protect-credentials">
318 자격 증명 보호416 자격 증명 보호
319</h3>417</h3>
320 418
321`sandbox.credentials` 설정은 샌드박싱된 명령으로부터 보호할 자격 증명 파일 및 환경 변수를 선언합니다. 각 항목은 파일 경로 또는 환경 변수와 `mode`를 이름 지정합니다. 전용 `credentials` 블록은 자격 증명 규칙을 함께 그룹화하고 일반 파일 시스템 규칙과 분리합니다.419`sandbox.credentials` 설정은 샌드박스 처리된 명령으로부터 보호할 자격 증명 파일과 환경 변수를 선언합니다. 각 항목은 파일 경로 또는 환경 변수와 `mode`를 지정합니다. 전용 `credentials` 블록은 자격 증명 규칙을 한곳에 모아 일반 파일 시스템 규칙과 분리해 둡니다.
322 420
323`"mode": "deny"`를 가진 항목의 경우 파일 경로는 샌드박스 내에서 읽기가 거부되며, 이는 `filesystem.denyRead`가 적용하는 동일한 제한이고, 환경 변수는 각 샌드박싱된 명령 실행 전에 설정 해제됩니다. 파일 보호는 파일 시스템 계층의 일부이므로 [파일 시스템 격리를 비활성화](#disable-filesystem-isolation)하면 적용되지 않습니다. 환경 변수 보호는 여전히 적용됩니다.421`"mode": "deny"` 항목의 경우, 파일 경로는 `filesystem.denyRead`가 적용하는 것과 동일한 제한으로 샌드박스 내부에서 읽기가 거부되며, 환경 변수는 각 샌드박스 명령이 실행되기 전에 설정 해제됩니다. 파일 보호는 파일 시스템 계층의 일부이므로 [파일 시스템 격리를 비활성화](#disable-filesystem-isolation)하면 적용되지 않지만, 환경 변수 보호는 계속 적용됩니다.
324 422
325아래 예시는 AWS 자격 증명 파일 및 SSH 디렉터리의 읽기를 차단하고 샌드박싱된 명령의 환경에서 `GITHUB_TOKEN` 및 `NPM_TOKEN`을 제거합니다:423아래 예시는 AWS 자격 증명 파일과 SSH 디렉터리의 읽기를 차단하고, 샌드박스 처리된 명령의 환경에서 `GITHUB_TOKEN`과 `NPM_TOKEN`을 제거합니다:
326 424
327```json theme={null}425```json theme={null}
328{426{
342}440}
343```441```
344 442
345환경 변수 항목 및 파일 항목도 `"mode": "mask"`를 허용하며, 이는 [자격 증명 마스킹](#mask-credentials)에서 설명합니다.443환경 변수 항목과 파일 항목은 [자격 증명 마스킹](#mask-credentials)에서 설명하는 `"mode": "mask"`도 허용합니다.
346 444
347파일 경로는 `sandbox.filesystem.*` 설정과 동일한 [접두사 규칙](/docs/ko/settings-reference#sandbox-path-prefixes)을 따릅니다.445파일 경로는 `sandbox.filesystem.*` 설정과 동일한 [접두사 규칙](/docs/ko/settings-reference#sandbox-path-prefixes)을 따릅니다.
348 446
349Claude Code는 세션이 로드하는 모든 [설정 범위](/docs/ko/settings#settings-precedence)에서 `deny` 항목을 병합합니다. `deny` 항목은 액세스를 좁히기만 하므로 모든 범위가 하나를 추가할 수 있지만 다른 범위가 추가한 항목을 제거할 수 있는 범위는 없습니다.447Claude Code는 세션이 로드하는 모든 [설정 범위](/docs/ko/settings#settings-precedence)의 `deny` 항목을 병합합니다. `deny` 항목은 접근을 좁히기만 하므로 어떤 범위든 항목을 추가할 수 있지만, 다른 범위가 추가한 항목을 제거할 수 있는 범위는 없습니다.
350 448
351[설정 소스를 제외](#configure-sandboxing)할 때:449[설정 소스를 제외](#configure-sandboxing)하는 경우:
352 450
353* **프로젝트 또는 로컬 설정**: Claude Code는 해당 `credentials` 항목을 적용하지 않습니다. Claude Code v2.1.246 이상이 필요합니다.451* **프로젝트 또는 로컬 설정**: Claude Code는 해당 설정의 `credentials` 항목을 전혀 적용하지 않습니다. Claude Code v2.1.246 이상이 필요합니다.
354* **사용자 설정**: Claude Code는 여전히 `~/.claude/settings.json`의 `deny` 항목을 적용하고 [파일 `mask` 항목](#mask-credential-files)을 제한으로 유지하지만 [환경 변수 `mask` 항목](#mask-environment-variables)을 삭제합니다.452* **사용자 설정**: Claude Code는 `~/.claude/settings.json`의 `deny` 항목을 여전히 적용하고 [파일 `mask` 항목](#mask-credential-files)을 더 이상 프록시가 실제 값을 치환하도록 승인하지 않는 제한으로 유지하지만, [환경 변수 `mask` 항목](#mask-environment-variables)은 제외합니다.
355 453
356기본 제공 자격 증명 거부 목록이 없으므로 나열한 파일 및 변수만 제한됩니다.454기본 제공되는 자격 증명 거부 목록은 없으므로, 나열한 파일과 변수만 제한됩니다.
357 455
358`sandbox.credentials`는 샌드박싱된 Bash 명령에만 영향을 미칩니다. 샌드박싱과 관계없이 모든 하위 프로세스에서 자격 증명을 제거하려면 [`CLAUDE_CODE_SUBPROCESS_ENV_SCRUB`](/docs/ko/env-vars)를 설정합니다.456`sandbox.credentials`는 샌드박스 처리된 Bash 명령에만 영향을 줍니다. 샌드박싱 여부와 관계없이 모든 하위 프로세스에서 자격 증명을 제거하려면 [`CLAUDE_CODE_SUBPROCESS_ENV_SCRUB`](/docs/ko/env-vars)을 설정합니다.
359 457
360<h3 id="mask-credentials">458<h3 id="mask-credentials">
361 자격 증명 마스킹459 자격 증명 마스킹
362</h3>460</h3>
363 461
364마스킹은 [자격 증명 보호](#protect-credentials)의 `deny` 항목보다 더 나아갑니다. 자격 증명을 차단하는 대신 Claude Code는 샌드박싱된 명령에 플레이스홀더인 센티널을 표시하고 [샌드박스 프록시](#network-isolation)는 허용하는 호스트에 대한 아웃바운드 요청에서 실제 값으로 바꿉니다. 파일의 경우 대체는 Linux 및 WSL2 동작입니다. [macOS는 대신 파일을 차단합니다](#mask-credential-files).462자격 증명을 마스킹하면 Claude Code는 샌드박스 처리된 명령에 센티널이라는 세션별 플레이스홀더를 보여 주고, [샌드박스 프록시](#network-isolation)는 허용한 호스트로 나가는 요청에서 실제 값으로 치환합니다. [자격 증명 보호](#protect-credentials)의 `deny` 항목은 대신 자격 증명을 차단합니다. macOS의 파일의 경우 Claude Code는 마스킹하는 대신 [파일을 차단합니다](#mask-credential-files).
365
366<h4 id="mask-environment-variables">
367 환경 변수 마스킹
368</h4>
369
370`"mode": "mask"`는 자격 증명을 보호하면서 이를 사용하여 인증하는 도구를 작동 상태로 유지합니다. `deny`는 변수를 완전히 제거하며, 이는 `gh` 또는 `npm`과 같이 이를 필요로 하는 도구도 중단시킵니다. Claude Code v2.1.199 이상이 필요합니다.
371 463
372`mask`를 사용하면 샌드박싱된 명령은 실제 값 대신 세션별 센티널 값을 봅니다. 각 `mask` 항목은 `injectHosts`를 나열할 수 있으며, 이는 실제 값이 도달할 수 있는 호스트입니다. 요청이 그 중 하나에 대해 샌드박스를 떠날 때 [샌드박스 프록시](#network-isolation)는 센티널을 실제 값으로 바꿉니다. 명령 및 로그하는 모든 것은 실제 자격 증명을 보유하지 않지만 요청은 여전히 인증됩니다.464환경 변수 마스킹에는 Claude Code v2.1.199 이상이 필요합니다. [`sandbox.credentials`](/docs/ko/settings-reference#sandbox-credentials) 참조에 모든 필드가 나열되어 있습니다.
373 465
374프록시는 요청 내용 내에서 자격 증명을 대체하므로 이를 봐야 합니다. [`network.tlsTerminate`](/docs/ko/settings-reference#sandbox-network-tlsterminate)를 설정하여 프록시가 TLS 자체를 종료하도록 합니다.466마스킹에는 다음이 필요합니다:
375 467
376이 없으면 마스킹은 아무것도 노출하지 않고 실패합니다: 명령은 여전히 센티널만 보지만 센티널은 변경되지 않은 상태로 서버에 도달하고 인증이 실패합니다. Claude Code는 시작 시 이 잘못된 구성을 보고합니다.468* **TLS 종료**: 프록시는 요청 내용 안에서 실제 값을 치환하므로 내용을 볼 수 있어야 합니다. 프록시가 TLS를 직접 종료하도록 [`network.tlsTerminate`](/docs/ko/settings-reference#sandbox-network-tlsterminate)를 설정합니다. 이 설정이 없으면 마스킹은 아무것도 노출하지 않은 채 실패합니다. 명령은 여전히 센티널만 보지만, 센티널이 변경되지 않은 채 서버에 도달하여 인증이 실패합니다. Claude Code는 시작 시 이 잘못된 구성을 보고합니다.
469* **허용된 대상**: 각 `mask` 항목에는 실제 값이 도달할 수 있는 호스트인 `injectHosts`를 나열할 수 있습니다. 프록시는 [도메인 허용 목록](#network-isolation)이 허용하는 연결에만 주입하므로, 각 `injectHosts` 호스트는 `network.allowedDomains`를 통해서도 접근 가능해야 합니다. `injectHosts`가 없는 `mask` 항목의 경우, 프록시는 `network.allowedDomains`의 모든 호스트에 대한 요청에서 실제 값을 치환합니다.
470* **신뢰할 수 있는 설정 범위**: 마스킹은 프록시가 실제 자격 증명을 어딘가로 보내도록 승인하므로, Claude Code는 `mask` 항목, `network.tlsTerminate`, [`credentials.allowPlaintextInject`](/docs/ko/settings-reference#sandbox-credentials-allowplaintextinject), `awsPairs`, `sigv4`를 사용자 설정, 관리형 설정, `--settings` 플래그에서만 적용합니다. 저장소의 `.claude/settings.json` 또는 `.claude/settings.local.json`에 있는 항목은 무시합니다. 관리자가 서버 관리형 설정을 통해 `mask` 항목, `network.tlsTerminate` 또는 `credentials.allowPlaintextInject`를 제공하는 경우, 이는 [승인이 필요한 설정](/docs/ko/server-managed-settings#security-approval-dialogs)으로 간주됩니다.
377 471
378대체는 헤더 및 요청 본문을 포함합니다. 자격 증명 자체가 아니라 자격 증명에서 파생된 서명으로 인증하는 요청은 프록시에서 다시 서명해야 합니다. [AWS 요청 다시 서명](#re-sign-aws-requests)은 AWS에 대해 이것이 어떻게 작동하는지를 다룹니다.472<h4 id="mask-environment-variables">
473 환경 변수 마스킹
474</h4>
379 475
380프록시는 [도메인 허용 목록](#network-isolation)이 허용하는 연결에만 주입하므로 각 `injectHosts` 대상도 `network.allowedDomains`를 통해 도달 가능해야 합니다.476환경 변수를 마스킹하려면 해당 `credentials.envVars` 항목에 `"mode": "mask"`를 설정합니다. 명령과 그 명령이 로그에 기록하는 내용은 실제 자격 증명을 절대 보유하지 않지만, 요청은 여전히 인증됩니다. 동일한 변수가 어떤 범위에서든 `deny`로 나열되어 있으면 `deny`가 우선합니다.
381 477
382아래 예시는 두 개의 토큰을 마스킹합니다. `GH_TOKEN`은 `api.github.com`에 대한 요청에서만 대체되고, `NPM_TOKEN`은 `injectHosts`가 없으며 `network.allowedDomains`의 모든 호스트에 대한 요청에서 대체됩니다.478이 예시는 두 개의 토큰을 마스킹합니다. `GH_TOKEN`은 `api.github.com`에 대한 요청에서만 치환되는 반면, `NPM_TOKEN`은 `injectHosts`가 없으므로 `network.allowedDomains`의 모든 호스트에 대한 요청에서 치환됩니다:
383 479
384```json theme={null}480```json theme={null}
385{481{
399}495}
400```496```
401 497
402<span id="ipv6-destinations-in-injecthosts" />IPv6 대상을 두 목록에서 다르게 표기합니다. 각 목록에는 자체 매처가 있기 때문입니다:498마스킹은 기본적으로 전체 값을 교체합니다. `DATABASE_URL` 연결 문자열이나 JWT처럼 구조가 있는 값의 경우, 값을 파싱하는 도구가 계속 작동하도록 [`extract`, `decode`, `maskClaims`, `onExtractNoMatch` 필드](/docs/ko/settings-reference#sandbox-credentials-envvars)를 사용합니다.
403
404* **`network.allowedDomains`**: [도메인 목록이 사용하는 괄호 형식](#ipv6-addresses-in-domain-lists), 예: `"[::1]"`. 프록시는 이 목록을 확인하여 연결을 허용합니다.
405* **`injectHosts`**: 정규 압축 형식의 베어 주소, 예: `"::1"` 또는 `"2001:db8::1"`. 프록시는 각 항목을 연결의 베어 대상 주소와 비교하며 포트를 무시하므로 괄호, 영역 ID, 또는 다르게 압축된 표기는 절대 일치하지 않으며 프록시는 거기에 자격 증명을 주입하지 않습니다.
406
407`claude doctor`는 대상과 절대 일치할 수 없는 `injectHosts` 항목에 `Sandbox credential injectHosts entries can never match their destination` 경고로 플래그를 지정합니다. 이 확인에는 Claude Code v2.1.229 이상이 필요합니다.
408
409`deny`와 달리 마스킹은 프록시가 나열된 호스트에 실제 자격 증명을 보내도록 권한을 부여하므로 Claude Code는 사용자 또는 관리자가 제어하는 설정에서만 이를 인정합니다: 사용자 설정, 관리 설정, 및 `--settings` CLI 플래그. Claude Code는 저장소의 `.claude/settings.json` 또는 `.claude/settings.local.json`의 `mask` 항목을 무시합니다. 이러한 파일에서 `network.tlsTerminate` 및 [`credentials.allowPlaintextInject`](/docs/ko/settings-reference#sandbox-credentials-allowplaintextinject)도 무시합니다. 이는 프록시가 암호화되지 않은 요청에 자격 증명을 주입할 수 있게 하는 설정입니다. [사용자 설정을 제외](#configure-sandboxing)하면 Claude Code는 `~/.claude/settings.json`의 환경 변수 `mask` 항목도 삭제합니다.
410
411관리자가 서버 관리 설정을 통해 `mask` 항목, `network.tlsTerminate`, 또는 `credentials.allowPlaintextInject`를 제공할 때 이들은 [승인이 필요한 설정](/docs/ko/server-managed-settings#security-approval-dialogs)으로 계산됩니다.
412
413동일한 변수가 모든 범위에서 `deny`로 나열되면 `deny`가 우선합니다.
414 499
415마스킹은 기본적으로 변수의 전체 값을 바꾸며, 이는 베어 토큰에 적합합니다. 선택적 항목 필드는 Claude Code v2.1.224 이상이 필요하며 구조화된 값을 처리합니다:500<span id="ipv6-destinations-in-injecthosts" />IPv6 대상은 두 목록에서 서로 다르게 표기합니다:
416 501
417* `extract`: Claude Code가 값 전체에 적용하는 정규 표현식으로, 각 일치의 그룹 1로 캡처된 텍스트만 바꾸므로 값을 구문 분석하는 도구(예: `DATABASE_URL` 연결 문자열)는 샌드박스 내에서 계속 작동합니다. 패턴은 최소한 하나의 캡처 그룹을 포함해야 합니다.502* **`network.allowedDomains`**: `"[::1]"`처럼 대괄호 형식을 사용합니다
418* `onExtractNoMatch`는 패턴이 아무것도 일치하지 않을 때 발생하는 일을 제어합니다:503* **`injectHosts`**: `"::1"`처럼 표준 압축 형식의 순수 주소를 사용합니다
419 * `warn`, 기본값, 경고하고 변수를 마스크되지 않은 상태로 전달합니다
420 * `deny`는 샌드박스 내에서 변수를 설정 해제합니다
421 * `error`는 구성을 수정할 때까지 샌드박스 설정을 중지합니다
422* `decode: "jwt"`: JSON Web Token (JWT)을 보유하는 변수의 경우. Claude Code는 값이 JWT인지 확인하고 이를 구조적으로 유효한 가짜 토큰으로 바꾸므로 샌드박스 내의 토큰을 디코딩하는 코드는 계속 작동합니다. `maskClaims`를 추가하여 전체 토큰을 바꾸는 대신 개별적으로 마스킹할 최상위 페이로드 클레임을 나열합니다. 다른 클레임은 읽을 수 있게 유지됩니다. 값이 JWT로 확인되지 않거나 나열된 클레임이 일치하지 않으면 Claude Code는 경고와 함께 변수를 마스크되지 않은 상태로 전달합니다. `decode`는 `extract`와 결합할 수 없습니다.
423 504
424설정 참조의 [`credentials.envVars[]` 행](/docs/ko/settings-reference#sandbox-settings)에서 전체 필드 목록을 참조하세요.505프록시는 포트를 무시하고 각 `injectHosts` 항목을 연결의 순수 대상 주소와 대조하므로, 대괄호 형식, 영역 ID 포함 형식 또는 다르게 압축된 표기는 절대 일치하지 않습니다. `claude doctor`는 절대 일치할 수 없는 항목을 `Sandbox credential injectHosts entries can never match their destination` 경고로 표시합니다. 이 검사에는 Claude Code v2.1.229 이상이 필요합니다.
425 506
426<h4 id="re-sign-aws-requests">507<h4 id="re-sign-aws-requests">
427 AWS 요청 다시 서명508 AWS 요청 재서명
428</h4>509</h4>
429 510
430AWS 요청은 요청 내용에 대해 SigV4 서명을 수행하므로 `AWS_ACCESS_KEY_ID` 및 `AWS_SECRET_ACCESS_KEY`를 함께 마스킹합니다. 프록시는 액세스 키의 센티널로 SigV4 요청을 감지하고 실제 값을 대체한 후 다시 서명합니다. 비밀만 마스킹하면 플레이스홀더로 서명된 요청이 남으며, 프록시는 이를 감지할 수 없으므로 AWS에서 실패합니다. Claude Code는 시작 시 이 경우에 대해 경고하지만 액세스 키 ID만 마스킹될 때는 경고하지 않습니다. 감지된 요청을 프록시가 다시 서명할 수 없으면(예: `x-amz-date` 헤더가 누락된 경우) 서버에 도달하는 대신 프록시 오류로 실패합니다.511AWS 요청은 요청 내용에 대한 SigV4 서명을 포함하므로 `AWS_ACCESS_KEY_ID`와 `AWS_SECRET_ACCESS_KEY`를 함께 마스킹합니다. 프록시는 액세스 키의 [센티널](#mask-credentials)로 SigV4 요청을 감지하고 실제 값으로 요청을 다시 서명하며, 이에는 Claude Code v2.1.221 이상이 필요합니다. 비밀 키만 마스킹하면 요청이 프록시가 감지할 수 없는 플레이스홀더로 서명되므로 AWS에서 실패합니다.
431 512
432Claude Code는 전체 값을 마스킹할 때 기존 `AWS_ACCESS_KEY_ID`, `AWS_SECRET_ACCESS_KEY`, 및 `AWS_SESSION_TOKEN` 변수를 하나의 자격 증명으로 자동 연결합니다. AWS 자격 증명이 다른 이름의 변수에 있으면 [`credentials.awsPairs`](/docs/ko/settings-reference#sandbox-credentials-awspairs)로 직접 그룹화합니다. 이는 Claude Code v2.1.224 이상이 필요합니다. 이 예시는 이미 [위의 마스킹 구성](#mask-environment-variables)처럼 전체 값으로 `MY_KEY_ID`, `MY_SECRET_KEY`, 및 `MY_SESSION_TOKEN`을 마스킹하는 구성에 페어링을 추가합니다:513관례적인 `AWS_ACCESS_KEY_ID`, `AWS_SECRET_ACCESS_KEY`, `AWS_SESSION_TOKEN` 변수의 전체 값을 마스킹하면 Claude Code는 이를 자동으로 하나의 자격 증명으로 연결합니다. AWS 자격 증명이 다른 이름의 변수에 있는 경우, Claude Code v2.1.224 이상이 필요한 [`credentials.awsPairs`](/docs/ko/settings-reference#sandbox-credentials-awspairs)로 그룹화합니다.
433 514
434```json theme={null}515스트리밍 업로드, 미리 서명된 URL, SigV4A 요청은 프록시가 다시 계산할 수 없는 서명을 포함합니다. 이러한 요청이 마스킹된 페어의 플레이스홀더로 서명된 경우, 프록시는 손상된 서명을 전달하는 대신 요청을 실패시킵니다. 마스킹되지 않은 자격 증명으로 서명된 요청은 영향을 받지 않습니다. 이러한 요청 형식 중 하나를 대신 전달하려면 Claude Code v2.1.224 이상이 필요한 [`credentials.sigv4`](/docs/ko/settings-reference#sandbox-credentials-sigv4)를 사용합니다. AWS는 여전히 요청을 거부하므로, 호출하는 도구는 프록시 오류 대신 AWS 자체의 거부 응답을 받습니다.
435{
436 "sandbox": {
437 "credentials": {
438 "awsPairs": [
439 {
440 "accessKeyIdVar": "MY_KEY_ID",
441 "secretAccessKeyVar": "MY_SECRET_KEY",
442 "sessionTokenVar": "MY_SESSION_TOKEN"
443 }
444 ]
445 }
446 }
447}
448```
449
450각 항목은 다음 규칙을 따릅니다:
451
452* `accessKeyIdVar` 및 `secretAccessKeyVar`는 액세스 키 ID 및 비밀 키를 보유하는 마스킹된 `envVars` 항목의 이름을 지정합니다. 선택적 `sessionTokenVar`는 임시 자격 증명의 세션 토큰을 보유하는 항목의 이름을 지정합니다. 설정되면 프록시는 다시 서명된 요청에서 실제 토큰을 `x-amz-security-token`으로 보냅니다.
453* 각 명명된 변수는 `extract` 또는 `decode` 없이 전체 값을 마스킹하는 `mask` 항목이어야 합니다.
454* 프록시는 액세스 키 ID 항목의 `injectHosts`에 나열된 호스트에서 요청을 다시 서명합니다.
455* 페어에서 기존 변수를 명명하면 자동 페어링을 바꿉니다.
456
457`mask` 항목과 마찬가지로 `awsPairs`는 사용자 설정, 관리 설정, 및 `--settings` CLI 플래그에서만 인정됩니다.
458
459세 가지 AWS 요청 형식은 프록시가 다시 계산할 수 없는 서명을 수행합니다. 이러한 요청이 마스킹된 페어의 플레이스홀더로 서명되면 프록시는 손상된 서명을 전달하는 대신 실패합니다. 마스킹되지 않은 자격 증명으로 서명된 요청은 절대 영향을 받지 않습니다. [`credentials.sigv4`](/docs/ko/settings-reference#sandbox-credentials-sigv4) 설정은 Claude Code v2.1.224 이상이 필요하며 형식별로 이를 완화합니다: 형식의 키를 `passthrough`로 설정하면 플레이스홀더 파생 서명으로 요청을 전달하므로 호출 도구는 프록시 오류 대신 AWS 자체의 거부 응답을 받습니다. `awsPairs`와 마찬가지로 `sigv4`는 사용자 설정, 관리 설정, 및 `--settings` CLI 플래그에서만 인정됩니다.
460
461| 요청 형식 | `sigv4` 키 | 프록시가 다시 서명할 수 없는 이유 |
462| :- | :- | :- |
463| aws-chunked 스트리밍 업로드 | `streaming` | 청크별 서명이 시드 서명에서 체인되므로 다시 서명하려면 본문을 다시 작성해야 합니다 |
464| 사전 서명된 URL | `presigned` | 서명은 `Authorization` 헤더 없이 URL 자체에 있습니다 |
465| SigV4A 비대칭 서명 | `sigv4a` | 다시 계산할 공유 키 HMAC이 없습니다 |
466 516
467<h4 id="mask-credential-files">517<h4 id="mask-credential-files">
468 자격 증명 파일 마스킹518 자격 증명 파일 마스킹
469</h4>519</h4>
470 520
471파일 항목도 `"mode": "mask"`를 허용하며, 이는 Claude Code v2.1.221 이상이 필요합니다. 샌드박싱된 명령이 보는 것은 플랫폼에 따라 다릅니다:521자격 증명 파일을 마스킹하려면 해당 `credentials.files` 항목에 `"mode": "mask"`를 설정합니다. 파일 마스킹에는 Claude Code v2.1.221 이상이 필요합니다. 샌드박스 처리된 명령이 보는 내용은 플랫폼에 따라 다릅니다:
472
473* **Linux 및 WSL2**: 샌드박싱된 명령은 파일의 센티널 복사본을 읽으며, 비밀이 플레이스홀더 값으로 바뀐 대체이고, [샌드박스 프록시](#network-isolation)는 송신에서 실제 값으로 대체합니다.
474* **macOS**: 샌드박싱된 명령은 나열된 파일을 읽을 수 없습니다. Claude Code는 센티널 복사본을 구축하지 않으며 송신에서 아무것도 대체하지 않으므로 파일로 인증하는 도구는 샌드박스 내에서 작동하지 않으며, `deny`와 동일한 효과입니다. `deny` 항목과 달리 읽기 차단은 [파일 시스템 격리를 비활성화](#disable-filesystem-isolation)할 때도 유지됩니다.
475 522
476모든 플랫폼에서 Claude Code는 [`network.tlsTerminate`](/docs/ko/settings-reference#sandbox-network-tlsterminate) 요구 사항 및 `injectHosts`를 [마스킹된 환경 변수](#mask-environment-variables)와 동일한 방식으로 적용하고, 저장소 설정을 동일한 방식으로 무시합니다. [사용자 설정을 제외](#configure-sandboxing)하면 Claude Code는 `~/.claude/settings.json`의 파일 `mask` 항목을 제한으로 유지하지만 항목은 더 이상 프록시가 실제 값을 대체하도록 권한을 부여하지 않습니다.523* **Linux 및 WSL2**: 샌드박스 처리된 명령은 파일의 [센티널](#mask-credentials) 사본을 읽고, 프록시는 나가는 요청에서 실제 값으로 치환합니다.
524* **macOS**: 샌드박스 처리된 명령은 파일을 전혀 읽을 수 없습니다. Claude Code는 센티널 사본을 만들지 않으므로, 해당 파일로 인증하는 도구는 샌드박스 내부에서 작동하지 않으며 이는 `deny`와 같은 효과입니다. 읽기 차단은 [파일 시스템 격리를 비활성화](#disable-filesystem-isolation)한 경우에도 유지됩니다.
477 525
478아래 예시는 `~/.config/gh/hosts.yml`에 저장된 GitHub 토큰을 마스킹합니다. 아래에서 다루는 `extract` 패턴은 Claude Code에 파일의 어느 부분이 비밀인지 알려줍니다. Linux 및 WSL2에서 파일을 읽는 샌드박싱된 명령은 토큰 대신 센티널을 얻으며, 프록시는 `api.github.com`에 대한 요청에서 실제 토큰으로 대체합니다:526이 예시는 `~/.config/gh/hosts.yml`에 저장된 GitHub 토큰을 마스킹합니다. `extract` 패턴은 파일의 어느 부분이 비밀 정보인지 표시하므로, Linux 및 WSL2에서 `gh`는 구성의 나머지 부분을 계속 파싱합니다:
479 527
480```json theme={null}528```json theme={null}
481{529{
499}547}
500```548```
501 549
502마스크가 활성화되었는지 확인하려면 Claude에게 샌드박싱된 명령에서 `cat ~/.config/gh/hosts.yml`을 실행하도록 요청합니다: Linux 및 WSL2에서 출력은 토큰 대신 센티널 값을 표시하고, macOS에서는 읽기가 실패합니다.550마스크가 활성 상태인지 확인하려면 Claude에게 샌드박스 처리된 명령으로 `cat ~/.config/gh/hosts.yml`을 실행하도록 요청합니다. Linux 및 WSL2에서는 출력에 토큰 대신 센티널이 표시되고, macOS에서는 읽기가 실패합니다.
503
504Linux 및 WSL2에서 `extract` 패턴은 `hosts.yml`의 나머지를 읽을 수 있게 유지하는 것입니다. Claude Code는 전체 파일에 정규 표현식을 적용하고 각 일치의 그룹 1로 캡처된 텍스트만 바꾸므로 `gh`는 여전히 구성을 구문 분석하고 토큰만 플레이스홀더입니다. `.netrc`, JSON, 또는 YAML과 같이 도구가 구문 분석하는 구조화된 파일에 `extract`를 사용합니다. 패턴은 최소한 하나의 캡처 그룹을 포함해야 합니다. `extract` 없으면 Claude Code는 전체 파일 내용을 하나의 센티널 값으로 바꾸며, 이는 단일 베어 비밀을 보유하는 파일에 적합합니다.
505
506JWT를 보유하는 파일의 경우 `extract` 대신 또는 함께 `decode: "jwt"`를 설정합니다. `decode`는 Claude Code v2.1.224 이상이 필요합니다. Claude Code는 기본 제공 패턴으로 JWT 후보를 찾거나 설정된 경우 `extract` 패턴으로 찾으며, 각 후보가 JWT인지 확인하고 이를 구조적으로 유효한 가짜 토큰으로 바꾸므로 샌드박스 내에서 토큰을 디코딩하는 코드는 계속 작동합니다. `maskClaims`를 추가하여 전체 토큰을 마스킹하는 대신 마스킹할 명명된 최상위 페이로드 클레임을 나열합니다. 후보가 JWT로 확인되지 않거나 명명된 클레임이 일치하지 않으면 아래의 `onExtractNoMatch` 필드가 결과를 제어하며, 패턴이 아무것도 일치하지 않을 때와 동일합니다.
507 551
508두 개의 선택적 필드는 일치 동작을 정제합니다. 둘 다 `mode`가 `mask`이고 `extract` 또는 `decode`가 설정된 경우에만 적용됩니다. macOS에서 Claude Code는 파일 시스템 격리가 켜져 있을 때마다 `mask` 항목을 `deny`로 적용하므로 이러한 필드 및 아래의 일치 없음 결과는 [파일 시스템 격리가 꺼져 있을 때](#disable-filesystem-isolation)만 적용됩니다:552`extract`나 `decode`가 없으면 Claude Code는 파일 전체를 하나의 센티널로 교체하며, 이는 단일 비밀 정보만 담은 파일에 적합합니다. 부분 마스킹과 패턴이 아무것도 일치하지 않을 때의 동작을 제어하려면 [`extract`, `decode`, `maskClaims`, `onExtractNoMatch`, `maskDuplicates` 필드](/docs/ko/settings-reference#sandbox-credentials-files)를 사용합니다.
509 553
510* `onExtractNoMatch`는 파일에서 마스킹할 항목을 찾지 못할 때 발생하는 일을 제어합니다:554<Warning>
511 555 일치 과정에서 마스킹할 대상을 찾지 못하면 기본 `onExtractNoMatch` 값인 `warn`이 항목을 건너뛰므로, 샌드박스 처리된 명령이 마스킹되지 않은 실제 파일을 읽을 수 있습니다. macOS에서는 파일 시스템 격리가 켜져 있으면 Claude Code가 패턴이 실행되기 전에 `mask` 항목을 `deny`로 적용하므로, 일치 없음 결과는 [파일 시스템 격리가 꺼져 있을](#disable-filesystem-isolation) 때만 적용됩니다. 기본값은 정상적으로 존재하지 않을 수 있는 자격 증명에 적합합니다. 비밀 정보가 존재하지만 패턴이 이를 놓칠 수 있는 경우에는 [`deny`](/docs/ko/settings-reference#mask-fields-for-files)를 사용하세요.
512 * `warn`, 기본값, 경고하고 항목을 건너뜁니다. 따라서 샌드박싱된 명령은 마스크되지 않은 실제 파일을 읽을 수 있습니다. 기본값은 자격 증명이 합법적으로 없을 수 있는 경우에 적합합니다. 비밀이 있을 수 있지만 패턴이 놓칠 수 있으면 `deny`를 사용합니다556</Warning>
513 * `deny`는 파일을 읽을 수 없게 만듭니다
514 * `error`는 구성을 수정할 때까지 샌드박스 설정을 중지합니다
515
516 Claude Code는 읽기 차단이 적용되지 않을 때마다 `deny`를 `error`로 취급합니다: [파일 시스템 격리를 비활성화](#disable-filesystem-isolation)할 때, 그리고 모든 설정 소스의 `filesystem.allowRead` 항목이 파일의 경로를 다시 열 때입니다.
517* `maskDuplicates`는 또한 각 마스킹된 자격 증명 값의 축자 복사본을 바꾸며, `extract` 캡처 또는 `decode` 검증된 토큰은 일치하는 범위 외부에서 발견되며, 일치가 도달하지 않는 곳에서 반복된 비밀의 경우입니다. 원시 부분 문자열을 일치시키므로 짧거나 일반적인 값은 나타나는 모든 곳에서 바뀝니다. 긴 고엔트로피 비밀을 위해 예약합니다. 기본값: false.
518 557
519`mask`는 단일 파일에 적용되므로 각 자격 증명 파일을 개별적으로 나열합니다. Claude Code는 안전하게 마스킹할 수 없는 `mask` 항목으로 폴백합니다: 디렉터리 경로, 글로브 패턴, 8 MiB보다 큰 파일, 또는 UTF-8 텍스트가 아닌 파일입니다. 대신 디렉터리를 명시적 `deny` 항목으로 작성합니다. [어떤 설정이 이를 비활성화할 수 있는지](#which-settings-can-disable-it) 아래의 표는 각 형식이 `filesystem.disabled`를 고정하는지 여부와 파일 시스템 격리가 꺼져 있을 때 어떻게 동작하는지를 다룹니다.558`mask`는 단일 파일에 적용되므로 각 자격 증명 파일을 개별적으로 나열합니다. Claude Code는 안전하게 마스킹할 수 없는 `mask` 항목, 즉 디렉터리 경로, glob 패턴, 8 MiB보다 큰 파일, 또는 UTF-8 텍스트가 아닌 파일에 대해 `deny`로 폴백합니다.
520 559
521<h2 id="how-sandboxing-works">560<h2 id="how-sandboxing-works">
522 샌드박싱 작동 방식561 샌드박싱 작동 방식
526 파일 시스템 격리565 파일 시스템 격리
527</h3>566</h3>
528 567
529샌드박스된 Bash 도구는 파일 시스템 접근을 특정 디렉터리로 제한합니다:568샌드박스가 적용된 Bash 도구는 파일 시스템 액세스를 특정 디렉터리로 제한합니다.
530 569
531* **기본 쓰기 동작**: 현재 작업 디렉터리 및 그 하위 디렉터리, `--add-dir`, `/add-dir` 또는 [`permissions.additionalDirectories`](/docs/ko/settings-reference#permissions-additionaldirectories)로 추가한 모든 디렉터리, 그리고 `$TMPDIR`이 가리키는 사용자별 임시 디렉터리에 대한 읽기 및 쓰기 접근570* **기본 쓰기 동작**: 현재 작업 디렉터리와 그 하위 디렉터리, `--add-dir`, `/add-dir` 또는 [`permissions.additionalDirectories`](/docs/ko/settings-reference#permissions-additionaldirectories)로 추가한 모든 디렉터리, 그리고 `$TMPDIR`가 가리키는 사용자별 임시 디렉터리에 대한 읽기 및 쓰기 액세스
532* **기본 읽기 동작**: 특정 거부된 디렉터리를 제외한 전체 컴퓨터에 대한 읽기 접근. 이 기본 설정은 여전히 `~/.aws/credentials` 및 `~/.ssh/`와 같은 자격 증명 파일 읽기를 허용합니다. [`sandbox.credentials`](#protect-credentials)를 사용하여 이러한 파일의 읽기를 차단하고 비밀 환경 변수를 설정 해제하거나, 경로를 `denyRead`에 추가합니다.571* **기본 읽기 동작**: 거부된 특정 디렉터리를 제외한 컴퓨터 전체에 대한 읽기 액세스. 이 기본값에서는 자격 증명 파일도 읽을 수 있으므로, 명령이 읽지 않았으면 하는 [자격 증명을 보호](#protect-credentials)하십시오.
533* **읽기 차단**: [`permissions.blockReadsOutsideWorkingDirectories`](/docs/ko/settings-reference#permissions-blockreadsoutsideworkingdirectories)가 켜져 있으면, 샌드박스된 명령은 홈 디렉터리 및 [블록 아래의 샌드박스된 명령](/docs/ko/settings-reference#sandboxed-commands-under-the-block)이 나열하는 경로를 제외한 사용자 파일을 보유한 다른 디렉터리에 대한 읽기 접근도 잃습니다. 해당 섹션은 또한 이 블록 부분이 적용되지 않는 경우를 설명합니다.572* **읽기 차단**: [`permissions.blockReadsOutsideWorkingDirectories`](/docs/ko/settings-reference#permissions-blockreadsoutsideworkingdirectories)를 켜면 샌드박스가 적용된 명령은 [차단 시 샌드박스가 적용된 명령](/docs/ko/settings-reference#sandboxed-commands-under-the-block)에 나열된 경로를 제외하고 홈 디렉터리 및 사용자 파일을 보관하는 다른 디렉터리에 대한 읽기 액세스도 잃습니다. 해당 섹션에서는 차단의 이 부분이 적용되지 않는 경우도 설명합니다.
534* **차단된 접근**: 명시적 권한 없이 작업 디렉터리, 추가된 디렉터리, 사용자별 임시 디렉터리 외부의 파일을 수정할 수 없습니다. 여기에는 `~/.bashrc`와 같은 셸 구성 파일 및 `/bin/`의 시스템 바이너리가 포함됩니다.573* **Git worktree**: 작업 디렉터리가 [연결된 git worktree](/docs/ko/worktrees)인 경우, 샌드박스는 `git commit` 같은 명령이 ref와 인덱스를 업데이트할 수 있도록 메인 저장소의 공유 `.git` 디렉터리에 대한 쓰기도 허용합니다. 해당 디렉터리 안의 `hooks/`와 `config`에 대한 쓰기는 계속 거부됩니다.
535* **Git worktrees**: 작업 디렉터리가 [연결된 git worktree](/docs/ko/worktrees)인 경우, 샌드박스는 `git commit`과 같은 명령이 refs 및 인덱스를 업데이트할 수 있도록 주 저장소의 공유 `.git` 디렉터리에 대한 쓰기도 허용합니다. 해당 디렉터리 내의 `hooks/` 및 `config`에 대한 쓰기는 계속 거부됩니다.
536* **구성 가능**: 설정을 통해 사용자 정의 허용 및 거부 경로 정의
537 574
538파일 시스템 격리를 완전히 건너뛰면서 네트워크 격리를 유지하려면 [`sandbox.filesystem.disabled`](#disable-filesystem-isolation)를 설정합니다.575네트워크 격리는 유지하면서 파일 시스템 격리를 완전히 건너뛰려면 [`sandbox.filesystem.disabled`](#disable-filesystem-isolation)를 설정하십시오.
539 576
540<h3 id="protected-paths">577<h3 id="protected-paths">
541 보호된 경로578 보호된 경로
542</h3>579</h3>
543 580
544샌드박스된 명령이 쓸 수 있는 디렉터리 내에서, 샌드박스는 여전히 Claude Code가 구성 및 코드를 로드하는 파일에 대한 쓰기를 거부합니다. 이러한 파일을 편집할 수 있는 명령은 자신에게 권한을 부여하거나, Claude Code가 샌드박스 외부에서 실행하는 hook 또는 MCP 서버를 추가할 수 있습니다. 권한 시스템에는 자체 [보호된 경로](/docs/ko/permission-modes#protected-paths)가 있으며, 이는 도구가 실행되기 전에 Claude Code가 승인하는 것을 제어합니다. 샌드박스의 목록은 이미 실행 중인 명령에 적용됩니다. 네 가지 경로 그룹을 다룹니다:581샌드박스가 적용된 명령이 쓸 수 있는 디렉터리 안에서도, 샌드박스는 Claude Code가 구성과 코드를 로드하는 파일에 대한 쓰기를 여전히 거부합니다. 이러한 파일을 편집할 수 있는 명령은 스스로 권한을 부여하거나, Claude Code가 샌드박스 외부에서 실행하는 훅 또는 MCP 서버를 추가할 수 있습니다. 권한 시스템에는 도구가 실행되기 전에 Claude Code가 승인하는 항목을 제어하는 자체 [보호된 경로](/docs/ko/permission-modes#protected-paths)가 있으며, 샌드박스의 목록은 이미 실행 중인 명령에 적용됩니다. 샌드박스의 목록은 네 가지 경로 그룹을 다룹니다.
545 582
546* **작업 디렉터리 및 그 위의 디렉터리**: `.claude` 설정 파일, `.claude/skills`, `.claude/agents`, `.claude/commands`, `.claude/hooks` 디렉터리, `.mcp.json`, 그리고 Claude Code가 자체적으로 실행하는 파일(예: `.claude/workflows` 및 `.claude/scheduled_tasks.json`)583* **작업 디렉터리와 그 상위 디렉터리**: `.claude` 설정 파일, `.claude/skills`, `.claude/agents`, `.claude/commands`, `.claude/hooks` 디렉터리, `.mcp.json`, 그리고 `.claude/workflows`와 `.claude/scheduled_tasks.json`처럼 Claude Code가 자체적으로 실행하는 파일
547* **작업 디렉터리에만**: `.bashrc` 및 `.zshrc`와 같은 셸 시작 파일, `.gitconfig`, `.vscode` 및 `.idea` 디렉터리, 그리고 `.git` 내의 `hooks` 및 `config`584* **작업 디렉터리에만 해당**: `.bashrc`와 `.zshrc` 같은 셸 시작 파일, `.gitconfig`, `.vscode` 및 `.idea` 디렉터리, 그리고 `.git` 안의 `hooks`와 `config`
548* **작업 디렉터리를 베어 git 저장소로 변환할 파일**: 최상위 수준의 `HEAD`, `objects`, `refs`, 그리고 `HEAD`가 옆에 있을 때의 `config` 및 `hooks`. `HEAD`가 없어도 `config`라는 파일은 거부됩니다. Linux 및 WSL2에서, 샌드박스된 명령이 실행되는 동안 나타나는 최상위 수준의 `HEAD` 파일 또는 `objects` 또는 `refs` 디렉터리는 샌드박스에서 삭제합니다.585* **작업 디렉터리를 bare git 저장소로 만들 수 있는 파일**: 최상위 수준의 `HEAD`, `objects`, `refs`, 그리고 옆에 `HEAD`가 있을 때 해당 위치의 기존 `config` 및 `hooks` 항목. `config`라는 이름의 파일은 `HEAD`가 없어도 거부됩니다. Linux와 WSL2에서는 샌드박스가 적용된 명령이 실행되는 동안 최상위 `HEAD` 파일이나 `objects` 또는 `refs` 디렉터리가 나타나면 샌드박스가 이를 삭제합니다
549* **`~/.claude` 또는 `CLAUDE_CONFIG_DIR`이 가리키는 디렉터리**: 대부분의 내용, 그리고 `~/.claude.json` 및 `.credentials.json` 자격 증명 저장소586* **`~/.claude` 또는 `CLAUDE_CONFIG_DIR`이 가리키는 디렉터리**: 해당 디렉터리 내용의 대부분, 그리고 `~/.claude.json`과 `.credentials.json` 자격 증명 저장소
550 587
551보호된 설정 파일의 경로에 심볼릭 링크가 세션 중에 나타나면, 샌드박스는 다음 명령부터 그것이 가리키는 파일에 대한 쓰기도 거부합니다.588세션 중에 보호된 설정 파일의 경로에 심볼릭 링크가 나타나면, 샌드박스는 다음 명령부터 해당 링크가 가리키는 파일에 대한 쓰기도 거부합니다.
552 589
553이러한 경로 중 하나를 면제할 방법은 없습니다. `allowWrite` 항목 또는 경로를 포함하는 `Edit` 허용 규칙은 보호를 해제하지 않습니다. 보호를 끄는 유일한 방법은 [`filesystem.disabled`](#disable-filesystem-isolation)이며, 이는 모든 경로에 대해 파일 시스템 격리를 끕니다. 이러한 경로 대부분이 머신에서 어떻게 해석되는지 보려면 `/sandbox`를 실행하고 **Config** 탭을 열면, **Denied within allowed** 아래에 나열되어 있으며 자신의 `denyWrite` 항목과 함께 섞여 있습니다.590이러한 경로 중 하나를 예외로 지정하는 방법은 없습니다. 해당 경로를 포함하는 `allowWrite` 항목이나 `Edit` 허용 규칙으로도 보호가 해제되지 않습니다. 보호를 끄는 유일한 방법은 [`filesystem.disabled`](#disable-filesystem-isolation)이며, 이는 모든 경로에 대해 파일 시스템 격리를 끕니다. 사용 중인 머신에서 이러한 경로 대부분이 어떻게 해석되는지 확인하려면 `/sandbox`를 실행하고 **Config** 탭을 여십시오. 이 탭에는 사용자 자신의 `denyWrite` 항목과 함께 **Denied within allowed** 아래에 해당 경로가 나열됩니다.
554 591
555`git merge` 또는 `git checkout`이 이러한 경로 중 하나에서 `unable to unlink old`로 실패하면, [문제 해결](#troubleshooting)을 참조합니다.592이러한 경로 중 하나에서 `git merge` 또는 `git checkout`이 `unable to unlink old`와 함께 실패하면 [git 명령이 `unable to unlink old`와 함께 실패하는 경우](#a-git-command-fails-with-unable-to-unlink-old)를 참조하십시오.
556 593
557<h3 id="network-isolation">594<h3 id="network-isolation">
558 네트워크 격리595 네트워크 격리
559</h3>596</h3>
560 597
561네트워크 접근은 샌드박스 외부에서 실행되는 프록시 서버를 통해 제어됩니다:598샌드박스가 적용된 명령에는 네트워크로 가는 직접 경로가 없습니다.
599
600* **Linux 및 WSL2**: 명령은 네트워크에 연결되지 않은 별도의 네트워크 네임스페이스에서 실행됩니다
601* **macOS**: Seatbelt 샌드박스 프레임워크가 기본적으로 샌드박스 프록시로의 연결을 제외한 모든 연결을 차단합니다
602
603Claude Code는 샌드박스 외부의 사용자 머신에서 샌드박스 프록시를 실행하고, `HTTP_PROXY`, `HTTPS_PROXY`, `ALL_PROXY` 및 관련 환경 변수를 통해 명령을 프록시로 보냅니다. 프록시는 각 연결의 호스트 이름을 허용 및 거부된 도메인과 대조하여 확인합니다.
604
605도구가 어디에 연결할 수 있는지는 프록시를 사용하는지 여부에 따라 달라집니다.
562 606
563* **도메인 제한**: Claude Code는 기본적으로 도메인을 사전 허용하지 않습니다. 명령이 새 도메인이 필요한 첫 번째 시간에, Claude Code는 승인을 요청합니다. [자동 모드](/docs/ko/permission-modes#eliminate-prompts-with-auto-mode)에서는 Claude가 대신 명령이 필요한 호스트를 명령 자체에 [명령별 허용 도메인](#per-command-allowed-domains-in-auto-mode)에 따라 이름을 지정합니다.607* **프록시 변수를 읽는 도구**: `curl`, `npm`, HTTPS를 통한 `git` 및 유사한 도구는 호스트가 허용되면 연결됩니다. 포트가 없는 `allowedDomains` 항목은 해당 호스트의 모든 포트를 허용합니다
564* **승인 선택**: 프롬프트에서 예를 선택하면, Claude Code는 현재 세션의 나머지 동안 호스트를 허용하고 나중에 동일한 호스트에 대한 연결에 대해 다시 프롬프트하지 않습니다. "예, 다시 묻지 마세요"를 선택하면, Claude Code는 `WebFetch(domain:...)` 허용 규칙을 [로컬 설정](/docs/ko/permissions#permission-system)에 저장하므로, 호스트는 향후 세션에서도 허용된 상태로 유지됩니다.608* **프록시 변수를 무시하는 도구**: 일반 `ssh`, 대부분의 데이터베이스 드라이버 및 유사한 도구는 허용된 호스트에도 연결할 수 없습니다. [데이터베이스 클라이언트 또는 기타 비 HTTP 도구가 허용된 호스트에 연결하지 못하는 경우](#a-database-client-or-other-non-http-tool-fails-to-reach-an-allowed-host)를 참조하십시오
565* **사전 허용 도메인**: [`allowedDomains`](/docs/ko/settings-reference#sandbox-network-alloweddomains)로 도메인을 사전 허용하여 프롬프트를 완전히 피합니다. Claude Code는 또한 [권한 규칙](#permission-rules)에 설명된 대로 `WebFetch(domain:...)` 허용 규칙의 도메인을 사전 허용합니다.609* **TCP가 아닌 모든 것**: UDP, QUIC을 통한 HTTP/3, `ping` 같은 ICMP 도구는 샌드박스를 벗어날 수 없습니다
566* **엄격한 허용 목록**: 사용자, 관리 또는 CLI `--settings` 설정에서 [`strictAllowlist`](/docs/ko/settings-reference#sandbox-network-strictallowlist)를 `true`로 설정하면, Claude Code는 프롬프트 대신 허용 목록 외부의 모든 호스트에 대한 샌드박스된 명령 접근을 거부합니다. 허용 목록은 샌드박스가 프롬프트하는 것과 동일합니다: `allowedDomains` 더하기 `WebFetch(domain:...)` 허용 규칙의 도메인, 또는 `allowManagedDomainsOnly`가 설정되었을 때 관리 설정 항목만. Claude Code는 샌드박스된 명령에만 이를 적용합니다. `WebFetch`와 같은 인프로세스 도구는 여전히 [권한 규칙](#permission-rules)을 따릅니다. 저장소의 `.claude/settings.json` 또는 `.claude/settings.local.json`에서 설정하면 효과가 없습니다. Claude Code v2.1.219 이상이 필요합니다.
567* **관리 잠금**: [`allowManagedDomainsOnly`](/docs/ko/settings-reference#sandbox-network-allowmanageddomainsonly)가 관리 설정에서 설정되면, 허용되지 않은 도메인은 프롬프트 대신 자동으로 차단되며, 관리 설정의 `allowedDomains` 및 `WebFetch(domain:...)` 허용 규칙만 인정됩니다.
568* **기업 프록시**: 네트워크가 아웃바운드 트래픽을 기업 프록시를 통해 가도록 요구하는 경우, `HTTPS_PROXY`, `HTTP_PROXY`, `NO_PROXY`를 [프록시 구성](/docs/ko/network-config#proxy-configuration)이 설명하는 대로 설정합니다. 설정의 `env` 블록에서 [백그라운드 에이전트](/docs/ko/network-config#set-network-variables-in-settings-not-the-shell)도 가져오거나, Claude Code를 시작하는 환경에서. Claude Code는 도메인 허용 목록을 적용한 다음 허용된 연결을 해당 업스트림 프록시를 통해 터널링합니다.
569* **사용자 정의 프록시 지원**: 고급 사용자는 아웃바운드 트래픽에 대한 사용자 정의 규칙을 구현할 수 있습니다.
570* **포괄적 범위**: 제한은 명령으로 생성된 모든 스크립트, 프로그램, 서브프로세스에 적용됩니다.
571 610
572`WebFetch(domain:...)` 규칙에서, 샌드박스는 두 가지 와일드카드 형식을 인정합니다: `*.example.com`과 같은 선행 `*.`, 그리고 베어 `*`. 베어 `*` 형식은 Claude Code v2.1.186 이상이 필요합니다. `WebFetch(domain:example.*)`와 같이 다른 위치의 와일드카드는 여전히 페치와 일치하지만 샌드박스된 명령에는 영향을 주지 않습니다.611다음 설정과 동작은 프록시가 어떤 호스트를 허용할지 제어합니다.
612
613* **도메인 제한**: 허용된 도메인은 처음에 비어 있습니다. [허용된 도메인 외부의 호스트](#hosts-outside-your-allowed-domains)에서 명령이 처음으로 새 도메인을 필요로 할 때 어떤 일이 발생하는지 설명합니다.
614* **승인 선택**: 확인 요청 시 Yes를 선택하면 Claude Code는 현재 세션의 나머지 기간 동안 해당 호스트를 허용합니다. "Yes, and don't ask again"을 선택하면 Claude Code는 `WebFetch(domain:...)` 허용 규칙을 [로컬 설정](/docs/ko/permissions#permission-system)에 저장하므로, 이후 세션에서도 해당 호스트가 계속 허용됩니다. 샌드박스가 [관리자 필수](#repository-settings-under-an-admin-required-sandbox)인 동안에는 Claude Code가 규칙을 사용자 설정에 저장하며, 이 규칙은 모든 프로젝트에 적용됩니다.
615* **사전 허용된 도메인**: [`allowedDomains`](/docs/ko/settings-reference#sandbox-network-alloweddomains)로 도메인을 사전 허용하면 프롬프트를 완전히 피할 수 있습니다. [권한 규칙](#permission-rules)에 설명된 대로 Claude Code는 `WebFetch(domain:...)` 허용 규칙의 도메인도 사전 허용합니다.
616* **엄격한 허용 목록**: 사용자, 관리형 또는 CLI `--settings` 설정에서 [`strictAllowlist`](/docs/ko/settings-reference#sandbox-network-strictallowlist)를 `true`로 설정하면, Claude Code는 확인을 요청하는 대신 샌드박스가 적용된 명령의 허용 목록 외부 호스트에 대한 액세스를 거부합니다. 허용 목록은 `allowedDomains`와 `WebFetch(domain:...)` 허용 규칙의 도메인이며, `allowManagedDomainsOnly`가 설정된 경우에는 관리형 설정 항목만 해당됩니다. 저장소의 항목에 대해서는 [관리자 필수 샌드박스 없이 적용되는 잠금](#locks-that-apply-without-an-admin-required-sandbox)에서 설명합니다. Claude Code는 이를 샌드박스가 적용된 명령에만 적용하며, `WebFetch` 같은 프로세스 내 도구는 여전히 해당 [권한 규칙](#permission-rules)을 따릅니다. 저장소의 `.claude/settings.json` 또는 `.claude/settings.local.json`에서 설정하면 효과가 없습니다. Claude Code v2.1.219 이상이 필요합니다.
617* **관리형 잠금**: 관리형 설정에서 [`allowManagedDomainsOnly`](/docs/ko/settings-reference#sandbox-network-allowmanageddomainsonly)가 설정되면, 허용되지 않은 도메인은 확인을 요청하는 대신 자동으로 차단되며, 관리형 설정의 `allowedDomains`와 `WebFetch(domain:...)` 허용 규칙만 적용됩니다.
618* **회사 프록시**: 네트워크에서 아웃바운드 트래픽이 회사 프록시를 거쳐야 하는 경우, [프록시 구성](/docs/ko/network-config#proxy-configuration)에 설명된 대로 `HTTPS_PROXY`, `HTTP_PROXY`, `NO_PROXY`를 설정하십시오. [백그라운드 에이전트](/docs/ko/network-config#set-network-variables-in-settings-not-the-shell)도 이를 받을 수 있도록 설정의 `env` 블록에 설정하거나, Claude Code를 실행하는 환경에서 설정합니다. Claude Code는 도메인 허용 목록을 적용한 다음, 허용된 연결을 해당 업스트림 프록시를 통해 터널링합니다. `http://` 및 `https://` 프록시 URL이 작동하며, 필요한 경우 URL에 기본 인증을 포함할 수 있습니다.
619
620`WebFetch(domain:...)` 규칙에서 샌드박스는 두 가지 와일드카드 형식을 인정합니다. `*.example.com`과 같은 앞쪽의 `*.`와 단독 `*`입니다. 단독 `*` 형식은 Claude Code v2.1.186 이상이 필요합니다. `WebFetch(domain:example.*)`처럼 다른 위치에 있는 와일드카드는 여전히 fetch와 일치하지만 샌드박스가 적용된 명령에는 영향을 주지 않습니다.
573 621
574<Note>622<Note>
575 내장 프록시는 요청된 호스트명을 기반으로 허용 목록을 적용하며, 기본적으로 TLS 트래픽을 종료하거나 검사하지 않습니다. Claude Code v2.1.199 이상에서 사용 가능한 실험적 [`network.tlsTerminate`](/docs/ko/settings-reference#sandbox-network-tlsterminate) 설정은 내장 프록시가 TLS 자체를 종료하도록 하며, 이는 [`mask` 자격 증명 항목](#mask-credentials)에 필요합니다. 기본값의 의미는 [보안 제한](#security-limitations)을 참조하고, 위협 모델이 TLS 검사를 요구하는 경우 [사용자 정의 프록시 구성](#custom-proxy-configuration)을 참조합니다.623 내장 프록시는 요청된 호스트 이름을 기준으로 허용 목록을 적용하며, 기본적으로 TLS 트래픽을 종료하거나 검사하지 않습니다. Claude Code v2.1.199 이상에서 사용할 수 있는 실험적 [`network.tlsTerminate`](/docs/ko/settings-reference#sandbox-network-tlsterminate) 설정은 내장 프록시가 TLS를 직접 종료하도록 하며, 이는 [`mask` 자격 증명 항목](#mask-credentials)에 필요합니다. 기본값의 영향에 대해서는 [보안 제한 사항](#security-limitations)을, 위협 모델에 TLS 검사가 필요한 경우 [사용자 지정 프록시 구성](#custom-proxy-configuration)을 참조하십시오.
576</Note>624</Note>
577 625
626<h4 id="hosts-outside-your-allowed-domains">
627 허용된 도메인 외부의 호스트
628</h4>
629
630샌드박스가 적용된 명령이 허용된 도메인에 없는 호스트에 연결하면, 명령은 샌드박스 안에 머물며 결정을 기다립니다. 대화형 터미널 세션에서는 결정이 권한 모드에 따라 달라집니다.
631
632| 권한 모드 | 연결에 일어나는 일 |
633| :- | :- |
634| `bypassPermissions` 모드, 그리고 [권한 우회를 사용할 수 있는](/docs/ko/permission-modes#skip-all-checks-with-bypasspermissions-mode) 플랜 모드 | 프롬프트 없이 허용됨 |
635| 수동 모드, `acceptEdits` 모드, 그 외의 플랜 모드 | 프롬프트가 표시됨 |
636| 자동 모드 | 명령이 [호스트를 나열](#per-command-allowed-domains-in-auto-mode)하고 분류기가 목록을 승인하지 않는 한 거부됨 |
637| `dontAsk` 모드 | 거부됨 |
638
639[`strictAllowlist`](/docs/ko/settings-reference#sandbox-network-strictallowlist) 또는 [`allowManagedDomainsOnly`](/docs/ko/settings-reference#sandbox-network-allowmanageddomainsonly)가 켜져 있으면, 내장 샌드박스 프록시는 모든 권한 모드에서 연결을 거부합니다. `bypassPermissions` 모드에서는 둘 중 하나가 켜져 있지 않는 한 허용된 도메인 외부의 호스트가 허용됩니다. 해당 모드에서 명령이 샌드박스를 벗어날 수 있는 경우는 [샌드박스 없이 재시도하는 탈출구](#the-unsandboxed-retry-escape-hatch)에서 설명합니다. [`deniedDomains`](/docs/ko/settings-reference#sandbox-network-denieddomains)에 있는 호스트로의 연결도 모든 권한 모드에서 거부됩니다.
640
641<h4 id="hostnames-that-resolve-to-local-addresses">
642 로컬 주소로 해석되는 호스트 이름
643</h4>
644
645호스트 이름이 허용 목록을 통과한 후, 샌드박스 프록시는 이를 해석하며 이름이 로컬 주소로만 해석되는 경우 연결을 거부합니다. 로컬 주소에는 `127.0.0.1` 같은 루프백 주소, `169.254.169.254` 클라우드 메타데이터 엔드포인트 같은 링크 로컬 주소, 그리고 사용자 자신의 머신에 할당된 주소가 포함됩니다. `localhost` 및 `*.localhost` 이름은 루프백으로 해석되도록 허용됩니다.
646
647`10.0.0.0/8` 같은 사설 범위로 해석되는 허용된 인트라넷 호스트 이름은 연결됩니다. 이름이 거부된 주소로 해석되도록 허용하려면 `"127.0.0.1:8080"`처럼 해당 IP 주소를 `allowedDomains`에 추가하십시오.
648
649이 검사는 호스트 이름에 적용됩니다. IP 주소로의 연결은 허용된 도메인과 권한 모드에 따라 결정됩니다. 프록시는 업스트림 회사 프록시를 통해 보내는 연결에 대해서도 검사를 건너뛰는데, 해당 프록시가 이름을 해석하기 때문입니다.
650
578<h4 id="per-command-allowed-domains-in-auto-mode">651<h4 id="per-command-allowed-domains-in-auto-mode">
579 자동 모드에서 명령별 허용 도메인652 자동 모드에서 명령별 허용 도메인
580</h4>653</h4>
581 654
582샌드박싱이 켜진 [자동 모드](/docs/ko/permission-modes#eliminate-prompts-with-auto-mode)에서, Claude는 각 연결에 대해 네트워크 승인을 트리거하는 대신 명령이 필요한 호스트를 명령 자체에 이름을 지정합니다. 샌드박스에서 실행되는 각 Bash, PowerShell 또는 [Monitor](/docs/ko/tools-reference#monitor-tool) 명령은 샌드박스의 허용 목록을 넘어서는 호스트 목록을 가질 수 있습니다: `registry.npmjs.org`와 같은 도메인, `*.pythonhosted.org`와 같은 와일드카드, 또는 IP 주소, 각각 선택적 `:port`. 분류기는 호스트를 명령과 함께 검토합니다. Claude Code v2.1.271 이상이 필요합니다.655샌드박싱이 켜진 [자동 모드](/docs/ko/permission-modes#eliminate-prompts-with-auto-mode)에서는 Claude가 각 연결에 대해 네트워크 승인을 트리거하는 대신 명령 자체에 해당 명령이 필요로 하는 호스트를 명시합니다. 샌드박스에서 실행되는 각 Bash, PowerShell 또는 [Monitor](/docs/ko/tools-reference#monitor-tool) 명령은 샌드박스의 허용 목록 외의 호스트 목록을 가질 수 있습니다. `registry.npmjs.org` 같은 도메인, `*.pythonhosted.org` 같은 와일드카드, 또는 IP 주소이며, 각각 선택적으로 `:port`를 붙일 수 있습니다. 분류기는 명령과 함께 호스트를 검토합니다. Claude Code v2.1.271 이상이 필요합니다.
583 656
584승인된 목록은 해당 명령 하나에만 실행되는 동안 이러한 호스트를 엽니다. 세션의 허용된 호스트 또는 설정에 아무것도 추가되지 않습니다. 다음 명령은 자신의 호스트를 이름 지정합니다.657승인된 목록은 해당 명령 하나에 대해서만, 명령이 실행되는 동안 해당 호스트를 엽니다. 세션의 허용된 호스트나 설정에는 아무것도 추가되지 않으며, 다음 명령은 자체 호스트를 명시합니다.
585 658
586호스트를 가진 명령은 권한 규칙 또는 샌드박스의 [자동 허용 모드](#sandbox-modes)에 의해 승인되는 대신 분류기로 이동합니다. [ask 규칙](/docs/ko/permissions#manage-permissions)이 명령에 대한 프롬프트를 강제하면, 터미널의 권한 대화는 호스트를 옆에 나열하고, 거기서 승인하면 둘 다 포함됩니다.659호스트를 포함하는 명령은 권한 규칙이나 샌드박스의 [자동 허용 모드](#sandbox-modes)로 승인되는 대신 분류기로 전달됩니다. [확인 규칙](/docs/ko/permissions#manage-permissions)이 해당 명령에 대해 프롬프트를 강제하면, 터미널의 권한 대화 상자에 명령과 함께 호스트가 나열되며, 그곳에서 승인하면 둘 다 적용됩니다.
587 660
588명령별 목록은 샌드박스가 기본적으로 거부하는 것만 넓힙니다. [`deniedDomains`](/docs/ko/settings-reference#sandbox-network-denieddomains) 항목은 여전히 차단합니다. [`strictAllowlist`](/docs/ko/settings-reference#sandbox-network-strictallowlist) 또는 [`allowManagedDomainsOnly`](/docs/ko/settings-reference#sandbox-network-allowmanageddomainsonly)가 허용 목록을 잠그면, Claude Code는 명령별 목록을 거부합니다.661명령별 목록은 샌드박스가 기본적으로 거부하는 범위만 넓힙니다. [`deniedDomains`](/docs/ko/settings-reference#sandbox-network-denieddomains) 항목은 여전히 차단합니다. [`strictAllowlist`](/docs/ko/settings-reference#sandbox-network-strictallowlist) 또는 [`allowManagedDomainsOnly`](/docs/ko/settings-reference#sandbox-network-allowmanageddomainsonly)가 허용 목록을 잠그면 Claude Code는 명령별 목록을 거부합니다.
589 662
590명령별 목록이 적용되는 동안, Claude Code는 승인된 명령이 나열하지 않은 호스트에 대한 연결을 프롬프트나 분류기 확인 없이 거부합니다. 거부는 명령의 결과에서 호스트를 이름 지정하고, Claude는 호스트가 추가된 명령을 다시 실행합니다.663명령별 목록이 적용되는 동안 Claude Code는 승인된 명령이 나열하지 않은 호스트로의 연결을 프롬프트나 분류기 검사 없이 거부합니다. 거부 시 명령 결과에 해당 호스트가 명시되며, Claude는 해당 호스트를 추가하여 명령을 다시 실행합니다.
591 664
592<h4 id="ipv6-addresses-in-domain-lists">665<h4 id="ipv6-addresses-in-domain-lists">
593 도메인 목록의 IPv6 주소666 도메인 목록의 IPv6 주소
594</h4>667</h4>
595 668
596샌드박스의 도메인 목록은 `allowedDomains`, `deniedDomains`, 그리고 이들을 공급하는 `WebFetch(domain:...)` 규칙입니다. 이들 중 하나에서 IPv6 주소와 일치하려면, 리터럴을 괄호로 작성합니다: `"[::1]"`은 모든 포트에서 해당 주소와 일치하고, `"[::1]:443"`은 포트 443에서만 일치합니다. 포트를 1에서 65535 사이의 숫자로 선행 0 없이 작성합니다. 괄호로 묶인 형식은 Claude Code v2.1.229 이상이 필요합니다. v2.1.229 이전에는, 괄호로 묶이지 않은 항목의 마지막 콜론 뒤의 텍스트가 포트 번호였을 때, Claude Code는 이를 포트로 읽었으므로 `::1:443`은 포트 443의 주소 `::1`을 이름 지정했습니다.669`allowedDomains`, `deniedDomains` 또는 `WebFetch(domain:...)` 규칙에서 IPv6 주소를 일치시키려면 주소를 대괄호로 묶어 작성하십시오. `"[::1]"`은 모든 포트에서 해당 주소와 일치하고, `"[::1]:443"`은 포트 443에서만 일치합니다. 대괄호 형식은 Claude Code v2.1.229 이상이 필요합니다.
597 670
598IPv6 주소에 대한 네트워크 승인 프롬프트에서 "예, 다시 묻지 마세요"를 선택하면, Claude Code는 `WebFetch(domain:...)` 규칙을 주소가 괄호로 묶인 상태로 저장하므로, 규칙은 향후 세션에서 주소와 일치하는 상태로 유지됩니다.671`::1:443` 같은 대괄호 없는 항목은 주소인지, 포트가 붙은 주소인지 모호합니다.
599 672
600괄호로 묶이지 않은 항목이 두 개 이상의 콜론을 가지면 모호합니다: `::1:443`은 완전한 IPv6 주소이자 주소 뒤에 포트가 있는 것입니다. Claude Code는 어느 읽기를 의도했는지 추측하는 대신 모호한 철자를 보수적으로 적용합니다:673* **거부 목록**: Claude Code는 항목이 파싱되는 모든 해석을 거부하므로, 사용자가 의도한 해석이 무엇이든 차단됩니다. 파싱 가능한 해석이 없는 항목의 경우 Claude Code는 아무것도 차단하지 않습니다
674* **허용 목록**: Claude Code는 사용자가 작성한 것보다 더 많이 허용하지 않습니다. 호스트와 포트 해석이 깔끔하게 파싱되면 모호한 항목을 그 해석으로 다시 작성하며, 허용 목록을 넓히는 대신 항목을 완전히 삭제할 수도 있습니다
601 675
602* **거부 목록**: Claude Code는 항목이 파싱하는 모든 읽기를 거부하므로, 어느 읽기를 의도했든 차단됩니다. 파싱 가능한 읽기가 없는 항목의 경우, Claude Code는 아무것도 차단하지 않습니다.676모호한 항목을 찾으려면 터미널에서 `claude doctor`를 실행하고 `Sandbox network domain entries have unreliable spellings` 경고를 확인하십시오. 각 모호한 항목을 대괄호 형식으로 다시 작성하십시오.
603* **허용 목록**: Claude Code는 작성한 것보다 더 많이 허용하지 않습니다. 해당 읽기가 깔끔하게 파싱될 때 모호한 항목을 호스트 및 포트 읽기로 다시 작성하고, 허용 목록을 넓히기보다는 항목을 완전히 삭제할 수 있습니다.
604
605터미널에서 `claude doctor`를 실행하여 영향을 받는 항목을 찾습니다: `Sandbox network domain entries have unreliable spellings` 경고는 최대 3개를 이름 지정하고 나머지를 계산합니다. 각각을 괄호로 묶인 형식으로 다시 작성하여 경고를 지웁니다. 경고는 또한 `@`, 경로 또는 쿼리 문자, 또는 괄호 내 와일드카드와 같은 다른 이유로 철자가 신뢰할 수 없는 항목을 이름 지정합니다.
606 677
607<h3 id="os-level-enforcement">678<h3 id="os-level-enforcement">
608 OS 수준 적용679 OS 수준 적용
609</h3>680</h3>
610 681
611샌드박스된 Bash 도구는 운영 체제 보안 기본 요소를 사용합니다:682샌드박스가 적용된 Bash 도구는 운영 체제 보안 기본 요소를 사용합니다.
612
613* **macOS**: 샌드박스 적용을 위해 Seatbelt를 사용합니다.
614* **Linux**: 격리를 위해 [bubblewrap](https://github.com/containers/bubblewrap)을 사용합니다.
615* **WSL2**: Linux와 동일하게 bubblewrap을 사용합니다.
616 683
617WSL1은 bubblewrap이 WSL2에서만 사용 가능한 커널 기능을 필요로 하기 때문에 지원되지 않습니다.684* **macOS**: 샌드박스 적용에 Seatbelt를 사용합니다
685* **Linux**: 격리에 [bubblewrap](https://github.com/containers/bubblewrap)을 사용합니다
686* **WSL2**: Linux와 마찬가지로 bubblewrap을 사용합니다
618 687
619이러한 동일한 기본 요소는 독립 실행형 [`@anthropic-ai/sandbox-runtime`](https://github.com/anthropic-experimental/sandbox-runtime) 패키지로 사용 가능하며, [샌드박스 환경](/docs/ko/sandbox-environments#sandbox-runtime) 페이지는 전체 Claude Code 프로세스를 래핑하기 위한 별도의 접근 방식으로 다룹니다.688[`@anthropic-ai/sandbox-runtime`](https://github.com/anthropics/sandbox-runtime) 패키지를 단독으로 실행하여 Claude Code 프로세스를 감쌀 수도 있습니다. [샌드박스 런타임](/docs/ko/sandbox-environments#sandbox-runtime)을 참조하십시오.
620 689
621<h2 id="how-sandboxing-relates-to-permissions-and-permission-modes">690<h2 id="how-sandboxing-relates-to-permissions-and-permission-modes">
622 샌드박싱이 권한 및 권한 모드와 어떻게 관련되는지691 샌드박싱이 권한 및 권한 모드와 어떻게 관련되는지
674관리자는 모든 사용자에게 샌드박싱을 요구하고, 개발자가 정책을 확대하는 것을 방지하고, 샌드박스 트래픽을 회사 프록시를 통해 라우팅할 수 있습니다.743관리자는 모든 사용자에게 샌드박싱을 요구하고, 개발자가 정책을 확대하는 것을 방지하고, 샌드박스 트래픽을 회사 프록시를 통해 라우팅할 수 있습니다.
675 744
676<h3 id="enforce-sandboxing-with-managed-settings">745<h3 id="enforce-sandboxing-with-managed-settings">
677 관리 설정으로 샌드박싱 적용746 관리형 설정으로 샌드박싱 적용
678</h3>747</h3>
679 748
680모든 개발자에게 샌드박스를 요구하려면 [관리 설정](/docs/ko/managed-settings#delivery-mechanisms)을 통해 `sandbox` 키를 제공합니다. MDM으로 관리되는 파일 또는 claude.ai의 [서버 관리 설정](/docs/ko/server-managed-settings)을 통해 제공합니다.749모든 개발자에게 샌드박스를 요구하려면 [관리형 설정](/docs/ko/managed-settings#delivery-mechanisms)을 통해 `sandbox` 키를 제공합니다. MDM으로 관리되는 파일 또는 claude.ai의 [서버 관리형 설정](/docs/ko/server-managed-settings)을 통해 제공합니다.
681 750
682다음 관리 설정 구성은 샌드박스를 활성화하고, 샌드박스를 초기화할 수 없으면 Claude Code 시작을 거부하고, 모델이 샌드박스 외부에서 명령을 다시 시도하는 것을 방지합니다:751다음 관리형 설정 구성은 샌드박스를 활성화하고, 플랫폼이 지원되지 않거나 의존성이 누락된 경우 Claude Code 시작을 거부하고, 모델이 샌드박스 외부에서 명령을 재시도하는 것을 방지합니다:
683 752
684```json theme={null}753```json theme={null}
685{754{
691}760}
692```761```
693 762
694`enabled` 이상의 두 키는 샌드박스가 명령을 실행할 수 없을 때 발생하는 일을 제어합니다:763`enabled` 외의 두 키는 샌드박스가 명령을 실행할 수 없을 때 발생하는 일을 제어합니다:
695 764
696* **`failIfUnavailable`**: Linux의 bubblewrap과 같은 누락된 종속성이 경고를 표시하고 샌드박싱 없는 실행으로 폴백하는 대신 Claude Code가 시작되는 것을 차단합니다765* **`failIfUnavailable`**: Linux의 bubblewrap과 같은 의존성이 누락되면 샌드박싱 없는 실행으로 폴백하는 대신 Claude Code가 시작되지 않도록 차단합니다
697* **`allowUnsandboxedCommands: false`**: Claude Code가 `dangerouslyDisableSandbox` 탈출 해치를 무시하므로 샌드박스에서 명령이 실패할 때 Claude가 샌드박스 외부에서 다시 시도할 수 없습니다766* **`allowUnsandboxedCommands: false`**: Claude Code가 `dangerouslyDisableSandbox` 탈출 해치를 무시하므로 샌드박스에서 명령이 실패할 때 Claude가 샌드박스 없이 재시도할 수 없습니다
698 767
699함께 고려할 가치가 있는 두 가지 추가 사항이 있습니다. 격리 없이 실행해야 하는 조직 승인 도구에 대해 `excludedCommands`를 추가합니다. `~/.aws` 및 `~/.ssh`와 같은 자격 증명 디렉토리와 비밀 환경 변수에 대해 [`sandbox.credentials`](#protect-credentials) 항목을 추가합니다. 기본 읽기 정책은 여전히 이를 허용하기 때문입니다.768다음 항목도 함께 추가하는 것을 고려하십시오:
700 769
701이 구성은 Claude가 실행하는 명령을 샌드박싱합니다. 개발자는 여전히 [`!` 셸 모드 프롬프트](/docs/ko/interactive-mode#shell-mode-with-prefix)에서 명령을 입력하고 Claude Code 외부의 모든 터미널에서 이미 가지고 있는 것과 동일한 액세스 권한으로 샌드박스 외부에서 실행할 수 있습니다. 입력된 명령이 샌드박싱되는 세션에 대해서는 [샌드박스 없는 재시도 탈출 해치](#the-unsandboxed-retry-escape-hatch)를 참조하십시오.770* 격리 없이 실행해야 하는 조직 승인 도구에 대해 `excludedCommands`를 추가합니다. 이 구성은 [저장소의 설정이 명령을 샌드박스에서 제외하지 못하도록 막기](#repository-settings-under-an-admin-required-sandbox) 때문입니다
771* `~/.aws` 및 `~/.ssh`와 같은 자격 증명 디렉토리와 비밀 환경 변수에 대해 [`sandbox.credentials`](#protect-credentials) 항목을 추가합니다. 기본 읽기 정책은 여전히 이를 허용하기 때문입니다
702 772
703샌드박스는 기본 Windows에서 실행되지 않으므로 플릿에 Windows 호스트가 포함되면 이 구성을 macOS 및 Linux로 범위를 지정하거나 해당 사용자가 WSL2 또는 컨테이너 내에서 Claude Code를 실행하도록 합니다.773이 구성은 Claude가 실행하는 명령을 샌드박싱합니다. 개발자는 여전히 [`!` 셸 모드 프롬프트](/docs/ko/interactive-mode#shell-mode-with-prefix)에서 명령을 입력하고 Claude Code 외부의 모든 터미널에서 이미 가지고 있는 것과 동일한 액세스 권한으로 샌드박스 외부에서 실행할 수 있습니다. 입력된 명령이 샌드박싱되는 세션에 대해서는 [엄격한 샌드박스 모드](#turn-off-the-retry-with-strict-sandbox-mode)를 참조하십시오.
774
775샌드박스는 기본 Windows에서 실행되지 않으므로 `failIfUnavailable`이 설정되어 있으면 해당 머신에서는 Claude Code가 시작 시 종료됩니다. 플릿에 Windows 호스트가 포함되어 있다면 다음과 같이 할 수 있습니다:
776
777* **운영 체제별로 구성 제공**: MDM을 통해 또는 [관리형 설정 파일](/docs/ko/managed-settings#delivery-mechanisms)로 macOS 및 Linux 머신에만 배포합니다. [서버 관리형 설정](/docs/ko/server-managed-settings#current-limitations)은 조직의 모든 사용자에게 적용됩니다
778* **Windows 사용자를 지원되는 환경으로 이동**: WSL2 또는 컨테이너 내에서 Claude Code를 실행하도록 합니다
704 779
705<h3 id="keep-developers-from-widening-the-policy">780<h3 id="keep-developers-from-widening-the-policy">
706 개발자가 정책을 확대하는 것을 방지781 개발자가 정책을 확대하는 것을 방지
707</h3>782</h3>
708 783
709`enabled` 및 `failIfUnavailable`과 같은 부울 키의 경우 Claude Code는 관리 값을 사용하고 개발자가 로컬로 설정한 모든 것을 무시합니다. `excludedCommands` 및 `allowRead`와 같은 배열 키의 경우 Claude Code는 세션이 로드하는 모든 범위의 항목을 병합하므로 개발자는 정책을 확대하는 항목을 추가할 수 있습니다.784관리형 설정이 `enabled` 또는 `failIfUnavailable`과 같은 부울 키를 설정하면 Claude Code는 관리형 값을 사용하고 개발자가 로컬로 설정한 모든 것을 무시합니다. `allowRead`와 같은 배열 키의 경우 Claude Code는 세션이 로드하는 범위의 항목을 병합하므로, 해당 키에 잠금이 적용되지 않는 한 개발자는 정책을 확대하는 항목을 추가할 수 있습니다.
785
786관리형 설정에서 설정하지 않는 한, 개발자의 사용자 설정 또는 `--settings`로 다음 키를 켤 수 있습니다. 샌드박스가 [관리자 필수](#repository-settings-under-an-admin-required-sandbox)가 아닌 한 저장소의 `.claude/settings.json`으로도 켤 수 있습니다. 각 키는 샌드박스를 약화시키므로, 사용되지 않기를 원한다면 관리형 설정에서 `false`로 설정하십시오:
787
788* [`enableWeakerNestedSandbox`](/docs/ko/settings-reference#sandbox-enableweakernestedsandbox)
789* [`enableWeakerNetworkIsolation`](/docs/ko/settings-reference#sandbox-enableweakernetworkisolation)
790* [`network.allowAllUnixSockets`](/docs/ko/settings-reference#sandbox-network-allowallunixsockets)
791* [`network.allowLocalBinding`](/docs/ko/settings-reference#sandbox-network-allowlocalbinding)
792* [`allowAppleEvents`](/docs/ko/settings-reference#sandbox-allowappleevents) (저장소에서는 켤 수 없음)
710 793
711관리 설정에서 `allowManagedReadPathsOnly`를 `true`로 설정하여 관리 설정의 `allowRead` 항목만 존중되도록 합니다. 이는 개발자가 조직 승인 경로 이상으로 읽기 액세스를 확대하는 것을 방지합니다. 네트워크 도메인을 동일한 방식으로 관리 값으로 잠그려면 [`allowManagedDomainsOnly`](/docs/ko/settings-reference#sandbox-network-allowmanageddomainsonly)를 설정합니다.794관리형 설정에서 `allowManagedReadPathsOnly`를 `true`로 설정하여 관리형 설정의 `allowRead` 항목만 존중되도록 합니다. 이는 개발자가 조직 승인 경로 이상으로 읽기 액세스를 확대하는 것을 방지합니다.
712 795
713관리 설정이 `sandbox.filesystem`을 구성하거나 `"mode": "deny"`를 사용하여 `sandbox.credentials.files` 항목을 나열할 때 관리 설정만 [`filesystem.disabled`](#disable-filesystem-isolation)를 설정할 수 있으므로 개발자는 관리자가 배포한 파일 시스템 제한을 끌 수 없습니다. `mask` 항목이 키를 고정하는지 여부는 해결 방식에 따라 다릅니다. [어떤 설정이 이를 비활성화할 수 있는지](#which-settings-can-disable-it) 아래의 표는 네 가지 경우를 다룹니다.796네트워크 도메인을 동일한 방식으로 관리형 값으로 잠그려면 [`allowManagedDomainsOnly`](/docs/ko/settings-reference#sandbox-network-allowmanageddomainsonly)를 설정합니다. 이 잠금이 켜져 있으면 관리형 설정만 [프록시 포트](#custom-proxy-configuration)를 설정할 수 있습니다.
714 797
715`excludedCommands`는 동등한 관리 전용 잠금이 없으므로 개발자는 항상 샌드박스 외부에서 실행되는 추가 명령을 추가하는 항목을 추가할 수 있습니다. 관리 목록을 좁게 유지합니다.798관리형 설정이 `sandbox.filesystem`을 구성하거나 `"mode": "deny"`를 사용하여 `sandbox.credentials.files` 항목을 나열할 때 관리형 설정만 [`filesystem.disabled`](#disable-filesystem-isolation)를 설정할 수 있으므로 개발자는 관리자가 배포한 파일 시스템 제한을 끌 수 없습니다. [유효한](/docs/ko/settings-reference#invalid-credential-entries-in-managed-settings) `mask` 항목은 키를 잠그지 않습니다. [어떤 설정이 이를 비활성화할 수 있는지](#which-settings-can-disable-it)를 참조하십시오.
799
800<h4 id="repository-settings-under-an-admin-required-sandbox">
801 관리자 필수 샌드박스에서의 저장소 설정
802</h4>
803
804다음 설정 중 하나가 적용되어 있는 동안 샌드박스는 관리자 필수 상태가 됩니다:
805
806* 관리형 설정에서 `false`로 설정되었거나, 관리형 설정이 `true`로 설정하지 않은 상태에서 `--settings` 플래그로 `false`로 설정된 [`allowUnsandboxedCommands`](/docs/ko/settings-reference#sandbox-allowunsandboxedcommands)
807* 관리형 설정에서 `true`로 설정된 [`allowManagedDomainsOnly`](/docs/ko/settings-reference#sandbox-network-allowmanageddomainsonly)
808
809이 설정들은 샌드박스를 켜지 않으므로 `enabled`도 함께 설정하십시오.
810
811샌드박스가 관리자 필수 상태인 동안 Claude Code는 샌드박스를 완화하는 설정을 관리형 설정, `--settings` 플래그, 각 개발자의 `~/.claude/settings.json`에서만 가져옵니다. 저장소의 `.claude/settings.json` 및 `.claude/settings.local.json`에 있는 다음 설정은 무시합니다:
812
813| 저장소 설정 | Claude Code가 무시하는 내용 |
814| :- | :- |
815| `excludedCommands`, `ignoreViolations`, `network.allowedDomains`, `network.allowUnixSockets`, `network.allowMachLookup`, `network.httpProxyPort`, `network.socksProxyPort` | 모든 항목 |
816| `filesystem.allowWrite`, `Edit(...)` 허용 규칙, `permissions.additionalDirectories` | 각 항목이 샌드박싱된 명령에 부여하는 쓰기 액세스. Claude의 파일 도구는 여전히 `Edit(...)` 규칙과 추가 디렉토리를 따릅니다 |
817| `WebFetch(domain:...)` 허용 규칙 | 각 규칙이 샌드박스 허용 목록에 추가하는 호스트. WebFetch 도구는 여전히 해당 규칙을 따릅니다 |
818| `enableWeakerNestedSandbox`, `enableWeakerNetworkIsolation`, `network.allowAllUnixSockets`, `network.allowLocalBinding` | `true`. `false`는 여전히 적용됩니다 |
819| `enabled`, `failIfUnavailable` | 개발자의 `~/.claude/settings.json`이 `true`로 설정한 경우의 `false` |
820| `filesystem.allowRead` | 관리형 설정, `--settings` 또는 사용자 설정이 읽기를 거부하는 경로 또는 그 하위 경로에 있는 항목, 또는 그러한 경로와 일치할 수 있는 glob |
821
822샌드박스가 관리자 필수 상태인 동안에도 다음 설정은 여전히 적용됩니다:
823
824* **저장소의 파일에서**: 거부 항목과 `autoAllowBashIfSandboxed` 값. 저장소가 이를 변경하지 못하도록 하려면 관리형 설정에서 해당 키를 설정하십시오
825* **개발자 본인의 설정에서**: `allowManagedDomainsOnly`와 같은 관리형 전용 잠금이 적용되지 않는 한, 표에 있는 설정은 `~/.claude/settings.json` 또는 `--settings`에서 여전히 적용됩니다. `excludedCommands` 및 `filesystem.allowWrite`와 같은 대부분의 설정에는 관리형 전용 잠금이 없습니다
826
827[관리형 설정으로 샌드박싱 적용](#enforce-sandboxing-with-managed-settings) 아래의 구성은 샌드박스를 관리자 필수 상태로 만듭니다. 저장소에서는 제공할 수 없으므로, 승인된 도구에 필요한 `excludedCommands`, `allowWrite` 및 소켓 항목을 관리형 설정에 추가하십시오.
828
829Claude Code v2.1.285 이상이 필요합니다. v2.1.282부터 v2.1.284까지는 동일한 설정으로 인해 Claude Code가 저장소의 `excludedCommands` 항목을 무시했습니다.
830
831<h4 id="locks-that-apply-without-an-admin-required-sandbox">
832 관리자 필수 샌드박스 없이 적용되는 잠금
833</h4>
834
835일부 설정은 샌드박스가 관리자 필수 상태가 아닐 때에도 Claude Code가 하나의 제한을 직접 재정의하는 저장소 키를 무시하도록 합니다. 각 설정은 해당 행에 명시된 파일에서 설정한 경우에만 이러한 효과가 있으며, 저장소의 다른 샌드박스 설정은 여전히 적용됩니다. Claude Code v2.1.285 이상이 필요합니다.
836
837| 설정 | 설정 위치 | Claude Code가 저장소 설정에서 무시하는 내용 |
838| :- | :- | :- |
839| `network.deniedDomains` 또는 `WebFetch(domain:...)` 거부 규칙 | 관리형 설정, `--settings` | `httpProxyPort` 및 `socksProxyPort` |
840| `network.strictAllowlist` | 관리형 설정, `--settings`, 사용자 설정 | 프록시 포트, `allowedDomains`, `WebFetch(domain:...)` 허용 규칙 |
841| `filesystem.denyRead`, `Read(...)` 거부 규칙 또는 `credentials.files` 항목 | 관리형 설정, `--settings` | 관리형 설정, `--settings` 또는 사용자 설정이 읽기를 거부하는 경로 또는 그 하위 경로에 있는 `allowRead`, `allowWrite`, `Edit(...)` 허용 또는 `additionalDirectories` 항목, 또는 그러한 경로와 일치할 수 있는 glob |
842
843이러한 잠금은 샌드박싱된 명령이 접근할 수 있는 대상을 변경합니다. WebFetch 도구와 Claude의 파일 도구는 여전히 저장소의 규칙과 추가 디렉토리를 따릅니다.
716 844
717<h3 id="custom-proxy-configuration">845<h3 id="custom-proxy-configuration">
718 사용자 정의 프록시 구성846 사용자 정의 프록시 구성
719</h3>847</h3>
720 848
721고급 네트워크 보안이 필요한 조직의 경우 사용자 정의 프록시를 구현하여 다음을 수행할 수 있습니다:849자체 도구로 샌드박스 트래픽을 검사, 필터링 또는 로깅하려면 기본 제공 샌드박스 프록시를 동일한 머신에서 실행하는 프록시로 교체합니다.
722 850
723* HTTPS 트래픽 복호화 및 검사851네트워크의 다른 위치에 있는 회사 프록시를 통해 샌드박스 트래픽을 라우팅하려면 [네트워크 격리](#network-isolation) 아래의 **회사 프록시** 항목에 설명된 대로 대신 `HTTPS_PROXY`를 설정하십시오. 이렇게 하면 Claude Code의 허용 목록이 계속 적용됩니다.
724* 사용자 정의 필터링 규칙 적용
725* 모든 네트워크 요청 로깅
726* 기존 보안 인프라와 통합
727 852
728Claude Code를 프록시로 지정하려면 [샌드박스 설정](/docs/ko/settings-reference#sandbox-settings)에서 프록시 포트를 설정합니다:853샌드박싱된 명령을 프록시로 보내려면 [샌드박스 설정](/docs/ko/settings-reference#sandbox-settings)에서 프록시가 수신 대기하는 localhost 포트를 설정합니다:
729 854
730```json theme={null}855```json theme={null}
731{856{
738}863}
739```864```
740 865
866포트를 설정하면서 `HTTPS_PROXY` 또는 `HTTP_PROXY`도 설정하면, Claude Code는 샌드박싱된 명령이 사용자의 프록시로 보내는 내용을 해당 변수가 지정하는 프록시로 전달하지 않습니다. 회사 프록시에 도달하려면 자체 프록시가 회사 프록시로 전달하도록 구성하십시오.
867
868포트를 설정할 수 있는 파일은 다른 샌드박스 설정에 따라 달라집니다:
869
870* **`allowManagedDomainsOnly`가 켜져 있는 경우**: 관리형 설정만
871* **샌드박스가 [관리자 필수](#repository-settings-under-an-admin-required-sandbox) 상태이거나 [더 좁은 네트워크 잠금](#locks-that-apply-without-an-admin-required-sandbox)이 적용되는 경우**: 관리형 설정, `--settings`, 사용자 설정
872* **그 외의 경우**: 모든 설정 파일
873
874Claude Code는 그 외의 위치에서 설정된 포트를 무시합니다. v2.1.285 이전에는 모든 설정 파일에서 포트를 설정할 수 있었습니다.
875
876<Warning>
877 두 포트 중 하나라도 적용되면 프록시로 전송되는 모든 항목을 필터링하는 책임은 사용자의 프록시에 있습니다. `allowedDomains`, `deniedDomains`, `strictAllowlist`, 승인 프롬프트, [로컬 주소 검사](#hostnames-that-resolve-to-local-addresses)와 같은 Claude Code 자체의 네트워크 제어는 해당 트래픽에 더 이상 적용되지 않습니다. 샌드박싱된 명령은 두 프록시 중 어느 쪽에도 연결할 수 있으므로, 포트를 하나만 설정하면 다른 프록시에 대한 Claude Code의 도메인 목록은 명령이 사용자의 프록시를 통해 접근하는 대상을 제한하지 않습니다.
878</Warning>
879
741<h2 id="troubleshooting">880<h2 id="troubleshooting">
742 문제 해결881 문제 해결
743</h2>882</h2>
744 883
745일부 명령은 샌드박스 내에서 실패하지만 외부에서는 작동합니다. 아래 수정 사항은 가장 일반적인 경우를 다룹니다.884일부 명령은 샌드박스 외부에서는 작동하지만 샌드박스 내에서는 실패합니다. 증상이나 오류 메시지와 일치하는 제목을 찾아보세요.
885
886조직의 샌드박스가 [관리자 필수](#repository-settings-under-an-admin-required-sandbox)인 경우 Claude Code는 이러한 해결 방법에서 언급하는 설정을 프로젝트의 설정 파일에서 무시하므로, 모든 프로젝트에 적용되는 `~/.claude/settings.json`에 저장합니다. 해결 방법이 여전히 효과가 없다면 조직의 관리형 설정에서 해당 키를 설정하고 있을 수 있습니다.
887
888`excludedCommands` 패턴을 추가하는 해결 방법은 해당 패턴과 일치하는 명령에서 샌드박스를 제거합니다. [제외된 명령이 할 수 있는 작업](#run-commands-outside-the-sandbox-with-excludedcommands)을 참조하세요.
746 889
747* **명령이 host-not-allowed 오류로 실패**: 많은 CLI 도구는 특정 호스트에 도달해야 합니다. 프롬프트될 때 권한을 부여하면 호스트가 허용 목록에 추가되므로 도구가 향후 샌드박스 내에서 실행됩니다.890<h3 id="commands-fail-with-a-host-not-allowed-error">
748* **`jest`가 중단되거나 실패**: `watchman`은 샌드박스와 호환되지 않습니다. 대신 `jest --no-watchman`을 실행합니다.891 명령이 host-not-allowed 오류로 실패
749* **Go 기반 CLI가 macOS에서 TLS 검증 실패**: `gh`, `gcloud`, `terraform`과 같은 도구는 Seatbelt에서 TLS 검증에 실패할 수 있습니다. 이러한 도구를 [`excludedCommands`](/docs/ko/settings-reference#sandbox-excludedcommands)에 나열합니다. MITM 프록시 및 사용자 정의 CA와 함께 `httpProxyPort`를 사용하는 경우 대신 [`enableWeakerNetworkIsolation`](/docs/ko/settings-reference#sandbox-enableweakernetworkisolation)을 `true`로 설정합니다.892</h3>
750* **`open`, `osascript`, 또는 브라우저 기반 인증 흐름이 macOS에서 오류 `-600`으로 실패**: 샌드박스는 기본적으로 Apple Events를 차단합니다. 사용자, 관리 또는 CLI 설정에서 [`allowAppleEvents`](/docs/ko/settings-reference#sandbox-allowappleevents)를 `true`로 설정하여 이를 허용합니다. 프로젝트 설정은 이 키에 대해 무시됩니다. 이를 활성화하면 샌드박싱된 명령이 사용자 프롬프트 없이 다른 애플리케이션을 비샌드박싱된 상태로 시작할 수 있고 실행 중인 애플리케이션에 AppleScript 명령을 보낼 수 있으므로 코드 실행 격리가 제거됩니다. 이는 macOS 자동화 동의 프롬프트(TCC)의 적용을 받습니다. 또는 명령을 [`excludedCommands`](/docs/ko/settings-reference#sandbox-excludedcommands)에 추가합니다.893
751* **`docker` 명령 실패**: `docker`는 샌드박스와 호환되지 않습니다. `docker *`를 [`excludedCommands`](/docs/ko/settings-reference#sandbox-excludedcommands)에 추가합니다.894많은 CLI 도구는 특정 호스트에 도달해야 합니다. 확인 요청이 표시되면 호스트를 승인하거나 [`allowedDomains`](/docs/ko/settings-reference#sandbox-network-alloweddomains)에 추가합니다. 조직에서 `allowManagedDomainsOnly`로 허용 목록을 잠근 경우 프롬프트가 표시되지 않으므로 관리자에게 호스트 추가를 요청합니다.
752* **`pbcopy`, `xclip`, 또는 `wl-copy`가 클립보드를 업데이트하지 않음**: 이러한 클립보드 유틸리티는 샌드박스 내에서 시스템 클립보드에 도달하지 못할 수 있으며, 이 경우 이들에게 파이프된 텍스트가 도착하지 않습니다.
753 895
754 Claude의 출력을 클립보드에 넣으려면 Claude에게 응답에서 인쇄하도록 요청한 다음 [`/copy`](/docs/ko/commands)를 실행합니다. `/copy`는 샌드박싱된 명령이 아닌 Claude Code 프로세스에서 클립보드에 씁니다.896<h3 id="jest-hangs-or-fails">
897 `jest`가 중단되거나 실패
898</h3>
755 899
756 Claude가 텍스트를 이러한 도구 중 하나로 파이프할 때, 도구를 [`excludedCommands`](/docs/ko/settings-reference#sandbox-excludedcommands)에 추가해도 그 자체로는 그 호출을 샌드박스 외부로 꺼내지 않습니다.900`watchman`은 샌드박스와 호환되지 않습니다. 대신 `jest --no-watchman`을 실행합니다.
757* **git 명령이 `unable to unlink old`로 실패**: `git merge`, `git checkout` 및 유사한 명령은 샌드박스가 쓰기를 거부하는 파일을 교체해야 할 때 이런 방식으로 실패합니다. 해당 파일이 `.claude/skills`와 같은 [보호된 경로](#protected-paths) 아래에 있거나, `denyWrite` 항목 중 하나 아래에 있거나, 샌드박스가 명령을 쓸 수 있도록 허용하는 디렉토리 외부에 있을 수 있습니다. Linux 및 WSL2에서 오류는 `Read-only file system`으로 끝납니다.
758 901
759 실패 후 Claude는 [명령을 샌드박스 외부에서 다시 실행하도록 제안](#the-unsandboxed-retry-escape-hatch)할 수 있습니다. 해당 재시도를 승인하거나 다른 터미널에서 git 명령을 직접 실행합니다. `allowUnsandboxedCommands`를 `false`로 설정한 경우 Claude는 재시도를 제안할 수 없으므로 명령을 직접 실행합니다. 동일한 git 명령이 자주 실패하면 [`excludedCommands`](/docs/ko/settings-reference#sandbox-excludedcommands)에 추가합니다.902<h3 id="go-based-clis-fail-tls-verification-on-macos">
760* **Bubblewrap이 컨테이너 내에서 시작 실패**: 권한 없는 컨테이너에서 bubblewrap은 새로운 `/proc` 파일시스템을 마운트할 수 없으므로 샌드박싱된 명령은 `bwrap` 오류(예: `Can't mount proc on /newroot/proc: Operation not permitted`)로 실패합니다. [`enableWeakerNestedSandbox`](/docs/ko/settings-reference#sandbox-enableweakernestedsandbox)를 `true`로 설정하여 내부 샌드박스가 컨테이너의 기존 `/proc`을 바인드 마운트하도록 합니다. 외부 컨테이너가 이미 필요한 격리 경계를 제공할 때만 이 설정을 사용합니다. 새로운 `/proc` 마운트가 숨길 프로세스 정보를 샌드박싱된 명령에 노출하기 때문입니다.903 Go 기반 CLI가 macOS에서 TLS 검증 실패
761* **0바이트 읽기 전용 파일이 `.claude` 설정 경로에 나타나고 "예, 다시 묻지 않기"가 저장되지 않음**: Linux 및 WSL2에서 샌드박스는 샌드박싱된 명령이 실행되는 동안 아직 존재하지 않는 파일에 대한 쓰기 거부를 0바이트 읽기 전용 자리 표시자를 만들어 유지합니다. 샌드박스는 그 후 자리 표시자를 제거합니다. 예를 들어 SIGKILL에 의해 세션이 정리 실행 전에 종료되면 자리 표시자가 남아 있습니다. 이후 세션은 매번 시작할 때마다 이들을 읽기 전용으로 바인드하므로 권한 선택 저장과 같은 설정 쓰기가 하나가 있는 곳에서 실패합니다.904</h3>
905
906`gh`, `gcloud`, `terraform`과 같은 도구는 [Seatbelt](#os-level-enforcement)에서 TLS 검증에 실패할 수 있습니다. 이러한 도구를 샌드박스 외부에서 실행하려면 각 도구에 대해 `gh *`와 같은 패턴을 [`excludedCommands`](#run-commands-outside-the-sandbox-with-excludedcommands)에 추가합니다. 그러면 해당 도구는 사용자의 전체 액세스 권한과 저장된 자격 증명으로 실행됩니다. MITM 프록시 및 사용자 정의 CA와 함께 `httpProxyPort`를 사용하는 경우 대신 [`enableWeakerNetworkIsolation`](/docs/ko/settings-reference#sandbox-enableweakernetworkisolation)을 `true`로 설정합니다.
907
908<h3 id="open-osascript-or-browser-based-auth-flows-fail-with-error-600-on-macos">
909 `open`, `osascript`, 또는 브라우저 기반 인증 흐름이 macOS에서 오류 `-600`으로 실패
910</h3>
911
912샌드박스는 기본적으로 Apple Events를 차단합니다. 사용자, 관리형 또는 CLI 설정에서 [`allowAppleEvents`](/docs/ko/settings-reference#sandbox-allowappleevents)를 `true`로 설정하여 이를 허용합니다. Claude Code는 프로젝트 설정에서 이 키를 무시합니다.
913
914`allowAppleEvents`를 활성화하면 샌드박싱된 명령이 사용자 프롬프트 없이 다른 애플리케이션을 비샌드박싱된 상태로 시작할 수 있고, macOS 자동화 동의 프롬프트(TCC)의 적용을 받아 실행 중인 애플리케이션에 AppleScript 명령을 보낼 수 있으므로 코드 실행 격리가 제거됩니다. 또는 `open *`과 같은 패턴을 [`excludedCommands`](#run-commands-outside-the-sandbox-with-excludedcommands)에 추가합니다. 그러면 각 `open` 호출이 권한 흐름을 거치며, `open`은 Claude가 작성한 파일이나 앱을 포함하여 모든 파일 또는 앱을 실행할 수 있습니다.
915
916<h3 id="docker-commands-fail">
917 `docker` 명령 실패
918</h3>
762 919
763 `claude doctor`를 실행하여 남은 자리 표시자 파일을 나열합니다. [`Stale sandbox mask files left by a killed session`](/docs/ko/errors#stale-sandbox-mask-files-left-by-a-killed-session) 경고는 그중 최대 3개의 이름을 표시하고 나머지는 개수로 표시합니다. 해당 프로젝트에서 다른 Claude Code 세션이 실행되지 않는 동안 `rm`으로 각 파일을 삭제합니다. v2.1.257 이전에는 Claude Code가 동일한 자리 표시자를 남겨두면서도 이를 알리지 않았습니다.920`docker`는 샌드박스와 호환되지 않습니다. `docker compose *`와 같은 `excludedCommands` 패턴으로 필요한 `docker` 명령을 샌드박스 밖으로 꺼냅니다. [`excludedCommands`로 샌드박스 외부에서 명령 실행](#run-commands-outside-the-sandbox-with-excludedcommands)에서는 제외된 `docker` 명령이 도달할 수 있는 범위를 설명합니다. 범위가 좁은 패턴일수록 샌드박스 밖으로 꺼내는 명령이 적어집니다.
764* **`--dangerously-skip-permissions`이 root로 실패**: 이 플래그는 Linux 및 macOS에서 root로 또는 sudo를 통해 실행할 때 차단됩니다. root 액세스와 권한 프롬프트 없음이 결합되면 시스템의 모든 파일 또는 서비스를 수정할 수 있기 때문입니다. 확인은 인식된 샌드박스 내에서 자동으로 건너뜁니다. 컨테이너에서 자율적으로 실행하려면 [dev 컨테이너](/docs/ko/devcontainer) 구성을 사용합니다. 이는 Claude Code를 비 root 사용자로 실행합니다.921
922<h3 id="pbcopy-xclip-or-wl-copy-doesn’t-update-the-clipboard">
923 `pbcopy`, `xclip`, 또는 `wl-copy`가 클립보드를 업데이트하지 않음
924</h3>
925
926`pbcopy`, `xclip`, `wl-copy` 클립보드 유틸리티는 샌드박스 내에서 시스템 클립보드에 도달하지 못할 수 있으며, 이 경우 이들에게 파이프된 텍스트가 도착하지 않습니다.
927
928Claude의 출력을 클립보드에 넣으려면 Claude에게 응답에서 인쇄하도록 요청한 다음 [`/copy`](/docs/ko/commands)를 실행합니다. `/copy`는 샌드박싱된 명령이 아닌 Claude Code 프로세스에서 클립보드에 씁니다.
929
930Claude가 텍스트를 이러한 도구 중 하나로 파이프할 때, 도구를 [`excludedCommands`](/docs/ko/settings-reference#sandbox-excludedcommands)에 추가해도 그 자체로는 그 호출을 샌드박스 외부로 꺼내지 않습니다.
931
932<h3 id="a-git-command-fails-with-unable-to-unlink-old">
933 git 명령이 `unable to unlink old`로 실패
934</h3>
935
936`git merge`, `git checkout` 및 유사한 명령은 샌드박스가 쓰기를 거부하는 파일을 교체해야 할 때 `unable to unlink old`로 실패합니다. Linux 및 WSL2에서 오류는 `Read-only file system`으로 끝납니다. 해당 파일은 다음 위치 중 하나에 있을 수 있습니다.
937
938* `.claude/skills`와 같은 [보호된 경로](#protected-paths) 아래
939* `denyWrite` 항목 중 하나 아래
940* 샌드박스가 명령에 쓰기를 허용하는 디렉터리 외부
941
942실패 후 Claude는 [명령을 샌드박스 외부에서 다시 실행하도록 제안](#the-unsandboxed-retry-escape-hatch)할 수 있습니다. 해당 재시도를 승인하거나 다른 터미널에서 git 명령을 직접 실행합니다. `allowUnsandboxedCommands`를 `false`로 설정한 경우 Claude는 재시도를 제안할 수 없으므로 명령을 직접 실행합니다.
943
944<h3 id="bubblewrap-fails-to-start-inside-a-container">
945 Bubblewrap이 컨테이너 내에서 시작 실패
946</h3>
947
948권한 없는 컨테이너에서 [bubblewrap](#os-level-enforcement)은 새로운 `/proc` 파일시스템을 마운트할 수 없으므로 샌드박싱된 명령은 `bwrap` 오류(예: `Can't mount proc on /newroot/proc: Operation not permitted`)로 실패합니다. [`enableWeakerNestedSandbox`](/docs/ko/settings-reference#sandbox-enableweakernestedsandbox)를 `true`로 설정하여 샌드박스가 대신 컨테이너의 기존 `/proc`을 바인드 마운트하도록 합니다. 외부 컨테이너가 이미 필요한 격리 경계를 제공할 때만 이 설정을 사용합니다. 새로운 `/proc` 마운트가 숨길 프로세스 정보를 샌드박싱된 명령에 노출하기 때문입니다.
949
950<h3 id="0-byte-read-only-files-appear-at-claude-settings-paths-and-yes-and-don’t-ask-again-doesn’t-save">
951 0바이트 읽기 전용 파일이 `.claude` 설정 경로에 나타나고 "예, 다시 묻지 않기"가 저장되지 않음
952</h3>
953
954Linux 및 WSL2에서 샌드박스는 샌드박싱된 명령이 실행되는 동안 아직 존재하지 않는 파일에 대한 쓰기 거부를 그 위치에 0바이트 읽기 전용 자리 표시자를 만들어 유지합니다. 샌드박스는 그 후 자리 표시자를 제거합니다. 예를 들어 SIGKILL에 의해 세션이 정리 실행 전에 종료되면 자리 표시자가 남아 있습니다. 이후 세션은 매번 시작할 때마다 자리 표시자를 다시 읽기 전용으로 바인드하므로 권한 선택 저장과 같은 설정 쓰기가 자리 표시자가 남아 있는 경로에서 실패합니다.
955
956터미널에서 `claude doctor`를 실행하여 남은 자리 표시자 파일을 나열합니다. [`Stale sandbox mask files left by a killed session`](/docs/ko/errors#stale-sandbox-mask-files-left-by-a-killed-session) 경고는 그중 일부의 이름을 표시하고 나머지는 개수로 표시합니다. 해당 프로젝트에서 다른 Claude Code 세션이 실행되지 않는 동안 `rm`으로 각 파일을 삭제합니다. v2.1.257 이전에는 Claude Code가 동일한 자리 표시자를 남겨두면서도 이를 알리지 않았습니다.
957
958<h3 id="git-over-ssh-fails-with-the-sandbox-on">
959 샌드박스가 켜진 상태에서 SSH를 통한 `git`이 실패
960</h3>
961
962macOS에서는 SSH 원격 저장소에 대한 `git fetch`, `git pull`, `git push`가 호스트가 허용된 경우에도 샌드박스 내에서 실패합니다. Linux 및 WSL2에서는 호스트가 허용되면 작동합니다. Claude Code는 git의 SSH 연결을 [샌드박스 프록시](#network-isolation)를 통해 터널링하는데, macOS 터널은 해당 프록시에 인증할 수 없습니다.
963
964Linux 및 WSL2에서 연결이 여전히 실패하면 다음을 확인합니다.
965
966* **호스트가 포트 22에서 허용되는지**: `"git.example.com"`처럼 포트가 없는 `allowedDomains` 항목이 이를 포함합니다
967* **회사 프록시가 포트 22를 허용하는지**: 네트워크에 업스트림 프록시가 필요한 경우 터널도 해당 프록시를 거칩니다
968* **키를 파일로 읽을 수 있는지**: 샌드박스는 `ssh-agent` 소켓을 차단할 수 있으며, `~/.ssh`에 대한 `denyRead` 또는 `credentials` 항목은 키 파일을 숨깁니다
969
970macOS에서는 원격 저장소를 HTTPS로 전환합니다. 이 경우 개인 액세스 토큰과 같은 HTTPS 자격 증명이 필요합니다.
971
972```bash theme={null}
973git remote set-url origin https://git.example.com/example-org/example-repo.git
974```
975
976SSH 원격 저장소를 유지해야 하는 경우 [`excludedCommands`](#run-commands-outside-the-sandbox-with-excludedcommands)로 git의 네트워크 명령을 샌드박스 밖으로 꺼냅니다.
977
978```json theme={null}
979{
980 "sandbox": {
981 "excludedCommands": ["git fetch *", "git pull *", "git push *"]
982 }
983}
984```
985
986이 항목은 `git push origin main`과 일치합니다. `cd`를 추가하거나, `git -C`를 사용하거나, 명령 치환을 포함하는 호출은 샌드박스 내에 유지됩니다. 제외된 git 명령은 `allowedDomains`에 있는 호스트뿐만 아니라 모든 호스트에 도달할 수 있습니다.
987
988SSH를 통한 일반 `ssh`, `scp`, `rsync`는 [데이터베이스 클라이언트 항목](#a-database-client-or-other-non-http-tool-fails-to-reach-an-allowed-host)에서 설명하는 이유로 실패합니다.
989
990<h3 id="a-database-client-or-other-non-http-tool-fails-to-reach-an-allowed-host">
991 데이터베이스 클라이언트 또는 기타 비 HTTP 도구가 허용된 호스트에 도달하지 못함
992</h3>
993
994프록시 환경 변수를 무시하는 도구는 `allowedDomains`에 있는 호스트라도 샌드박스 내에서 연결할 수 없습니다. 샌드박싱된 명령에는 [네트워크로 가는 직접 경로가 없으므로](#network-isolation), 자체 연결을 여는 도구는 실패합니다. 대부분의 데이터베이스 드라이버, 일반 `ssh`, UDP를 사용하는 도구가 이렇게 동작합니다.
995
996실패는 네트워크 또는 이름 확인 오류처럼 보입니다.
997
998* **macOS**: `Operation not permitted` 또는 `Could not resolve host`와 같은 이름 확인 오류
999* **Linux 및 WSL2**: `Network is unreachable` 또는 `Temporary failure in name resolution`과 같은 이름 확인 오류
1000
1001프록시를 사용하는 도구는 호스트가 허용되지 않았을 때 다르게 실패합니다. 네트워크 프롬프트가 표시되거나, 도구가 프록시로부터 `403` 응답을 받습니다.
1002
1003도구가 연결할 수 있도록 하려면 해당 도구가 필요한 명령을 [`excludedCommands`](#run-commands-outside-the-sandbox-with-excludedcommands)로 샌드박스 외부에서 실행합니다. 다음 예시는 스크립트 하나를 제외하고 [ask 규칙](/docs/ko/permissions)을 추가하여 각 실행을 승인하도록 합니다.
1004
1005```json theme={null}
1006{
1007 "sandbox": {
1008 "excludedCommands": ["python scripts/load_orders.py *"]
1009 },
1010 "permissions": {
1011 "ask": ["Bash(python scripts/load_orders.py *)"]
1012 }
1013}
1014```
1015
1016스크립트는 사용자의 전체 액세스 권한으로 실행되며, Claude는 작업 디렉터리 내의 스크립트를 편집할 수 있으므로 프롬프트가 표시되면 스크립트를 검토합니다.
1017
1018<h3 id="a-command-fails-to-reach-a-server-on-localhost">
1019 명령이 localhost의 서버에 도달하지 못함
1020</h3>
1021
1022기본적으로 샌드박싱된 명령은 개발 서버나 컨테이너의 데이터베이스처럼 샌드박스 외부에서 사용자의 머신에서 실행 중인 서버에 직접 연결할 수 없습니다. 변경할 수 있는 사항은 플랫폼에 따라 다릅니다.
1023
1024* **macOS**: [`network.allowLocalBinding`](/docs/ko/settings-reference#sandbox-network-allowlocalbinding)을 `true`로 설정합니다. 그러면 샌드박싱된 명령이 네트워크 포트에서 수신 대기하고 localhost의 모든 포트에 연결할 수 있으며, 여기에는 그곳에서 수신 대기하는 다른 모든 서비스가 포함됩니다. 디버거처럼 인증이 필요 없는 localhost 서비스는 샌드박스 외부에서 명령을 대신하여 동작할 수 있고, 비 루프백 주소에서 수신 대기하는 명령은 다른 머신의 연결을 수락합니다
1025* **Linux 및 WSL2**: 샌드박싱된 명령의 `localhost`는 해당 명령 전용입니다. 명령은 포트에서 수신 대기하고 자신이 시작한 서버에 도달할 수 있습니다. `localhost` 또는 `127.0.0.1`에 대한 직접 연결은 호스트의 서버에 도달하지 않으며, `allowLocalBinding`은 효과가 없습니다. 호스트의 서버가 필요한 명령은 [`excludedCommands`](#run-commands-outside-the-sandbox-with-excludedcommands)로 샌드박스 외부에서 실행하며, 이 경우 파일시스템이나 네트워크 제한이 없습니다. 샌드박스 프록시를 거치는 연결에 대해서는 [로컬 주소로 확인되는 호스트 이름](#hostnames-that-resolve-to-local-addresses)을 참조하세요
1026
1027다음 예시는 macOS에서 이 설정을 켭니다.
1028
1029```json theme={null}
1030{
1031 "sandbox": {
1032 "network": {
1033 "allowLocalBinding": true
1034 }
1035 }
1036}
1037```
1038
1039`localhost`에 대한 `allowedDomains` 항목은 프록시를 거치는 연결에 적용되므로 직접 연결은 변경하지 않습니다. Claude Code는 샌드박싱된 명령이 프록시를 거치지 않고 `localhost`에 직접 연결하도록 `NO_PROXY`를 설정합니다. 또한 이 항목은 프록시를 사용하는 명령에 머신의 localhost 모든 포트를 노출합니다. `127.0.0.1`을 가리키는 개발용 호스트 이름에 대해서는 [허용된 호스트 이름이 `resolved to a loopback address`로 거부됨](#an-allowed-hostname-is-refused-with-resolved-to-a-loopback-address)을 참조하세요.
1040
1041<h3 id="an-allowed-hostname-is-refused-with-resolved-to-a-loopback-address">
1042 허용된 호스트 이름이 `resolved to a loopback address`로 거부됨
1043</h3>
1044
1045샌드박스 프록시는 [로컬 주소로 확인되는](#hostnames-that-resolve-to-local-addresses) 허용된 호스트 이름을 거부하며, 이는 `127.0.0.1`을 가리키는 `myapp.test`와 같은 개발용 이름에 영향을 줍니다. 명령은 `Connection to myapp.test blocked: resolved to a loopback address`처럼 본문에 주소 종류가 명시된 `403` 응답을 받습니다.
1046
1047`allowedDomains`에 호스트 이름과 함께 해당 이름이 확인되는 IP 주소를 추가하고, 각각에 서버가 수신 대기하는 포트를 지정합니다.
1048
1049```json theme={null}
1050{
1051 "sandbox": {
1052 "network": {
1053 "allowedDomains": ["myapp.test:3000", "127.0.0.1:3000"]
1054 }
1055 }
1056}
1057```
1058
1059포트가 없는 IP 주소 항목은 샌드박싱된 명령이 해당 주소에서 수신 대기하는 모든 서비스에 도달할 수 있게 합니다.
1060
1061v2.1.284 이전에는 프록시가 허용된 호스트 이름이 확인되는 주소가 무엇이든 연결했습니다.
1062
1063<h3 id="/sandbox-fails-with-sandbox-settings-are-overridden-by-a-higher-priority-configuration">
1064 `/sandbox`가 `Sandbox settings are overridden by a higher-priority configuration`으로 실패
1065</h3>
1066
1067더 높은 [설정 수준](/docs/ko/settings#settings-precedence)에서 `sandbox.enabled`, `sandbox.autoAllowBashIfSandboxed` 또는 `sandbox.allowUnsandboxedCommands`를 설정하면 `/sandbox`는 패널을 여는 대신 `Error: Sandbox settings are overridden by a higher-priority configuration and cannot be changed locally.`를 출력합니다. 패널은 선택 사항을 `.claude/settings.local.json`에 저장하는데, 그곳에 저장된 값은 해당 수준을 재정의할 수 없습니다.
1068
1069관리형 설정과 `--settings`는 로컬 설정보다 우선순위가 높습니다. 이번 세션에서 이 중 무엇이 로드되었는지 확인하려면 `/status`를 실행하고 `Setting sources` 줄을 확인합니다.
1070
1071* **`Command line arguments`**: [`--settings`](/docs/ko/settings#change-a-setting-for-one-session)로 Claude Code를 시작한 경우 전달한 파일 또는 JSON이 해당 키 중 하나를 설정하는지 확인합니다. 설정한다면 그곳에서 값을 변경하거나, 해당 키 없이 Claude Code를 다시 시작합니다.
1072* **`Enterprise managed settings`**: 조직의 관리형 설정이 로드되어 있습니다. 이 설정이 해당 키 중 하나를 설정한다면 `/sandbox`나 사용자가 제어하는 어떤 설정 파일에서도 해당 키를 변경할 수 없으므로 관리자에게 요청합니다.
765 1073
766<h2 id="limitations">1074<h2 id="limitations">
767 제한 사항1075 제한 사항
773 보안 제한 사항1081 보안 제한 사항
774</h3>1082</h3>
775 1083
776* **네트워크 필터링**: 샌드박스는 프로세스가 연결할 수 있는 도메인을 제한합니다. 기본 제공 프록시는 아웃바운드 트래픽을 종료하거나 TLS를 검사하지 않으므로 암호화된 연결의 내용은 검사되지 않습니다. 실험적인 [`network.tlsTerminate`](/docs/ko/settings-reference#sandbox-network-tlsterminate) 설정은 [`mask` 자격 증명 대체](#mask-credentials)를 위해 프록시에서 TLS를 종료하지만 콘텐츠 필터링을 추가하지 않습니다. 정책에서 신뢰할 수 있는 도메인만 허용하도록 보장하는 것은 사용자의 책임입니다.1084* **네트워크 필터링**: 샌드박스는 프로세스가 연결할 수 있는 도메인을 제한합니다. 기본적으로 기본 제공 프록시는 아웃바운드 트래픽의 TLS를 종료하거나 검사하지 않으므로 암호화된 연결의 내용은 검사되지 않습니다. 실험적인 [`network.tlsTerminate`](/docs/ko/settings-reference#sandbox-network-tlsterminate) 설정은 [`mask` 자격 증명 대체](#mask-credentials)를 위해 프록시에서 TLS를 종료하지만 콘텐츠 필터링을 추가하지 않습니다. 정책에서 신뢰할 수 있는 도메인만 허용하도록 보장하는 것은 사용자의 책임입니다.
777 1085
778<Warning>1086<Warning>
779 `github.com`과 같은 광범위한 도메인을 허용하면 데이터 유출 경로가 생성될 수 있습니다. 프록시가 TLS를 검사하지 않고 클라이언트 제공 호스트 이름에서 허용 결정을 내리기 때문에 샌드박스 내에서 실행되는 코드는 잠재적으로 [도메인 프론팅](https://en.wikipedia.org/wiki/Domain_fronting) 또는 유사한 기술을 사용하여 허용 목록 외부의 호스트에 도달할 수 있습니다. 위협 모델이 더 강력한 보장을 요구하면 TLS를 종료하고 트래픽을 검사하는 [사용자 정의 프록시](#custom-proxy-configuration)를 구성하고 그 CA 인증서를 샌드박스 내에 설치합니다. 더 강력한 TLS 인식 네트워크 격리는 활발한 개발 영역입니다.1087 `github.com`과 같은 광범위한 도메인을 허용하면 데이터 유출 경로가 생성될 수 있습니다. 프록시가 TLS를 검사하지 않고 클라이언트 제공 호스트 이름에서 허용 결정을 내리기 때문에 샌드박스 내에서 실행되는 코드는 잠재적으로 [도메인 프론팅](https://en.wikipedia.org/wiki/Domain_fronting) 또는 유사한 기술을 사용하여 허용 목록 외부의 호스트에 도달할 수 있습니다. 위협 모델이 더 강력한 보장을 요구하면 TLS를 종료하고 트래픽을 검사하는 [사용자 정의 프록시](#custom-proxy-configuration)를 구성하고 그 CA 인증서를 샌드박스 내에 설치합니다. 더 강력한 TLS 인식 네트워크 격리는 활발한 개발 영역입니다.
781 1089
782* **Unix 소켓을 통한 권한 상승**: `allowUnixSockets` 구성은 실수로 샌드박스 우회로 이어질 수 있는 시스템 서비스에 대한 액세스를 부여할 수 있습니다. 예를 들어 `/var/run/docker.sock`에 대한 액세스를 허용하면 Docker 소켓을 통해 호스트 시스템에 대한 액세스를 효과적으로 부여합니다. 샌드박스를 통해 허용하는 모든 Unix 소켓을 신중하게 고려합니다.1090* **Unix 소켓을 통한 권한 상승**: `allowUnixSockets` 구성은 실수로 샌드박스 우회로 이어질 수 있는 시스템 서비스에 대한 액세스를 부여할 수 있습니다. 예를 들어 `/var/run/docker.sock`에 대한 액세스를 허용하면 Docker 소켓을 통해 호스트 시스템에 대한 액세스를 효과적으로 부여합니다. 샌드박스를 통해 허용하는 모든 Unix 소켓을 신중하게 고려합니다.
783* **파일시스템 권한 상승**: 과도하게 광범위한 파일시스템 쓰기 권한은 권한 상승 공격을 가능하게 할 수 있습니다. `$PATH`의 실행 파일을 포함하는 디렉토리, 시스템 구성 디렉토리 또는 `.bashrc` 또는 `.zshrc`와 같은 사용자 셸 구성 파일에 대한 쓰기를 허용하면 다른 사용자 또는 시스템 프로세스가 이러한 파일에 액세스할 때 다른 보안 컨텍스트에서 코드 실행으로 이어질 수 있습니다.1091* **파일시스템 권한 상승**: 과도하게 광범위한 파일시스템 쓰기 권한은 권한 상승 공격을 가능하게 할 수 있습니다. `$PATH`의 실행 파일을 포함하는 디렉토리, 시스템 구성 디렉토리 또는 `.bashrc` 또는 `.zshrc`와 같은 사용자 셸 구성 파일에 대한 쓰기를 허용하면 다른 사용자 또는 시스템 프로세스가 이러한 파일에 액세스할 때 다른 보안 컨텍스트에서 코드 실행으로 이어질 수 있습니다.
784* **Linux 샌드박스 강도**: Linux 구현은 강력한 파일시스템 및 네트워크 격리를 제공하지만 권한 있는 네임스페이스 없이 Docker 환경 내에서 작동할 수 있도록 하는 `enableWeakerNestedSandbox` 모드를 포함합니다. 또는 권한 없는 사용자 네임스페이스가 sysctl에 의해 비활성화된 Linux 호스트에서. 이 옵션은 보안을 상당히 약화시키며 추가 격리가 다른 방식으로 적용되는 경우에만 사용해야 합니다.1092* **Linux 샌드박스 강도**: Linux 구현은 강력한 파일시스템 및 네트워크 격리를 제공하지만 권한 있는 네임스페이스 없이 Docker 환경 내에서 작동할 수 있도록 하는 `enableWeakerNestedSandbox` 모드를 포함합니다. 이 옵션은 보안을 상당히 약화시키며 추가 격리가 다른 방식으로 적용되는 경우에만 사용해야 합니다.
785* **macOS의 Apple Events**: macOS 샌드박스는 기본적으로 Apple Events를 차단합니다. `allowAppleEvents` 설정은 이 제한을 해제하여 `open` 및 `osascript`와 같은 도구가 작동하지만 코드 실행 격리를 제거합니다. 샌드박싱된 명령은 사용자 프롬프트 없이 다른 애플리케이션을 샌드박싱되지 않은 상태로 시작할 수 있으며 실행 중인 애플리케이션에 AppleScript 명령을 보낼 수 있습니다. 이는 앱별 macOS 자동화 동의 프롬프트(TCC)의 적용을 받습니다. 이는 사용자, 관리 또는 CLI 설정에서만 적용됩니다. 프로젝트 설정은 이를 활성화할 수 없습니다.1093* **macOS의 Apple Events**: macOS 샌드박스는 기본적으로 Apple Events를 차단합니다. `allowAppleEvents` 설정은 이 제한을 해제하여 `open` 및 `osascript`와 같은 도구가 작동하지만 코드 실행 격리를 제거합니다. 샌드박싱된 명령은 사용자 프롬프트 없이 다른 애플리케이션을 샌드박싱되지 않은 상태로 시작할 수 있으며 실행 중인 애플리케이션에 AppleScript 명령을 보낼 수 있습니다. 이는 앱별 macOS 자동화 동의 프롬프트(TCC)의 적용을 받습니다. 이는 사용자, 관리 또는 CLI 설정에서만 적용됩니다. 프로젝트 설정은 이를 활성화할 수 없습니다.
786 1094
787<h3 id="platform-and-tool-compatibility">
788 플랫폼 및 도구 호환성
789</h3>
790
791* **플랫폼 지원**: macOS, Linux 및 WSL2를 지원합니다. WSL1 및 기본 Windows는 지원되지 않습니다.
792* **성능 오버헤드**: 최소이지만 일부 파일시스템 작업이 약간 더 느릴 수 있습니다.
793* **도구 호환성**: 특정 시스템 액세스 패턴이 필요한 일부 도구는 구성 조정이 필요할 수 있으며 샌드박스 외부에서 실행해야 할 수도 있습니다.
794
795<h3 id="scope">1095<h3 id="scope">
796 범위1096 범위
797</h3>1097</h3>
798 1098
799샌드박스는 Bash 하위 프로세스를 격리합니다. 다른 도구는 다른 경계에서 작동합니다:1099샌드박스는 셸 명령과 그 하위 프로세스를 격리합니다. [샌드박스 외부에서 실행되는 항목](#what-runs-outside-the-sandbox)에는 샌드박스가 다루지 않는 도구와 헬퍼 프로세스가 나열되어 있습니다. 컴퓨터 사용과 서브에이전트는 다음과 같이 샌드박스와 관련됩니다:
800 1100
801* **기본 제공 파일 도구**: Read, Edit 및 Write는 권한 시스템을 직접 사용하며 샌드박스를 통해 실행되지 않습니다. [권한](/docs/ko/permissions)을 참조합니다.
802* **컴퓨터 사용**: Claude가 앱을 열고 화면을 제어할 때 격리된 환경이 아닌 실제 데스크톱에서 실행됩니다. 앱별 권한 프롬프트가 각 애플리케이션을 제어합니다. [CLI의 컴퓨터 사용](/docs/ko/computer-use) 또는 [Desktop의 컴퓨터 사용](/docs/ko/desktop#let-claude-use-your-computer)을 참조합니다.1101* **컴퓨터 사용**: Claude가 앱을 열고 화면을 제어할 때 격리된 환경이 아닌 실제 데스크톱에서 실행됩니다. 앱별 권한 프롬프트가 각 애플리케이션을 제어합니다. [CLI의 컴퓨터 사용](/docs/ko/computer-use) 또는 [Desktop의 컴퓨터 사용](/docs/ko/desktop#let-claude-use-your-computer)을 참조합니다.
803* **환경 변수**: 샌드박싱된 Bash 명령은 기본적으로 부모 프로세스 환경을 상속합니다. 여기에는 설정된 모든 자격 증명이 포함됩니다. [`sandbox.credentials`](#protect-credentials)를 사용하여 샌드박싱된 명령에 대한 특정 변수를 설정 해제하거나 마스크하거나 [`CLAUDE_CODE_SUBPROCESS_ENV_SCRUB`](/docs/ko/env-vars)를 설정하여 모든 하위 프로세스에서 자격 증명을 제거합니다.1102* **서브에이전트**: [서브에이전트](/docs/ko/sub-agents)는 부모 세션과 동일한 프로세스에서 실행되며 동일한 샌드박스 구성을 사용합니다. 부모 세션에서 샌드박싱이 활성화되면 서브에이전트 내의 Bash 명령이 샌드박싱됩니다.
804* **하위 에이전트**: [하위 에이전트](/docs/ko/sub-agents)는 부모 세션과 동일한 프로세스에서 실행되며 동일한 샌드박스 구성을 사용합니다. 부모 세션에서 샌드박싱이 활성화되면 하위 에이전트 내의 Bash 명령이 샌드박싱됩니다.1103* **모드**: [모드](/docs/ko/plugins/mods/overview)는 Claude Code 내에서 자체 코드를 실행하는 플러그인이며, 모드가 시작하는 프로세스는 샌드박스 외부에서 실행됩니다. [모드가 접근할 수 있는 범위](/docs/ko/plugins/mods/overview#what-a-mod-can-reach)를 참조합니다.
805 1104
806<Warning>1105<Warning>
807 효과적인 샌드박싱은 파일시스템 및 네트워크 격리 모두를 필요로 합니다. 네트워크 격리가 없으면 손상된 에이전트가 SSH 키와 같은 민감한 파일을 유출할 수 있습니다. 파일시스템 격리가 없으면 권한 있는 정책이나 [파일시스템 레이어 비활성화](#disable-filesystem-isolation)로 인해 손상된 에이전트가 시스템 리소스를 백도어하여 네트워크 액세스를 얻을 수 있습니다. 기본값을 확대할 때 `allowWrite` 경로, 광범위한 `allowedDomains` 항목 또는 `excludedCommands` 예외가 다른 쪽의 제한을 취소하지 않는지 확인합니다.1106 효과적인 샌드박싱은 파일시스템 및 네트워크 격리 모두를 필요로 합니다. 네트워크 격리가 없으면 손상된 에이전트가 SSH 키와 같은 민감한 파일을 유출할 수 있습니다. 파일시스템 격리가 없으면 권한 있는 정책이나 [파일시스템 레이어 비활성화](#disable-filesystem-isolation)로 인해 손상된 에이전트가 시스템 리소스를 백도어하여 네트워크 액세스를 얻을 수 있습니다. 기본값을 확대할 때 `allowWrite` 경로, 광범위한 `allowedDomains` 항목 또는 `excludedCommands` 예외가 다른 쪽의 제한을 취소하지 않는지 확인합니다.