- Claude Code Permission 글로벌 설정은 프로젝트별 permission 반복 요청과 settings.local.json git 노출 문제를 동시에 해결하는 방법
~/.claude/settings.json에 허용 규칙을 등록하여 모든 프로젝트에 일괄 적용하는 설정settings.local.json생성 자체를 줄여 git status 오염을 근본적으로 방지하는 전략
해당 개념이 필요한 이유
- Claude Code에서 tool/명령어 사용 시 매번 permission을 물어봄 → “Always allow” 선택 시
.claude/settings.local.json에 저장됨 settings.local.json이git status에 뜨지만,.gitignore수정은 팀 프로젝트에 영향을 줌- 프로젝트마다 동일한 허용 작업을 반복해야 하는 비효율
AS-IS
sequenceDiagram autonumber participant User as 사용자 participant CC as Claude Code participant Local as .claude/settings.local.json participant Git as git status User->>CC: tool 사용 요청 CC->>User: Permission 물어봄 User->>CC: "Always allow" 선택 CC->>Local: 허용 규칙 저장 Local->>Git: Untracked/Modified로 노출 Note over Git: .gitignore 수정 불가<br/>(팀 프로젝트 영향) Note over User: 다른 프로젝트에서<br/>동일 작업 반복
TO-BE
sequenceDiagram autonumber participant User as 사용자 participant Global as ~/.claude/settings.json participant CC as Claude Code participant Git as git status Note over User,Global: 한 번만 설정 User->>Global: 허용 규칙 등록 User->>CC: tool 사용 요청 CC->>Global: 글로벌 설정 확인 Note over CC: 이미 허용됨 → 물어보지 않음 CC->>User: 바로 실행 Note over Git: settings.local.json<br/>생성되지 않음 → 깨끗
Settings 계층 구조
| 우선순위 | Scope | 위치 | 적용 범위 | git 공유 |
|---|---|---|---|---|
| 1 (최고) | Managed | 조직 배포 | 전체 사용자 | Yes |
| 2 | Command line | CLI 인자 | 현재 세션 | N/A |
| 3 | Local | .claude/settings.local.json | 나, 이 프로젝트만 | No |
| 4 | Project | .claude/settings.json | 팀 전체 | Yes |
| 5 (최저) | User | ~/.claude/settings.json | 나, 모든 프로젝트 | No |
핵심: **Local(3순위)**이 **User(5순위)**보다 우선하므로, 글로벌 설정 후에도 프로젝트별 오버라이드 가능
해결 방법
Step 1: 기존 settings.local.json에서 허용 규칙 수집
각 프로젝트의 .claude/settings.local.json을 확인하여 allow 목록 수집:
cat 프로젝트/.claude/settings.local.jsonStep 2: ~/.claude/settings.json에 병합
{
"permissions": {
"allow": [
"Bash(git commit *)",
"Bash(git add *)",
"Bash(git stash *)",
"Bash(git status)",
"Bash(git diff *)",
"Bash(git log *)",
"WebSearch",
"WebFetch"
],
"deny": [
"Bash(git push --force *)",
"Bash(git reset --hard *)",
"Read(./.env)",
"Read(./.env.*)"
]
}
}Step 3: (보험) 글로벌 gitignore 설정
settings.local.json이 생기더라도 git status에 안 뜨게:
# 글로벌 gitignore 경로 설정
git config --global core.excludesFile ~/.gitignore_global
# 패턴 추가
echo ".claude/settings.local.json" >> ~/.gitignore_globalPermission 규칙 문법
| 패턴 | 의미 |
|---|---|
Bash | 모든 Bash 명령 허용 |
Bash(git *) | git으로 시작하는 명령만 허용 |
Bash(npm run *) | npm run으로 시작하는 명령만 허용 |
Read(./.env) | 특정 파일 읽기 허용/차단 |
WebFetch(domain:github.com) | 특정 도메인만 허용 |
WebSearch | 웹 검색 전체 허용 |
WebFetch | 웹 페이지 패치 전체 허용 |
특정 프로젝트에서 글로벌 deny 오버라이드
글로벌에서 .env 읽기를 deny했더라도, 특정 프로젝트에서 허용이 필요한 경우:
Local (.claude/settings.local.json) ← 3순위, 우선
↑ 오버라이드
User (~/.claude/settings.json) ← 5순위
글로벌 ~/.claude/settings.json:
{
"permissions": {
"deny": ["Read(./.env)", "Read(./.env.*)"]
}
}특정 프로젝트 .claude/settings.local.json:
{
"permissions": {
"allow": ["Read(./.env)"]
}
}Local(3순위)이 User(5순위)보다 우선하므로, 해당 프로젝트에서만 .env 읽기가 허용된다.
deny가 차단할 경우 Claude Code가 사용자에게 알려주므로, 필요할 때 프로젝트 Local 설정으로 오버라이드하면 된다.
설정 확인
Claude Code 내에서 /status 명령으로 활성 설정 확인 가능:
Enterprise managed settings (remote)
Project settings (.claude/settings.json)
User settings (~/.claude/settings.json)