패스노트
도메인 3. Claude Code 설정과 워크플로

3.3경로별 규칙

예상 학습 시간 35

settings.json의 권한 규칙과 계층별 설정 파일을 이용하면 '어떤 도구를 어떤 경로·명령에 허용할지'를 세밀하게 제어할 수 있습니다. 이 수업에서는 설정 파일 계층, permissions 문법, 그리고 민감한 파일 보호 패턴을 다룹니다.

설정 파일의 계층

Claude Code의 동작 설정은 여러 위치의 settings.json이 계층적으로 병합되어 결정됩니다.

파일범위용도
엔터프라이즈 관리 정책조직 전체관리자가 강제, 사용자가 덮어쓸 수 없음
~/.claude/settings.json사용자 전역개인 기본값
.claude/settings.json프로젝트 (커밋)팀 공유 규칙
.claude/settings.local.json프로젝트 (개인)커밋하지 않는 개인 오버라이드, 자동으로 gitignore 처리

우선순위는 엔터프라이즈 정책 > 명령줄 인자 > 로컬 프로젝트 설정 > 공유 프로젝트 설정 > 사용자 설정 순입니다. 즉 관리자가 금지한 것은 누구도 로컬에서 풀 수 없고, 같은 항목이라면 프로젝트 로컬 설정이 사용자 전역 설정을 이깁니다.

// .claude/settings.json — 팀 공유
{
  "permissions": {
    "allow": ["Bash(npm run lint)", "Bash(npm run test:*)"],
    "deny": ["Read(./.env)", "Read(./secrets/**)"]
  }
}

이 파일을 저장소에 커밋하면 팀원 전체가 같은 허용·금지 규칙 아래에서 작업하게 됩니다. 개인적으로 더 허용하고 싶은 것이 있으면 settings.local.json에 추가합니다.

permissions 규칙 문법

permissions에는 allow(자동 허용), ask(확인 후 실행), deny(항상 거부) 세 목록이 있으며, 각 규칙은 도구이름(지정자) 형태입니다.

Bash 규칙은 명령 접두사로 매칭합니다.

  • Bash(npm run test:*) — npm run test로 시작하는 모든 명령 허용
  • Bash(git push:*)를 deny에 넣으면 푸시를 항상 차단

파일 도구 규칙(Read, Edit 등)은 gitignore 스타일 경로 패턴을 씁니다.

  • Read(./.env) — 프로젝트 루트의 .env 읽기
  • Edit(./src/**) — src 아래 모든 파일 편집
  • Read(~/Documents/*.pdf) — 홈 디렉터리 문서

그 외 도구WebFetch(domain:example.com)처럼 도구별 지정자를 갖거나, 지정자 없이 WebSearch처럼 도구 전체를 지정할 수 있습니다.

{
  "permissions": {
    "allow": ["Bash(npm run:*)", "WebFetch(domain:docs.anthropic.com)"],
    "ask": ["Bash(git push:*)"],
    "deny": ["Read(./.env*)", "Read(./secrets/**)", "Bash(curl:*)"]
  }
}

주의할 점: deny가 항상 allow보다 우선합니다. 그리고 Bash 접두사 매칭은 셸 문법을 완전히 해석하는 것이 아니므로, 보안 경계로 삼기보다는 실수 방지 장치로 이해해야 합니다. 진짜 보안 격리가 필요하면 샌드박스나 컨테이너 수준에서 격리해야 합니다.

민감한 파일 보호와 디렉터리 접근

실무에서 가장 중요한 패턴은 비밀 정보 접근 차단입니다. .env, 인증서, 클라우드 자격증명 파일은 deny 목록에 명시하는 것이 표준 관행입니다.

{
  "permissions": {
    "deny": [
      "Read(./.env)",
      "Read(./.env.*)",
      "Read(./config/credentials/**)",
      "Read(~/.aws/**)"
    ]
  }
}

deny의 Read 규칙에 걸린 파일은 Claude가 읽으려 할 때 차단되므로, 실수로 비밀 값이 컨텍스트(그리고 대화 로그)에 들어가는 것을 막습니다.

작업 디렉터리 확장도 경로 제어의 일부입니다. Claude Code는 기본적으로 실행된 디렉터리를 기준으로 작업하며, 그 밖의 경로에 접근할 때는 추가 승인이 필요합니다. 여러 저장소를 오가는 작업이라면 --add-dir 플래그나 /add-dir 명령으로 추가 디렉터리를 명시적으로 열어 줄 수 있습니다. 설정의 additionalDirectories 항목으로 상시 허용할 수도 있습니다.

마지막으로 경로별 '규칙'과 경로별 '지침'의 구분을 다시 짚어야 합니다. 특정 디렉터리에서의 코딩 컨벤션은 그 디렉터리의 CLAUDE.md(3.1 수업)로 전달하는 지침이고, 특정 경로의 읽기·쓰기 차단은 permissions로 거는 강제입니다. 전자는 모델이 따르도록 유도하는 것, 후자는 시스템이 차단하는 것입니다. 시험에서는 이 둘을 바꿔 놓은 오답이 자주 출제됩니다.

시험 함정

  • allow와 deny가 충돌하면 deny가 이긴다는 것 놓치기.
  • 설정 우선순위 혼동 — 엔터프라이즈 정책이 최상위이고, 로컬 프로젝트 설정이 사용자 전역 설정보다 우선합니다.
  • settings.local.json을 커밋해야 한다고 생각하기 — 개인 오버라이드용이며 자동으로 gitignore 처리됩니다.
  • Bash 접두사 매칭을 완전한 보안 경계로 믿기 — 실수 방지 장치이지 격리 수단이 아닙니다.
  • 코딩 컨벤션을 permissions로, 접근 차단을 CLAUDE.md로 거는 역할 혼동.
  • 작업 디렉터리 밖 접근이 자동 허용된다고 생각하기 — 추가 디렉터리는 --add-dir 또는 설정으로 명시해야 합니다.

실습 시나리오

실제 시험과 같은 형식의 시나리오 문제입니다.

팀 저장소에서 (a) .env 파일을 Claude가 절대 읽지 못하게 하고, (b) npm run으로 시작하는 스크립트는 확인 없이 실행되게 하며, (c) 이 규칙이 팀원 모두에게 적용되게 하려 합니다. 올바른 방법은?

빌드 연습 · 팀 권한 정책 구성

35
  1. 1.비밀 파일 차단

    .claude/settings.json에 .env와 secrets/ 읽기를 deny로 등록합니다.

    기대 결과 · Claude에게 .env를 읽어 달라고 요청하면 차단됩니다.

  2. 2.안전 명령 자동 허용

    npm run lint, npm run test:* 를 allow에 등록합니다.

    기대 결과 · 해당 명령이 확인 프롬프트 없이 실행됩니다.

  3. 3.위험 명령 확인 강제

    git push를 ask 목록에 넣습니다.

    기대 결과 · 푸시 시도 시 항상 확인 프롬프트가 뜹니다.

  4. 4.개인 오버라이드

    settings.local.json에 개인적으로 자주 쓰는 명령 하나를 추가로 허용합니다.

    기대 결과 · git status에서 해당 파일이 추적되지 않는 것을 확인합니다.

  5. 5.충돌 실험

    같은 명령을 allow와 deny에 동시에 넣고 어떤 규칙이 이기는지 확인합니다.

    기대 결과 · deny가 우선함을 확인합니다.

출처 및 더 읽기