Claude Code가 파일을 수정하거나 명령을 실행할 때 매번 물어보면 번거롭습니다. 반대로 아무것도 묻지 않고 실행하면 위험할 수 있습니다. Permission System이 이 균형을 맞춥니다.
Claude Code가 도구를 실행하기 전에 사용자에게 확인을 요청합니다.
Claude: Bash("rm -rf ./dist") 를 실행하려 합니다.
허용하시겠습니까? [y/N]
처음 접하는 명령이나 위험할 수 있는 작업에 기본 적용됩니다.
특정 도구나 명령을 자동으로 허용합니다. 매번 확인 없이 실행됩니다.
특정 도구나 명령을 항상 거부합니다. Claude가 시도해도 실행되지 않습니다.
settings.json에 권한을 설정합니다.
{
"permissions": {
"allow": [
"Bash(npm run *)",
"Bash(git status)",
"Bash(git log *)",
"Edit",
"Read"
],
"deny": [
"Bash(rm -rf *)",
"Bash(git push --force)",
"Bash(DROP TABLE *)"
]
}
}
Glob 패턴: 와일드카드(*)를 사용해 여러 명령을 한 번에 매칭. "npm run *"은 npm run으로 시작하는 모든 명령을 의미합니다.
{
"permissions": {
"allow": [
"Read",
"Edit",
"Write",
"Glob",
"Grep"
]
}
}
파일 읽기/쓰기/검색을 모두 허용합니다. 로컬 개발 환경에서 일반적인 설정입니다.
{
"permissions": {
"allow": [
"Bash(npm *)",
"Bash(git status)",
"Bash(git diff *)",
"Bash(git add *)",
"Bash(git commit *)"
],
"deny": [
"Bash(git push *)",
"Bash(npm publish)"
]
}
}
로컬 작업은 허용하되 원격 작업(push, publish)은 항상 확인하는 설정입니다.
claude> /permissions
현재 권한 설정을 확인하고 세션 중에 임시로 조정할 수 있습니다.
claude> /fewer-permission-prompts
반복적으로 허용하는 패턴을 자동으로 감지해 권한 확인 횟수를 줄입니다. 안전한 작업은 이후 자동 허용으로 전환됩니다.
세션 중에 특정 명령을 항상 허용하도록 설정할 수 있습니다.
Claude: npm run build 를 실행하려 합니다.
[y] 허용 / [Y] 항상 허용 / [n] 거부
Y(항상 허용)를 선택하면 해당 세션에서 같은 명령은 다시 묻지 않습니다.
// .claude/settings.json (프로젝트 공유)
{
"permissions": {
"allow": ["Read", "Glob", "Grep"],
"deny": ["Bash(git push *)"]
}
}
// .claude/settings.local.json (개인 로컬, Git 제외)
{
"permissions": {
"allow": [
"Read", "Edit", "Write",
"Bash(npm *)", "Bash(git *)"
]
}
}
팀 공유 설정에는 안전한 도구만 허용하고, 개인 로컬 설정에서 개발 편의를 위한 권한을 추가합니다.
자동화 파이프라인에서는 모든 도구를 허용하는 설정을 씁니다.
{
"permissions": {
"allow": ["*"]
}
}
또는 환경변수로 제어합니다.
CLAUDE_SKIP_PERMISSIONS=1 claude --print "테스트 실행하고 결과 보고해줘"
CLAUDE_SKIP_PERMISSIONS: 권한 확인을 건너뛰는 환경변수. CI/CD 환경처럼 사람이 개입할 수 없는 상황에서 씁니다.
읽기는 넓게, 쓰기는 좁게, 실행은 명시적으로 설정하는 것이 일반적인 원칙입니다.
Read, Glob, Grep → 모두 허용 (읽기만 하므로 안전)
Edit, Write → 프로젝트 범위 내 허용
Bash → 필요한 명령만 명시적 허용
외부 서비스 호출 → 항상 확인 (MCP 도구 등)