본문으로 건너뛰기

© 2026 Molayo

Qiita헤드라인2026. 05. 25. 12:12

Claude Code의 허가 프롬프트 피로를 hook으로 해소하기 — 안전한 자동 승인 설정법

요약

Claude Code 사용 시 발생하는 빈번한 허가 요청(permission fatigue)을 hook 기능을 통해 효율적으로 해결하는 방법을 소개합니다. 읽기 전용 명령어 등을 자동으로 승인하여 워크플로우를 개선하면서도, 차단 hook을 통해 보안성을 유지하는 전략을 다룹니다.

핵심 포인트

  • PreToolUse hook을 사용하여 안전한 명령어를 자동 승인 가능
  • 읽기 전용 명령어(ls, cat 등) 자동 승인으로 프롬프트 피로도 60~80% 감소
  • 명령어 성격에 따라 hook을 분리하여 세밀한 제어 가능
  • 차단(block) hook을 우선 배치하여 보안 사고 방지

Claude Code를 자율 모드(Autonomous mode)로 실행하고 있어도, 놀라울 정도로 빈번하게 허가를 요청받는다.

🔒 Bash: git log --oneline -5 — 허가하시겠습니까? [y/n]
🔒 Bash: ls src/ — 허가하시겠습니까? [y/n]
🔒 Bash: cat package.json — 허가하시겠습니까? [y/n]
...

읽기만 하는 명령어에 매번 y를 누른다. 1분에 10번. 1시간에 600번. 이것이 바로 「허가 프롬프트 피로(permission fatigue)」다.

단순히 피곤하기만 하다면 다행이다. 진짜 문제는 y를 누르는 습관이 들면, 위험한 명령어도 제대로 읽지 않고 승인해 버린다는 것이다. 안전을 위한 장치가 오히려 안전성을 떨어뜨리고 있다.

Claude Code의 hook 기능을 사용하면, 안전한 명령어만 자동으로 승인할 수 있다.

메커니즘은 간단하다:

  • Claude Code가 도구(tool)를 사용하기 직전에 PreToolUse hook이 발화한다.
  • hook 스크립트가 명령어의 내용을 확인한다.
  • 안전하다고 판단하면 exit 0 + 승인 JSON을 반환한다.
  • 위험한 명령어는 통과(exit 0만 수행) → 통상적인 허가 플로우로 진행된다.
Claude Code → PreToolUse hook → 안전한가? → YES → 자동 승인 (허가 프롬프트 없음)
→ NO → 통상적인 허가 프롬프트

가장 효과가 높은 방법은 cat, ls, grep, git status 등, 아무것도 변경하지 않는 명령어를 일괄적으로 자동 승인하는 것이다.

~/.claude/hooks/auto-approve-readonly.sh:

#!/bin/bash
COMMAND=$(cat | jq -r '.tool_input.command // empty' 2>/dev/null)
[ -z "$COMMAND" ] && exit 0
...

settings.json에 등록:

{
"hooks": {
"PreToolUse": [
...

이것만으로도 허가 프롬프트의 60~80%가 사라진다.

개발 워크플로우에서 빈번하게 실행되는 npm testnpm run build도 자동 승인하면 쾌적해진다.

~/.claude/hooks/auto-approve-build.sh:

#!/bin/bash
COMMAND=$(cat | jq -r '.tool_input.command // empty' 2>/dev/null)
[ -z "$COMMAND" ] && exit 0
...

읽기 계열과 분리하는 이유는 입도(granularity)의 제어 때문이다. 프로젝트에 따라서는 npm run build가 외부 리소스에 액세스하거나 파일을 대량으로 생성하기도 한다. 그런 프로젝트에서는 빌드 계열 hook만 제외하면 된다.

Claude Code의 EditWrite 도구도 허가를 요청한다. src/ 하위의 파일 조작만을 자동 승인하는 hook:

~/.claude/hooks/auto-approve-project-edit.sh:

#!/bin/bash
INPUT=$(cat)
TOOL=$(echo "$INPUT" | jq -r '.tool_name // empty' 2>/dev/null)
...

settings.json에서는 matcher를 변경하여 등록한다:

{
"matcher": "Edit|Write",
"hooks": [{
...

자동 승인만 하는 것은 위험하다. 차단(block) hook을 먼저 배치하여 위험한 조작은 확실히 멈춰야 한다.

Claude Code의 hook은 배열 순서대로 평가된다. 차단("decision":"block")이 반환되면, 후속 자동 승인 hook은 실행되지 않는다.

1. 차단 hook: rm -rf, git push --force, git reset --hard → 즉시 차단
2. 자동 승인 hook: cat, ls, git log → 자동 승인
3. 둘 다 해당하지 않음 → 통상적인 허가 프롬프트

차단 hook의 예 ~/.claude/hooks/block-destructive.sh:

#!/bin/bash
COMMAND=$(cat | jq -r '.tool_input.command // empty' 2>/dev/null)
[ -z "$COMMAND" ] && exit 0
...

읽기 자동 승인 + 빌드 자동 승인 + 파괴적 명령 차단을 조합한 완전한 설정:

{
"hooks": {
"PreToolUse": [
...
순서hook역할
1block-destructiverm -rf /, git push --force 차단
2auto-approve-readonlycat, ls, git log 자동 승인
3auto-approve-buildnpm test, pytest 자동 승인
4auto-approve-project-editsrc/ 하위의 Edit/Write 자동 승인

차단이 최우선입니다. 자동 승인은 그 다음입니다. 둘 다 해당하지 않는 명령은 기존 방식대로 허가 프롬프트가 표시됩니다.

여기서 소개한 패턴은 모두 cc-safe-setup에 포함되어 있습니다.

npx cc-safe-setup@latest

446개의 hook 템플릿(6,099개 테스트 완료) 중에서 선택하여 설치할 수 있습니다:

auto-approve-readonly.sh

— 읽기 계열 명령 일괄 자동 승인 -
auto-approve-git-read.sh

— git 읽기 명령 특화 (-C 플래그 대응) -
auto-approve-build.sh

— 빌드·테스트·lint 계열 -
auto-approve-test.sh

— 테스트 러너 (Test Runner) 특화 (Jest, pytest, cargo test, go test, PHPUnit, RSpec, JUnit, dotnet test) -
auto-mode-safe-commands.sh

— Auto Mode의 오탐지 (False Positive) 방지 대책

또한, hook의 메커니즘을 체계적으로 배우고 싶은 분들은 Zenn Book의 「Claude Code의 안전 운용 가이드」도 참고가 될 것입니다.

할 일효과
읽기 계열 hook 추가허가 프롬프트 60~80% 감소
...

「y를 누르는 습관」을 만들지 마세요. 안전한 것은 자동으로 통과시키고, 위험한 것만 인간이 판단하는 것. 그것이 hook의 올바른 사용법입니다.

AI 자동 생성 콘텐츠

본 콘텐츠는 Qiita AI의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.

원문 바로가기
0

댓글

0