Claude Code

Claude Code 권한: allow, ask, deny 규칙, 규칙 문법과 허용 도구

Claude Code 권한은 어떻게 작동하며, 특정 도구를 허용하거나 차단하려면 어떻게 해야 합니까?

Claude Code는 모든 도구 호출을 설정 파일의 권한 규칙과 대조합니다. 규칙은 permissions.allow, permissions.ask, permissions.deny에 넣고 Tool 또는 Tool(specifier) 형식을 사용하며, deny, ask, allow 순서로 평가됩니다. /permissions로 모든 규칙과 그 규칙이 정의된 파일을 확인하거나, 한 세션에만 적용하려면 --allowedTools와 --disallowedTools를 전달합니다.

이 페이지는 영어 가이드를 번역한 것입니다. 명령어, 설정 키, 코드는 원문 그대로이며 내용이 다를 경우 영어판을 기준으로 합니다. 영어 원문 보기 → · 다른 언어: 简体中文 · 日本語 · Español · Português (Brasil)

설정 변경 소식을 가장 먼저 받아 보세요

이 도구들의 설정, 플래그, 권한 규칙이 바뀌면 주 1회 이메일(영어)로 알려 드립니다. 모든 내용은 공식 문서로 확인합니다.

Allow, ask, deny

  • Allow 규칙은 Claude Code가 일치하는 도구를 묻지 않고 사용하게 합니다.
  • Ask 규칙은 일치하는 도구를 사용할 때마다 확인을 요청합니다.
  • Deny 규칙은 일치하는 도구를 차단합니다.
  • 순서는 deny, ask, allow입니다. 처음 일치한 규칙이 적용되며 구체성은 순서를 바꾸지 않습니다. 따라서 Bash(aws *) 같은 넓은 deny가 Bash(aws s3 ls) 같은 좁은 allow보다 우선합니다.
  • Bash처럼 도구 이름만 있는 deny 규칙은 해당 도구를 Claude의 컨텍스트에서 제거합니다. Bash(rm *) 같은 범위 지정 deny는 도구를 유지하고 일치하는 호출만 차단합니다.

규칙은 모델이 아니라 Claude Code가 강제합니다. CLAUDE.md의 지침은 Claude가 시도하는 작업에 영향을 주지만, 허용되는 작업 자체를 바꾸지는 않습니다.

도구별 규칙 문법

  • 도구 전체: 괄호 없이 Bash, Read, WebFetch. Bash(*)는 Bash와 같습니다.
  • Bash: Bash(npm run build)는 정확히 그 명령과 일치합니다. Bash(npm run *)는 모든 npm 스크립트와 일치합니다. *는 하위 명령 뒤에 둡니다. Bash(git log *)는 git log만 허용하고, Bash(git *)는 모든 git 명령을 허용합니다.
  • Bash(ls *)는 ls 뒤에 공백이 필요하므로 lsof와 일치하지 않습니다. Bash(ls:*)는 끝 와일드카드를 쓰는 동일한 방식입니다.
  • Read와 Edit는 gitignore 패턴을 사용합니다. Read(./.env)는 현재 디렉터리의 .env 파일을, Read(./secrets/**)는 폴더를 차단합니다. 어떤 도구도 변경하면 안 되는 경로에는 Write 규칙이 아니라 Edit 규칙을 사용합니다.
  • 경로: //path는 파일 시스템 루트 기준 절대 경로, ~/path는 홈 폴더 기준, /path는 설정 파일이 속한 프로젝트 기준, path 또는 ./path는 현재 디렉터리 기준입니다.
  • WebFetch: WebFetch(domain:example.com)는 example.com만 일치합니다. 하위 도메인에는 WebFetch(domain:*.example.com)를 추가합니다.
  • MCP: mcp__github는 github 서버의 모든 도구, mcp__github__get_*는 get_ 도구들, mcp__github__create_issue는 도구 하나와 일치합니다.
  • Subagent: Agent(Explore) 또는 Agent(my-custom-agent). deny에 넣으면 Claude가 해당 subagent를 사용하지 못합니다.

설정 예시

.claude/settings.json

{
  "permissions": {
    "allow": [
      "Bash(npm run *)",
      "Bash(git commit *)",
      "WebFetch(domain:docs.example.com)",
      "mcp__github__get_*"
    ],
    "ask": ["Bash(git push *)"],
    "deny": [
      "Read(./.env)",
      "Read(./secrets/**)",
      "Bash(rm *)"
    ]
  }
}

프로젝트 .claude/settings.json의 allow 규칙과 additionalDirectories는 해당 폴더의 작업 공간 신뢰 대화 상자를 수락한 후에만 적용됩니다. Deny와 ask 규칙은 즉시 적용됩니다.

명령줄에서 허용할 도구

  • --allowedTools(또는 --allowed-tools): 같은 규칙 문법을 사용해 확인 없이 실행할 도구입니다.
  • --disallowedTools(또는 --disallowed-tools): 이 세션의 deny 규칙입니다. "mcp__*"는 모든 MCP 도구를 제거합니다.
  • --tools: 존재할 내장 도구 자체를 제한합니다. 예: "Bash,Edit,Read".
  • --add-dir: Claude가 읽고 편집할 수 있는 작업 디렉터리를 추가합니다. 유지하려면 permissions.additionalDirectories에 저장합니다.

터미널

claude -p "summarize recent changes" \
  --allowedTools "Bash(git log *)" "Bash(git diff *)" "Read" \
  --disallowedTools "Edit"

기본적으로 확인을 요청하는 항목과 "don't ask again"이 저장하는 내용

  • 파일 읽기, Grep 같은 읽기 전용 도구: 작업 디렉터리와 추가 디렉터리 안에서는 확인하지 않습니다.
  • Bash 명령: 내장된 읽기 전용 명령 집합을 제외하고 확인을 요청합니다. "Yes, and don't ask again"은 해당 저장소와 명령에 대해 영구 저장됩니다.
  • 파일 편집과 쓰기: 확인을 요청합니다. "Don't ask again"은 세션이 끝날 때까지만 유지되며 파일에 저장되지 않습니다.
  • WebFetch: 내장된 사전 승인 문서 도메인을 제외하고 확인을 요청합니다. 승인은 저장소와 도메인별로 저장됩니다.
  • WebSearch: 확인을 요청합니다. 승인은 저장소별로 저장됩니다.

저장된 승인은 git 저장소 루트의 .claude/settings.local.json에 규칙으로 기록되므로(worktree는 메인 체크아웃으로 해석) 하위 디렉터리와 worktree에도 적용됩니다. git status && npm test 같은 복합 명령을 승인하면 승인이 필요했던 하위 명령마다 별도 규칙이 최대 5개까지 저장됩니다. Claude가 작업하는 중에도 /permissions를 열 수 있으며, 추가하거나 제거한 규칙은 Claude의 다음 도구 호출부터 적용됩니다.

확인 없이 실행되는 Bash 명령과 Claude Code가 꿰뚫어 보는 래퍼

  • 읽기 전용 명령은 모든 모드에서 확인 없이 실행됩니다. 내장 집합에는 ls, cat, echo, pwd, head, tail, grep, find, wc, which, diff, stat, du, cd와 git의 읽기 전용 형태가 포함됩니다. 이 집합은 설정할 수 없습니다. 이 중 하나에 확인을 요청하게 하려면 ask 또는 deny 규칙을 추가합니다.
  • 일부 읽기 전용 명령은 Manual 모드에서 여전히 확인을 요청합니다. 예를 들어 따옴표 없는 glob을 쓴 find, sort, sed, git이나, 다른 디렉터리로의 cd와 git을 결합한 경우입니다.
  • 매칭 전에 Claude Code는 timeout, time, nice, nohup, stdbuf, command, builtin, zsh noglob을 제거하므로 Bash(npm test *)는 timeout 30 npm test와도 일치합니다. 플래그 없는 xargs와 안전한 것으로 알려진 환경 변수의 앞쪽 할당도 제거합니다.
  • npx, docker exec, direnv exec, devbox run, mise exec 같은 러너는 제거되지 않습니다. Bash(devbox run *)는 run 뒤의 모든 것과 일치하므로 Bash(devbox run npm test)처럼 내부 명령마다 정확한 규칙을 하나씩 작성합니다.
  • 접두사 규칙은 watch, setsid, ionice, flock 같은 exec 래퍼나 -exec, -delete, -fprint를 쓴 find를 자동 승인할 수 없습니다. 전체 명령에 대한 정확한 규칙이나 PreToolUse hook을 사용합니다.

Bash deny 규칙이 막지 못하는 것

Bash 규칙은 Claude가 작성한 명령 텍스트와 매칭됩니다. Deny와 ask 규칙은 서브셸, 명령 치환, for 루프 안을 포함해 어떤 하위 명령이든 일치하면 적용됩니다. 같은 프로그램을 다른 방식으로 호출하는 것은 잡지 못합니다.

  • Bash(curl *)는 curl https://example.com은 막지만 /usr/bin/curl https://example.com이나 sh -c 'curl https://example.com'은 막지 못합니다.
  • Bash(rm *)는 rm -rf build/는 막지만 /bin/rm -rf build/나 bash -c 'rm -rf build/'는 막지 못합니다.
  • Bash(git push *)는 git push origin main은 막지만 git -C . push origin main은 막지 못합니다.
  • Bash(curl http://github.com/ *)처럼 인수를 제한하려는 패턴은 URL 앞의 플래그, https, 리디렉션, 변수를 놓칩니다.
  • 출력 리디렉션(>, >>, 2>)과 tee 대상은 Edit 규칙과 작업 디렉터리를 기준으로 검사됩니다. 따라서 Bash(git commit *)는 명령을 허용하지만 출력이 기록되는 위치까지 허용하지는 않습니다.

명령 텍스트와 관계없이 유지되는 제한이 필요하면 sandbox 네트워크 및 파일 시스템 규칙이나 전체 명령을 검사하는 PreToolUse hook을 사용합니다. 웹 접근을 제한하려면 curl과 wget을 deny하고 신뢰하는 사이트에 WebFetch(domain:...)를 allow합니다. Bash가 허용된 상태에서는 WebFetch 규칙만으로 네트워크 접근을 막지 못합니다.

어떤 설정이 우선하는가

  • 어느 수준의 deny도 다른 수준에서 allow할 수 없습니다. 사용자 설정이 허용하고 프로젝트 설정이 거부하면 거부되며, 반대의 경우도 마찬가지입니다.
  • 관리형 설정이 가장 우선합니다. --allowedTools도 관리형 deny를 재정의할 수 없지만, --disallowedTools는 제한을 더 추가할 수 있습니다.
  • allowManagedPermissionRulesOnly는 관리형 설정을 권한 규칙의 유일한 출처로 만듭니다.
  • 해당 모드를 차단하려면 permissions.disableBypassPermissionsMode 또는 permissions.disableAutoMode를 "disable"로 설정합니다. 관리형 설정에서 가장 유용합니다.

권한 모드

규칙은 세션의 권한 모드 위에 적용됩니다. 모드는 default(Manual), acceptEdits, plan, auto, dontAsk, bypassPermissions입니다. claude --permission-mode <mode> 또는 설정의 permissions.defaultMode로 지정합니다. dontAsk는 allow 규칙으로 이미 승인된 도구를 제외하고 확인이 필요한 모든 것을 거부합니다. 확인 없이 실행하려면 Claude Code에서 모든 명령을 허용하는 가이드를 참고합니다.

출처

이 가이드에서 확인한 공식 문서(영어)입니다. 영어판 확인일: 2026-10-18

다른 한국어 가이드