티스토리 뷰

Claude Code Permission이 작동하지 않는 이유: :* vs * 패턴 문제

TL;DR

Claude Code의 .claude/settings.local.json에서 Bash 허용 규칙을 Bash(docker run:*)으로 설정했는데도 매번 permission 팝업이 뜬다면, :* 형식이 deprecated되었기 때문일 수 있다. Bash(docker run *)(공백 + 별표)으로 바꾸면 해결된다.


문제 상황

Claude Code로 Docker 기반 C++ 프로젝트를 개발하면서, docker run 명령이 매우 빈번하게 실행된다. 매번 permission 팝업이 뜨면 워크플로우가 끊기므로, "Allow always"를 눌러서 자동 허용 규칙을 추가해놨다.

그런데 규칙을 추가했는데도 계속 물어본다.

Bash command

  docker run --rm -v "$(pwd)":/app video-bench-dev bash -c "cd /app/build && cmake .. && make -j4" 2>&1
  Rebuild with all_claimed optimization

Do you want to proceed?
❯ 1. Yes
  2. No

원인 분석

설정 파일 확인

.claude/settings.local.json을 열어보면 이런 규칙들이 있었다:

{
  "permissions": {
    "allow": [
      "Bash(docker build:*)",
      "Bash(docker run:*)",
      "Bash(docker stop:*)",
      "Bash(docker:*)",
      "Bash(git stash push:*)",
      "Bash(git add:*)"
    ]
  }
}

Bash(docker run:*), 심지어 Bash(docker:*)까지 있는데 왜 매칭이 안 되는 걸까?

핵심: :* 패턴은 deprecated

Claude Code의 Bash permission 패턴 매칭 형식이 변경되었다:

형식 상태 예시
Bash(docker run:*) Deprecated - 매칭 안 될 수 있음 : 뒤에 *
Bash(docker run *) 현재 정상 형식 공백 뒤에 *

공백 + * 형식은 word boundary를 적용한다. 예를 들어:

  • Bash(ls *) - ls -la 매칭 O, lsof 매칭 X (공백이 경계 역할)
  • Bash(ls*) - ls -la 매칭 O, lsof도 매칭 O (경계 없음)

"Allow always"가 deprecated 형식으로 저장하는 문제

흥미롭게도, 이 :* 규칙들은 직접 작성한 게 아니다. Claude Code에서 permission 팝업이 뜰 때 "Allow always" 버튼을 누르면 자동 생성되는 규칙이다. 즉, Claude Code 자체가 deprecated 형식으로 규칙을 저장하고 있었다.


해결 방법

1. 패턴 형식 수정

.claude/settings.local.json에서 모든 :**(공백+별표)로 변경한다:

// Before (deprecated)
"Bash(docker run:*)"

// After (correct)
"Bash(docker run *)"

2. 중복 규칙 통합

개별 하위 명령어를 일일이 나열하는 대신, 상위 명령어 하나로 통합할 수 있다:

// Before - 6개 규칙
"Bash(docker build:*)",
"Bash(docker run:*)",
"Bash(docker stop:*)",
"Bash(docker rm:*)",
"Bash(docker ps:*)",
"Bash(docker images:*)"

// After - 1개 규칙
"Bash(docker *)"

3. 정리된 최종 설정

{
  "permissions": {
    "allow": [
      "Bash(docker *)",
      "Bash(git *)",
      "Bash(gh *)",
      "Bash(npm *)",
      "Bash(ffprobe *)",
      "Bash(ffmpeg *)",
      "Bash(ls *)",
      "Bash(find *)",
      "Bash(tree *)",
      "Bash(wc *)",
      "Bash(chmod *)",
      "Bash(brew *)",
      "WebSearch"
    ]
  }
}

4. 적용

설정 변경 후 새 대화를 시작해야 적용된다. /clear 또는 새 터미널 세션을 열면 된다.


교훈

  1. "Allow always"를 눌렀는데도 계속 물어보면 패턴 형식을 의심하라
  2. .claude/settings.local.json을 주기적으로 확인하고 정리하라 - 자동 생성되는 규칙이 쌓이면서 deprecated 형식이 섞일 수 있다
  3. 규칙은 가능한 상위 레벨로 통합하라 - docker build *, docker run *, docker stop *을 각각 쓰는 것보다 docker * 하나가 관리하기 편하다
  4. 보안과 편의 사이의 균형을 고려하라 - Bash(docker *)는 편하지만 모든 docker 명령을 허용한다. 프로젝트 특성에 맞게 범위를 조절하면 된다

환경 정보

  • Claude Code (CLI)
  • 2026년 2월 기준
  • macOS / Docker 기반 C++ 프로젝트
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2026/02   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
글 보관함