AI 코딩 어시스턴트를 프로젝트에 들이면 가장 먼저 걱정되는 게 하나 있습니다. "얘가 내 파일을 마음대로 지우거나, 이상한 명령어를 실행하면 어떡하지?" 하는 부분이죠. 클로드 코드(Claude Code)는 이 문제를 권한 시스템으로 해결합니다. 어떤 도구를 자동으로 써도 되는지, 어떤 건 물어보고 써야 하는지, 어떤 건 아예 막아야 하는지를 세밀하게 정할 수 있습니다.
오늘은 이 권한 관리를 어떻게 확인하고 설정하는지 정리해보겠습니다.
클로드가 사용하는 도구들
클로드 코드는 코드베이스 작업을 위해 여러 도구를 씁니다. 셸 명령을 실행하는 Bash, 파일을 수정하는 Edit, 계획을 세우는 EnterPlanMode, 격리된 작업 공간을 만드는 EnterWorktree까지 종류가 꽤 다양합니다.

문제는 이 도구들이 전부 같은 위험도를 가지고 있지 않다는 점입니다. 파일을 읽는 것과 rm 명령을 실행하는 건 완전히 다른 이야기니까요. 그래서 클로드 코드는 도구 하나하나에 대해 개별적으로 허용 여부를 지정할 수 있게 되어 있습니다. 전체 도구 목록과 각 도구의 동작 방식은 공식 문서에 표로 정리되어 있으니 한 번쯤 훑어보는 걸 추천합니다.
/permissions로 설정 확인하기
가장 빠른 방법은 터미널에서 바로 확인하는 겁니다.
/permissions
이 명령어를 실행하면 Permissions / Recently denied / Allow / Ask / Deny / Workspace 탭으로 나뉜 UI가 뜹니다. 여기서 지금 어떤 규칙이 어느 settings.json에서 왔는지까지 한눈에 볼 수 있습니다.
동작 원리는 생각보다 단순합니다.

- Allow — 클로드가 승인 없이 바로 실행
- Ask — 실행 전에 매번 확인
- Deny — 아예 실행 자체를 막음
그리고 이 셋 사이에는 우선순위가 있습니다. deny → ask → allow 순서로 평가되고, 그중 처음 일치하는 규칙이 결과를 결정합니다. 즉 어떤 규칙이 더 구체적이냐는 중요하지 않고, deny에 걸리면 allow에 아무리 넓게 열어둬도 소용없습니다.
settings.json으로 직접 설정하기
UI로 하나씩 추가해도 되지만, 결국 실제로 저장되는 곳은 settings.json입니다. 기본 골격은 이렇습니다.
{
"permissions": {
"allow": [],
"ask": [],
"deny": []
}
}
allow – 허용 목록
자동으로 실행되게 둘 작업들을 넣습니다.
| 규칙 | 설명 | 예시 |
|---|---|---|
Bash |
모든 bash 명령 허용 | "Bash" |
Bash(명령어) |
특정 명령만 허용 | "Bash(npm run lint)" |
Bash(패턴:*) |
패턴에 맞는 명령 허용 | "Bash(npm run test:*)" |
Read(경로) |
특정 경로 읽기 허용 | "Read(~/.zshrc)" |
Write(경로) |
특정 경로 쓰기 허용 | "Write(./dist/**)" |
deny – 거부 목록
여기 들어간 항목은 allow에 뭐가 있든 무조건 차단됩니다. 그래서 민감한 파일이나 위험한 명령은 반드시 여기 넣어야 합니다.
"deny": [
"Bash(curl:*)",
"Bash(rm:*)",
"Read(./.env)",
"Read(./.env.*)",
"Read(./secrets/**)",
"Write(./config/prod.*)"
]
패턴 매칭 규칙
와일드카드 문법은 두 가지만 기억하면 됩니다.
| 패턴 | 의미 | 매칭 예시 |
|---|---|---|
* |
단일 레벨 | test:* → test:unit, test:e2e |
** |
다중 레벨(경로 전체) | secrets/** → secrets/api/key.json |
:* |
명령 인수 전체 | curl:* → curl https://... |
실전에서는 이렇게 씁니다
개발 환경용 설정
일상적인 개발 작업에서 자주 쓰는 조합입니다.
{
"permissions": {
"allow": [
"Bash(npm run *)",
"Bash(git status)",
"Read(./src/**)",
"Write(./src/**)"
],
"deny": [
"Bash(curl:*)",
"Bash(rm:*)",
"Read(./.env*)",
"Read(./secrets/**)",
"Write(./package.json)"
]
}
}
npm 스크립트나 src 폴더 작업은 자유롭게 허용하되, 외부 요청·삭제·환경변수·package.json처럼 사고 나면 골치 아픈 부분은 확실히 막아두는 구조입니다.
보안을 더 빡빡하게 가져가고 싶을 때
반대로 테스트 실행이나 특정 문서 읽기 정도만 열어두고, 나머지는 전부 물어보거나 차단하는 방식도 가능합니다.
{
"permissions": {
"allow": [
"Bash(npm run test)",
"Read(./README.md)"
],
"ask": [
"Bash(git push:*)",
"Write(./src/**)"
],
"deny": [
"Bash",
"Read(./.env*)",
"WebFetch"
]
}
}
git push나 소스 수정처럼 되돌리기 번거로운 작업은 ask로 빼두고, 나머지 bash 명령과 외부 웹 접근은 통째로 막아버리는 방식입니다. 신뢰도가 낮은 프로젝트나 처음 써보는 환경이라면 이 정도로 시작하는 게 안전합니다.
설정할 때 놓치기 쉬운 것들
- Bash 패턴은 접두사 매칭 방식이라
curl:*처럼 막아도 완전히 우회가 불가능한 건 아닙니다. 100% 안전을 보장하는 장치는 아니라는 점을 기억해두세요. - deny는 항상 allow보다 우선합니다. allow에 넣었다고 안심하지 말고 deny 목록부터 점검하는 습관이 필요합니다.
.env,secrets/같은 민감 정보 경로는 예외 없이 deny에 넣는 게 맞습니다.- 처음부터 다 열어주기보다, 필요한 만큼만 allow에 추가하는 최소 권한 원칙을 지키는 게 결국 제일 편합니다.
프로젝트 밖 디렉토리도 접근하게 하려면
기본적으로 클로드는 실행한 프로젝트 폴더 안에서만 움직입니다. 하지만 문서 폴더가 따로 분리되어 있거나 공용 설정 디렉토리를 참조해야 하는 경우도 있죠. 이럴 땐 additionalDirectories로 접근 범위를 넓혀줄 수 있습니다.
{
"permissions": {
"additionalDirectories": [
"../docs/",
"~/config/",
"/usr/local/templates/"
]
}
}
상대 경로, 홈 디렉토리, 절대 경로 전부 지정 가능하니 프로젝트 구조에 맞게 골라 쓰면 됩니다.
권한 관리는 한 번 세팅해두면 그다음부터는 크게 신경 쓸 일이 없습니다. 다만 처음 설정할 때 deny 목록만큼은 꼼꼼히 챙겨두는 게 나중에 마음 편합니다. /permissions 명령어로 현재 상태를 자주 들여다보는 습관을 들이는 것도 도움이 됩니다.
참고
- [공식문서] 도구 참조 — https://code.claude.com/docs/ko/tools-reference
- [공식문서] 권한 관리 — https://code.claude.com/docs/ko/permissions
'AI > Claude Code' 카테고리의 다른 글
| 클로드 코드 권한 모드, 상황에 맞게 골라 쓰고 있나요 (0) | 2026.07.30 |
|---|
