Hook 과 Permission
Claude 행동 커스터마이즈와 안전 경계 설정
⏱ 예상 ~6분
01 · 읽기
Hook 은 Claude 워크플로의 특정 순간에 여러분의 코드를 실행할 수 있게 해줘요. 도구 실행 전? 편집 후? session 시작 시? 이 이벤트를 가로채서 여러분의 로직을 더할 수 있어요 — 자동 포매팅, 안전 점검, 알림, 커스텀 검증.
Permission 은 Claude가 무엇을 하도록 허용되는지 통제해요. 기본적으로 Claude 는 명령을 실행하거나 파일을 편집하기 전에 물어봐요. 하지만 안전한 동작 (예: npm test) 은 사전 승인하고, 위험한 것 (예: git push --force) 은 차단할 수 있어서, Claude가 일상 작업은 더 빨리 진행하면서 위험한 건 안전하게 유지해요.
💡 상상해 봐요Hook 은 생산 라인의 검사 지점 같아요. 각 스테이션에서 검사관 (여러분의 스크립트) 이 작업을 점검하고 통과 (exit 0) 시키거나 돌려보내요 (exit 2). Permission 은 보안 출입증 시스템 같아요 — 어떤 문은 항상 열려 있고 (파일 읽기), 어떤 문은 출입증 스캔이 필요하고 (명령), 어떤 문은 잠겨 있어요 (위험한 작업).
핵심 정리
- Hook: Claude 워크플로의 특정 순간에 여러분 코드 실행
- Permission: Claude가 할 수 있는 것과 할 수 없는 것 통제
- Hook 은 이벤트를 가로채고, permission 은 전체 규칙을 설정해요
- 함께 워크플로에 맞게 Claude를 커스터마이즈하고 보호해요
02 · 읽기
아래는 가장 유용한 hook 이벤트들이에요: - PreToolUse — Claude가 도구 (Read, Edit, Bash 등) 를 쓰기 전에 발동. 무엇을 하려는지 점검하고 차단할 수 있어요. - PostToolUse — 도구가 성공한 후 발동. 편집된 파일 자동 포매팅이나 변경 기록에 좋아요. - SessionStart — session 이 시작될 때 발동. context 리마인더 주입에 써요, 특히 압축 후에. - Notification — Claude가 주의를 필요로 할 때 발동. 데스크톱 알림에 좋아요. - Stop — Claude가 응답을 마칠 때 발동.
Hook 은 exit code 로 소통해요: exit 0 은 동작 허용, exit 2 는 차단 (stderr 의 에러 메시지가 Claude 의 피드백이 돼요).
핵심 정리
- PreToolUse: 도구 실행 전 점검, 선택적 차단
- PostToolUse: 도구 성공 후 반응 (자동 포매팅, 로깅)
- SessionStart: session 시작이나 압축 후 context 주입
- Exit 0 = 허용, Exit 2 = 차단 (stderr 가 피드백이 됨)
03 · 코드 예제
아래는 Claude가 파일을 편집한 후 자동 포매팅하는 PostToolUse hook 이에요. 프로젝트의 .claude/settings.json 에 살아요.
.claude/settings.json — 자동 포매팅 hook
{
"hooks": {
"PostToolUse": [{
"matcher": "Edit|Write",
"hooks": [{
"type": "command",
"command": "jq -r '.tool_input.file_path' | xargs npx prettier --write"
}]
}]
}
}
matcher 필드는 정규식으로 도구 이름을 매칭해요 — Edit|Write 는 이 hook 이 Edit 나 Write 도구 호출 후에 발동한다는 뜻이에요. 명령은 stdin 으로 JSON 을 받아서 도구 호출 디테일을 갖고, 파일 경로를 추출해서 Prettier 를 실행해요. Claude가 편집하는 모든 파일이 자동으로 포매팅돼요.
04 · 코드 예제
아래는 위험한 Bash 명령을 차단하는 PreToolUse hook 이에요.
.claude/hooks/protect.sh
#!/bin/bash
INPUT=$(cat)
CMD=$(echo "$INPUT" | jq -r '.tool_input.command')
if [[ "$CMD" =~ "rm -rf" ]]; then
echo "Blocked: rm -rf is not allowed" >&2
exit 2 # Block the action
fi
exit 0 # Allow everything else
.claude/settings.json
{
"hooks": {
"PreToolUse": [{
"matcher": "Bash",
"hooks": [{
"type": "command",
"command": ".claude/hooks/protect.sh"
}]
}]
}
}
이 hook 은 Claude가 실행하려는 모든 Bash 명령을 가로채요. stdin 에서 명령을 (JSON 으로) 읽고, 'rm -rf' 가 있는지 점검하고, exit code 2 로 차단해요. stderr 의 에러 메시지가 Claude에게 왜 차단됐는지 알려주고, Claude 는 제한을 수용해요.
05 · 읽기
Permission 은 스크립트를 작성하지 않고도 전체 허용/거부 규칙을 줘요. 와일드카드로 유연하게 매칭해요.
Allow 규칙 은 동작을 사전 승인해서 Claude가 묻지 않도록 해요: - Bash(npm run ) — 모든 npm script - Bash(git commit ) — 변경 commit - Read(*.env) — env 파일 읽기
Deny 규칙 은 동작을 완전히 차단해요: - Bash(git push --force ) — 강제 push 금지 - Edit(package-lock.json) — lockfile 건드리지 마 - Bash(rm -rf ) — 재귀 삭제 금지
Deny 규칙은 항상 allow 규칙을 이겨요. 설정은 가장 구체적인 것부터 가장 덜 구체적인 순으로 점검돼요: local project > project > user.
핵심 정리
- Allow 규칙: 안전한 동작 사전 승인 (permission prompt 없음)
- Deny 규칙: 동작 완전 차단
- 와일드카드: Bash(npm *) 는 모든 npm 명령에 매칭
- 충돌 시 Deny 가 항상 allow 를 이김
- 로컬 설정이 프로젝트를 덮어쓰고, 프로젝트가 사용자를 덮어써요
06 · 퀴즈
PreToolUse hook 이 Claude가 rm -rf /tmp/build 를 실행하려는 걸 감지했어요. 이 동작을 차단하려면 hook 스크립트가 어떤 exit code 를 반환해야 할까요?
- Exit code 0 — 성공
- Exit code 2 — 동작 차단
- Exit code 1 — 일반 에러
- Exit code 255 — 심각한 에러
07 · 짝짓기
각 hook 이벤트를 가장 잘 맞는 용도와 짝지어요.
(이 섹션은 인터랙티브해요 — JavaScript를 켜 주세요.)
⚠ 전체 인터랙티브 경험에는 JavaScript가 필요해요. JavaScript를 켜고 새로 고침해 주세요.
※ 이 사이트는 독립 운영되는 교육 프로젝트로, Anthropic의 공식 제품이 아니에요. Claude™ 는 Anthropic, PBC 의 상표예요.