Claude Code를 사용하다 보면 명령어를 실행할 때마다 표시되는 「Do you want to proceed?」 확인 프롬프트가 나타납니다.
편리한 안전 장치이지만, 매번 멈추게 되면 작업 템포가 깨집니다. 권한 (Permission) 설정을 이해하여, 신뢰할 수 있는 작업은 확인 없이 실행할 수 있도록 만들어 봅시다.
Claude Code는 파일 편집, 셸 명령어 (Shell Command) 실행, 외부 통신 등 영향 범위가 큰 작업을 수행할 수 있습니다. 기본적으로는 미지의 작업에 대해 확인 프롬프트를 띄움으로써 의도하지 않은 변경을 방지하도록 설계되어 있습니다.
권한은 JSON 파일로 관리합니다.
| 파일 | 스코프 (Scope) | 용도 |
|---|
~/.claude/settings.json | 글로벌 (Global) | 모든 프로젝트 공통 설정 |
.claude/settings.json | 프로젝트 (Project) | 팀 공유 설정 (git 관리) |
.claude/settings.local.json | 프로젝트 로컬 (Project Local) | 개인 재정의 설정 (gitignore 권장) |
설정은 user → project → local 순으로 읽히며, 나중에 읽힌 것이 우선됩니다.
permissions.allow 배열에 규칙을 추가합니다.
{
"permissions": {
"allow": [
...
]
}
}
*는 와일드카드 (Wildcard)로, 후속 인자 모두와 매치됩니다.
| 규칙 | 매치되는 예시 |
|---|
"Bash(git *)" | git status, git log, git commit -m "..." |
"Bash(gh issue list *)" | gh issue list --repo vitejs/vite --state open |
"Bash(python3 *)" | python3 script.py, python3 -c "..." |
"Bash(npm run test)" | npm run test (완전 일치) |
"Edit(/path/to/dir/)" // 지정 디렉터리 이하의 파일 편집을 허용
"Write(/path/to/dir/)" // 지정 디렉터리 이하로의 파일 생성을 허용
"Read" // 모든 읽기를 허용 (인자 없음)
OSS 기여를 위해 GitHub CLI와 학습 노트 편집을 허용하는 예시:
{
"permissions": {
"allow": [
...
]
}
}
deny를 사용하면 allow보다 우선하여 작업을 거부할 수 있습니다.
{
"permissions": {
"allow": ["Bash(git *)"],
"deny": ["Bash(git push --force)"]
}
}
이렇게 하면 git 명령어 전반은 허용하면서, git push --force만은 반드시 확인 프롬프트를 띄울 수 있습니다.
"Bash(*)"와 같이 모든 명령어를 허용하는 것은 위험합니다. rm -rf나 의도하지 않은 부작용이 있는 명령어도 그대로 통과되어 버립니다.
좋은 설계의 지침:
- 실제로 사용하는 명령어·디렉터리만
allow에 추가한다
- 넓은 규칙을 사용할 경우
deny로 위험한 작업을 차단한다
- 불분명한 명령어는 기본 확인 프롬프트에 맡긴다
Claude Code에는 과거의 트랜스크립트 (Transcript)를 분석하여 "자주 사용하는데 매번 확인하고 있는 작업"을 자동으로 탐지하고, allow 리스트에 추가할 것을 제안해 주는 명령어가 있습니다.
/fewer-permission-prompts
처음부터 설정을 작성하는 것보다, 먼저 이 명령어로 후보를 뽑아내는 것이 효율적입니다.
| 설정 | 용도 |
|---|
Bash(명령어 *) | 셸 명령어를 허용 |
Edit(/path/) | 파일 편집을 허용 |
Write(/path/) | 파일 생성을 허용 |
deny | 특정 작업을 명시적으로 차단 |
권한 설정을 적절히 정비하면, 확인 프롬프트를 줄이면서도 안전성을 유지할 수 있습니다. 처음에는 좁은 스코프로 시작하여, 사용하면서 조금씩 넓혀가는 것을 추천합니다.