CPN 한국어 자습서 · Claude Certified Developer — Foundations Prep
3-2 · Claude Code 운영
Permission Modes & Human Gates
Claude Code는 에이전트 루프를 터미널에서 실행하되, 여기에 한 가지를 더 둡니다. 에이전트가 하려는 모든 동작을 한 번씩 거르는 권한 시스템입니다. 무엇을 어떻게 설정할지 정하기 전에, 이 루프가 어떻게 이어지고 권한 모드가 무엇을 조절하는지부터 살펴봅니다. 그리고 모드나 규칙만으로는 정해지지 않는 것, 즉 사람이 직접 확인해야 하는 자리를 판단하는 방법까지 이어집니다.
이 장에서 배우는 것What you'll learn
약 24분Claude Code가 일하는 순서 — 탐색 · 계획 · 코드
권한 모드 여섯 가지와 각각의 자동 승인 · 확인 · 한계
설정을 두는 네 층위와 우선순위 — 차단이 허용을 이긴다
최악의 경우로 사람의 확인 자리를 정하는 법
확인 하나를 지워 버린 bypass 모드 — 실제 사례
settings.json 조립과 사람의 확인 배치 — 점검 문항
settings.jsonClaude Code에 일을 맡기면 곧바로 코드를 쓰기 시작하지 않습니다. 먼저 파일을 읽고, 관련된 로직을 따라가며 코드베이스의 그림을 그립니다. 이 단계가 탐색입니다.
충분히 파악해서 바꿀 내용을 제안할 수 있게 되면, 그다음에 계획을 만듭니다. 계획은 어떤 편집을 할지 구조를 잡아 적은 설명입니다. 사람이 그 계획을 검토하고 승인한 뒤에야 코드 단계로 넘어가, 실제로 변경을 쓰고 실행합니다.
이 순서가 중요한 데는 이유가 둘 있습니다. 하나는 결과의 질입니다. 무언가를 건드리기 전에 코드베이스를 먼저 이해하기 때문에, 넘겨짚는 부분이 줄고 뒤따르는 영향을 더 많이 잡아냅니다. 다른 하나는 권한 모드가 끼어드는 자리가 바로 여기라는 점입니다. plan 모드는 Claude Code를 탐색 단계에 붙들어 두고, 사람이 풀어 줄 때까지 파일 편집과 셸 명령을 모두 막습니다. 낯선 코드베이스나 위험이 큰 작업에서 기본값으로 삼기 좋은 이유입니다.
Claude Code는 API 층위의 에이전트 루프를 그대로 실행하면서, 그 위에 확인 단계를 한 겹 더 얹은 도구입니다. 이 장의 나머지는 그 확인을 어디에 얼마나 둘지에 대한 이야기입니다.
권한 모드는 Claude Code가 확인을 물으려고 멈추는 빈도를 조절합니다. 모드마다 속도와 점검 사이의 균형을 다르게 잡습니다. 어떤 모드가 맞는지는 코드베이스를 얼마나 잘 아는지, 그리고 변경을 얼마나 쉽게 되돌릴 수 있는지에 따라 달라집니다.
여섯 가지 모드가 각각 무엇을 자동으로 승인하고, 무엇은 여전히 확인을 요구하며, 어떤 한계가 있는지 정리하면 다음과 같습니다.
SIX MODES — 여섯 가지 권한 모드
| default | 자동 승인 읽기만. 거의 모든 편집·명령 전에 확인을 묻습니다. 그래도 확인 모든 파일 편집과 셸 명령. 한계 안전하지만 신뢰된 작업에서는 느립니다. 새 프로젝트나 낯선 코드베이스의 기본값입니다. |
|---|---|
| acceptEdits | 자동 승인 읽기, 파일 편집, 그리고 작업 디렉터리 안의 흔한 파일 명령(mkdir · touch · rm · rmdir · mv · cp · sed). 자동 승인은 작업 디렉터리 안 경로에만 적용되고, 보호 경로는 여전히 확인을 묻습니다.그래도 확인 그 밖의 모든 셸 명령, 작업 디렉터리 밖 쓰기, 보호 경로 쓰기. 한계 셸 실행에는 여전히 사람의 확인이 필요한 신뢰된 로컬 작업용. 에이전트가 스크립트를 실행해야 하는 경우에는 맞지 않습니다. |
| plan | 자동 승인 읽기만. 조사하고 제안하되, 편집은 하지 않습니다. 그래도 확인 사람이 계획을 승인할 때까지 모든 파일 편집과 셸 명령. 한계 민감하거나 낯선 코드베이스의 탐색·계획용. 결과물을 써야 하는 작업에는 맞지 않습니다. |
| auto | 자동 승인 거의 전부. 단, 별도 분류기가 동작마다 먼저 검토해, 요청 범위를 넘어서거나, 알 수 없는 인프라를 건드리거나, 악의적·부적절한 내용에서 비롯된 것으로 보이는 동작을 막습니다. 그래도 확인 프로덕션 배포·마이그레이션, 대량 삭제, 자격 증명 유출, main 브랜치 강제 푸시는 기본으로 차단됩니다.한계 확인 횟수는 줄지만 안전을 보장하지는 않습니다. 연구 프리뷰이지 민감한 작업 검토를 대신하지 못합니다. 사용 가능 여부는 요금제·모델 버전·관리자 설정에 따라 다르니, 만들기 전에 현재 요건을 확인해 두는 것이 좋습니다. |
| dontAsk | 자동 승인 허용 규칙에 미리 등록한 도구와 읽기 전용 명령만. 그 밖은 전부 자동으로 거부합니다. 그래도 확인 허용 목록에 없는 모든 도구 호출은 거부됩니다. 확인을 기다리는 대기열 자체가 없습니다. 한계 잠긴 CI와 스크립트용. 제한은 잘하지만, 로컬에서 직접 작업할 때 번거로움을 줄이려는 목적에는 맞지 않습니다. |
| bypassPermissions | 자동 승인 모든 도구 호출. 확인도 안전 점검도 없습니다. 그래도 확인 평상시에는 없습니다. 표준 권한 점검을 전부 건너뛰고, rm -rf /나 rm -rf ~ 같은 파멸적 삭제 명령만 마지막 방어선으로 확인을 띄웁니다.한계 환경을 버려도 되는 격리된 컨테이너나 VM 안에서만. 살아 있는 코드베이스를 다루는 개발자 워크스테이션에서는 절대 쓰지 않습니다. |
default에서 bypassPermissions로 갈수록 확인은 줄어듭니다. 대신 되돌리기 어려운 실수를 막아 줄 장치도 함께 줄어듭니다. 그래서 모드를 고르는 일은 이 코드베이스를 얼마나 믿을 수 있는지에 대한 판단과 맞물립니다.
권한 모드를 정했다면, 그 규칙을 어디에 적어 둘지가 다음 문제입니다. 설정은 여러 층위에 둘 수 있고, 층위마다 규칙이 미치는 범위가 달라집니다.
SETTINGS SCOPE — 설정을 두는 네 층위
| 사용자 | ~/.claude/settings.json한 컴퓨터의 모든 프로젝트에 적용됩니다. 어디서나 따라다녀야 하는 취향, 예를 들어 탐색 작업에 즐겨 쓰는 기본 모드를 여기에 둡니다. |
|---|---|
| 프로젝트 | .claude/settings.json · 저장소에 커밋저장소를 복제하는 모든 사람에게 적용됩니다. 팀 공통 규칙, 프로젝트가 쓰는 도구의 허용 규칙, 건드리면 안 되는 경로의 차단 규칙을 여기에 둡니다. |
| 로컬 프로젝트 | .claude/settings.local.json · git 제외한 프로젝트에 대한 개인 설정으로, git에서 자동으로 빠집니다. 팀 전체에 커밋하고 싶지 않은 내 취향을 여기에 둡니다. |
| 엔터프라이즈 | managed-settings.json · 관리자 설정사용자나 프로젝트 파일이 덮어쓸 수 없습니다. 환경 파일 편집 차단이나 특정 셸 명령 차단처럼, 조직 전체에 걸친 보안 통제를 여기에 둡니다. |
허용 규칙과 차단 규칙은 선택한 모드 위에 겹쳐서 적용됩니다. 그리고 차단 규칙은 어떤 모드에서든 허용 규칙을 이깁니다. 가장 오래가는 통제는 엔터프라이즈 층위의 차단 규칙입니다. 개별 개발자가 지울 수 없고, bypass 모드가 걸려 있어도 그대로 적용되기 때문입니다.
차단은 허용을 이깁니다. 아래에서 무엇을 열어 뒀든, 위에서 막아 둔 것은 열리지 않습니다.
권한 모드와 차단 규칙은 에이전트가 무엇을 묻지 않고 할 수 있는지를 정합니다. 하지만 어떤 동작이 반영되기 전에 사람이 어디를 직접 봐야 하는지까지 정해 주지는 않습니다. 그건 한 가지 질문으로 판단합니다. 안전한 모드와 위험한 모드를 가르는 것과 같은 질문입니다. 이 동작이 사람의 확인 없이 실행되면, 최악의 경우 무슨 일이 벌어질까?
잘못됐을 때 감수할 위험이 작을수록 더 많이 통과시켜도 됩니다. 위험이 크고 되돌리기 어려울수록, 실행 전에 사람이 확인하는 단계를 두는 편이 좋습니다.
같은 질문이 확인 단계를 어디에 둘지도 정합니다. 에이전트가 코드를 쓸 때든, 풀 리퀘스트에 코멘트를 달거나 막는 봇처럼 사람 없이 자동으로 실행될 때든 똑같습니다. 여기서 배치가 세 가지로 갈립니다.
acceptEdits가 이런 경우를 위해 만들어진 모드입니다.default나 plan 모드는 사람이 판단하는 동안 확인 창을 유지합니다.확인 단계를 어디에 둘지와 어떤 권한 모드를 고를지는, 사실 하나의 결정을 양쪽에서 본 것입니다. 모드는 세션 전체의 기본값을 정하고, 확인 단계는 그 기본값에 맡기기엔 위험이 너무 큰 한 동작에서 기본값을 덮어쓰는 자리입니다. 둘 다 "이게 확인 없이 실행되면 무엇이 깨질까"라는 하나의 질문에서 나옵니다.
COST · COMPLEXITY · RISK — 함께 따져 볼 세 가지
| 비용 | default 모드로 신뢰된 작업을 하면 도구 호출마다 확인 지연이 붙고, 긴 리팩터링에서는 이게 쌓입니다. |
|---|---|
| 복잡도 | 설정이 여러 층위의 파일에 흩어져 있고 우선순위가 겹치므로 꾸준한 관리가 필요합니다. 엔터프라이즈 층위의 차단 규칙이 프로젝트 층위의 허용 규칙과 부딪히는 경우, 프로젝트 설정을 관리하는 모든 사람이 그 관계를 이해하고 있어야 합니다. |
| 위험 | 위험은 맥락에 맞지 않는 모드를 쓰는 데서 옵니다. 예를 들어 격리되지 않은 컴퓨터에서 조급함에 bypass 모드를 켜면, 에이전트와 살아 있는 파일 사이의 안전 확인이 전부 사라지고, 다른 모드와 달리 보호 경로 가드까지 없어집니다. |
확인이 자꾸 뜨는 게 번거로워서 bypassPermissions로 바꿨다고 해 봅시다. 작업이 익숙하게 느껴졌기 때문입니다. 에이전트는 며칠째 얌전히 잘 움직였고, 정리 작업은 단순했고, 도구 호출마다 확인을 묻는 동작이 불필요한 마찰처럼 느껴졌습니다.
다음은 사흘 동안 별문제 없이 이어지던 코드베이스 정리 작업에서 오간 짝 프로그래밍 기록입니다.
TRANSCRIPT — 정리 작업 중 오간 대화
개발자: "이번 건 bypassPermissions로 바꿀게. 오래된 API 엔드포인트 이름만 바꾸는 거야. 위험할 거 없어." Claude Code: [ /v1/legacy/ 패턴에 맞는 파일 검색 중 … 47개 발견 ] Claude Code: [ 엔드포인트 참조 갱신 중 … ] Claude Code: [ 이름 변경 후 정리 스크립트 cleanup.sh 실행 중 … ] Claude Code: [ /deploy/config/prod/ 안에서 /v1/legacy/ 패턴에 맞는 파일 3개 삭제됨 … ] 개발자: "잠깐. /deploy/config/prod/ 에 뭐가 있었지?" Claude Code: [ 프로덕션 배포용 환경별 엔드포인트 설정 파일이었습니다. 삭제되었습니다. ] 개발자: "그 디렉터리는 작업 범위가 아니었어. 나는 /src/ 만 보고 있었는데." Claude Code: [ /v1/legacy/ 패턴이 /src/ 와 /deploy/config/prod/ 양쪽 파일에 걸렸습니다. bypassPermissions 모드에서는 삭제 전에 확인을 요청하지 않았습니다. ]
이 실수를 잡아 줬을 확인 창은 bypassPermissions를 켜는 순간 함께 꺼졌습니다. default나 acceptEdits 모드였다면 정리 스크립트는 확인 없이 실행되지 않았을 것이고, 삭제가 프로덕션 설정 파일에 닿기 전에 멈출 수 있었을 것입니다. bypass 모드에서는 패턴이 의도보다 넓게 걸렸고, 스크립트와 그것이 지운 파일 사이에 아무 확인도 없었습니다.
게이트가 정확히 어디였는지 짚어 둘 필요가 있습니다. 확인을 띄웠을 지점은 rm 삭제 명령 자체가 아니라 스크립트 호출이었습니다. acceptEdits는 작업 디렉터리 안 경로에 대한 rm을 포함해 흔한 파일 명령을 자동으로 승인합니다. 만약 Claude가 삭제를 rm 명령으로 곧장 실행했다면 acceptEdits는 그대로 통과시켰을 것이고, 그런 명령에 확인을 묻는 것은 default 모드뿐입니다.
bypassPermissions는 다른 모드가 지키는 보호 경로 가드도 건너뜁니다. 그래서 저장소 상태나 Claude 자신의 설정까지 자동 확인을 잃습니다.auto)를 씁니다.plan 모드는 탐색 단계에 붙들어 두어, 사람이 계획을 승인하기 전에는 편집과 셸 명령을 막습니다.default에서 bypassPermissions로 갈수록 확인은 줄지만, 되돌리기 어려운 실수를 막아 줄 장치도 함께 줄어듭니다.결제 모듈을 신뢰된 로컬 환경에서 리팩터링하도록 Claude Code를 설정하는 상황입니다. 조건은 셋입니다. 파일 편집은 자동으로 승인하되, 파괴적 셸 명령은 절대 실행되지 않아야 하고, .env.production 파일은 에이전트가 절대 읽을 수 없어야 합니다. 아래는 고를 수 있는 settings.json 조각들입니다.
settings.json · 조각 A–E
// Piece A { "permissions": { "defaultMode": "default" } } // Piece B { "permissions": { "defaultMode": "bypassPermissions" } } // Piece C { "permissions": { "allow": ["Bash(npm run:*)"], "deny": ["Bash(rm:*)", "Bash(git push:*)"] } } // Piece D { "permissions": { "deny": ["Read(.env.production)"] } } // Piece E { "permissions": { "allow": ["Bash(*)", "Edit(*)"] } }
정답을 먼저 떠올려 본 뒤 골라 보세요. 맞히면 설명이 나옵니다. 조건에 맞는 조각은 모두 두 개입니다 — 앞의 두 문항이 그 둘을 하나씩 짚습니다.
Q1파일 편집은 살리되 파괴적 셸 명령은 막으려고 합니다. 셸 실행을 걸러 주는 조각은 어느 것일까요?
Piece C입니다. 허용 규칙이 안전한 npm run 명령을 통과시키고, 차단 규칙이 rm·git push 같은 파괴적 명령을 막습니다. Piece B는 bypassPermissions라 파괴적 명령까지 확인 없이 실행되고 보호 경로 가드도 사라지며, Piece E는 모든 셸 명령을 허용해 파괴적 명령을 거를 장치가 아예 없습니다.
Q2.env.production을 에이전트가 읽지 못하게 막는 조각은 어느 것일까요?
Piece D입니다. .env.production에 대한 차단 규칙은 세션 중 에이전트가 무엇을 요청받든 설정 층위에서 그대로 유지됩니다. 결국 세 조건을 만족시키는 두 조각은 C와 D입니다 — C가 셸 실행을 거르고, D가 읽기 접근을 막습니다.
Q3이 설정으로 편집은 자동 승인됩니다. 리팩터링 도중 에이전트가 여러 프로덕션 서비스가 읽는 배포 설정 파일을 바꾸겠다고 제안합니다. 이 한 동작에는 사람의 확인을 어디에 둬야 할까요?
신뢰된 로컬 리팩터링에서 편집을 자동 승인하는 것은 맞는 기본값입니다. 하지만 최악의 경우 질문은 위험이 큰 한 동작에는 여전히 적용됩니다. 여러 프로덕션 서비스가 읽는 배포 설정 파일에 대한 쓰기는 되돌리기 어렵고 파일 밖에까지 닿으므로, 쓰기가 실행되기 전에 사람이 검토하고 승인합니다.
다음 레슨은 세션이 바뀌어도 프로젝트에 남는 맥락(Durable Project Context)을 다룹니다. → 오래 남는 프로젝트 맥락
전 코스는 계속 무료입니다. 등록하면 이 코스의 남은 38개 레슨을 끝까지 읽을 수 있습니다.
이미 등록하셨다면 그때 쓰신 이메일을 넣어 주세요.