# 권한 시스템

> Claude Code가 어떤 작업을 자동으로 수행하고 어떤 작업에 명시적 승인이 필요한지 제어하는 방법.

Claude Code는 로컬 머신에서 도구를 실행합니다 — 셸 커맨드 실행, 파일 편집, URL 가져오기. 권한 시스템은 Claude가 자동으로 수행하는 작업과 명시적 승인이 필요한 작업을 정밀하게 제어합니다.

## 권한이 제어하는 것

권한은 세 가지 작업 범주에 적용됩니다:

- **파일 작업** — `Read`, `Edit`, `Write` 도구를 통한 로컬 파일시스템 읽기, 편집, 쓰기
- **Bash 커맨드** — `Bash` 도구를 통한 셸 커맨드 실행(설치, 빌드, git 작업, 임의 스크립트 포함)
- **MCP 도구 호출** — 연결된 MCP 서버가 노출한 도구(데이터베이스 쿼리, API 호출, 브라우저 자동화 등)

## 권한 모드

권한 모드는 특정 허용/차단 규칙과 일치하는 도구 호출이 없을 때의 기본 동작을 결정합니다. 모드를 한 번 설정하면 세션 전체에 적용됩니다.

**`default` — 잠재적으로 위험한 작업에 확인 요청**
표준 모드. 셸 커맨드 실행, 파일 편집, 네트워크 요청 등 부작용이 있을 수 있는 작업에 확인을 요청합니다. 파일 읽기, 검색 등 읽기 전용 작업은 자동 승인됩니다. 일상적인 사용에 권장됩니다.

**`acceptEdits` — 파일 편집 자동 승인**
`Edit`, `Write` 도구가 프롬프트 없이 자동 승인됩니다. Bash 커맨드는 여전히 확인이 필요합니다. Claude가 파일을 자유롭게 편집하도록 하되 셸 커맨드는 검토하고 싶을 때 유용합니다.

**`plan` — 읽기 전용 계획 모드**
Claude가 파일을 읽고, 코드베이스를 검색하고, 변경 사항에 대해 논의할 수 있지만 쓰기 또는 bash 작업을 실행할 수 없습니다. 모든 변경 도구 호출이 차단됩니다. Claude가 문제를 분석하고 변경 사항을 승인하기 전에 계획을 만들도록 할 때 사용하세요.

**`bypassPermissions` — 모든 권한 검사 건너뛰기**
모든 권한 검사가 비활성화됩니다. 모든 도구 호출이 확인 프롬프트 없이 즉시 실행됩니다.
> ⚠️ 이 모드는 Claude가 수행할 작업을 미리 감사한 완전 스크립트화된 자동화 워크플로우 전용입니다. Claude가 예기치 않은 작업을 취할 수 있는 대화형 세션에서는 절대 사용하지 마세요.

## 권한 모드 설정 방법

**CLI 플래그:**
```bash
claude --permission-mode acceptEdits
claude --permission-mode bypassPermissions
claude --permission-mode plan
```

**`/permissions` 커맨드 (세션 중):**
```
/permissions
```
재시작 없이 모드를 변경합니다.

**settings.json:**
```json
{
  "defaultMode": "acceptEdits"
}
```
유효한 값: `"default"`, `"acceptEdits"`, `"bypassPermissions"`, `"plan"`, `"dontAsk"`

## 권한 규칙 (허용/차단 목록)

전역 모드 외에도, 활성 모드에 관계없이 특정 도구 호출을 항상 허용하거나 항상 차단하는 세분화된 규칙을 만들 수 있습니다.

규칙은 세 가지 구성 요소를 가집니다:

| 필드 | 설명 |
|------|------|
| `toolName` | 규칙이 적용되는 도구 이름 (예: `"Bash"`, `"Edit"`, `"mcp__myserver"`) |
| `ruleContent` | 도구 입력과 일치해야 하는 선택적 패턴 |
| `behavior` | `"allow"`, `"deny"`, 또는 `"ask"` |

규칙은 권한 모드보다 **먼저** 평가됩니다. 일치하는 규칙이 있으면 해당 동작이 즉시 적용됩니다.

### 예시: 특정 git 커맨드 항상 허용

```json
{
  "permissions": {
    "allow": [
      "Bash(git status)",
      "Bash(git diff *)",
      "Bash(git log *)",
      "Read(*)"
    ],
    "deny": [
      "Bash(rm -rf *)",
      "Bash(sudo *)"
    ]
  }
}
```

## Bash 권한 작동 방식

**패턴 매칭:**
- `git status` — 정확한 일치만
- `git *` — 모든 `git` 서브커맨드와 일치
- `npm run *` — 모든 `npm run` 스크립트와 일치
- `*` — 모든 bash 커맨드와 일치 (극도의 주의 필요)

**복합 커맨드:**
`&&`, `||`, `;`, 파이프(`|`)로 연결된 복합 커맨드는 각 서브커맨드가 독립적으로 검사됩니다. 하나의 서브커맨드라도 차단되면 전체 복합 커맨드가 차단됩니다.

**항상 차단/에스컬레이션되는 작업:**
- 프로젝트 디렉토리 외부 경로로의 출력 리다이렉션(`>`, `>>`)
- 워킹트리 외부로의 디렉토리 변경(`cd`)
- `sed -i` 편집 인플레이스 커맨드(파일 수정 추적을 위해 특별 처리)
- `.claude/` 또는 `.git/` 설정 디렉토리를 대상으로 하는 커맨드
- 셸 설정 파일 수정(`.bashrc`, `.zshrc` 등)

## MCP 도구 권한

MCP 도구는 내장 도구와 동일한 규칙 시스템을 따릅니다:

```json
{
  "permissions": {
    "deny": [
      "mcp__myserver"
    ],
    "allow": [
      "mcp__myserver__read_database"
    ]
  }
}
```

`mcp__servername`을 규칙으로 사용하면(특정 도구 이름 없이) 해당 서버의 모든 도구가 차단됩니다 — 모델이 보기 전에 도구 목록에서 필터링됩니다.

## 보안 권장 사항

- **`default` 모드**로 모든 대화형 세션을 시작하세요
- 익숙하지 않은 코드베이스를 탐색하거나 큰 변경 사항을 설계할 때는 **`plan` 모드**를 사용하세요
- Claude가 파일을 자유롭게 편집하도록 하되 셸 커맨드는 검토하려면 **`acceptEdits`**를 사용하세요
- 광범위한 모드 에스컬레이션 대신 **세분화된 허용 규칙**을 선호하세요. `Bash(git *)`를 허용하는 것이 `bypassPermissions`로 전환하는 것보다 안전합니다
- 친숙하지 않은 저장소를 클론할 때 `.claude/settings.json`을 검토하세요 — 권한 규칙이 미리 설정되어 있을 수 있습니다
