본문으로 건너뛰기

© 2026 Molayo

Qiita헤드라인2026. 05. 22. 00:53

Claude Code에 1분 만에 도입하는 3가지 방어 hook, 90일간의 사고 보고 중 85%를 예방하는 조합

요약

Claude Code 사용 중 발생할 수 있는 데이터 및 파일 삭제 사고를 예방하기 위한 3가지 PreToolUse hook 도입 방법을 소개합니다. settings.json 설정만으로 rm, 데이터베이스 파괴, 미공개 작업 삭제 등의 위험 명령을 효과적으로 차단할 수 있습니다.

핵심 포인트

  • PreToolUse hook을 통해 Claude Code의 위험 명령 실행을 차단
  • rm -rf, DB 파괴, git 작업 삭제 등 주요 사고 사례 85% 예방
  • node_modules 등 예외 경로를 포함하여 개발 생산성 저해 방지
  • settings.json에 단 3줄의 설정만으로 1분 만에 도입 가능

최근 90일 동안, Claude Code가 이용자의 작업을 삭제하는 사고가 연속해서 보고되고 있다. rm -rf 폭주로 717GB가 사라진 사례, DROP DATABASE로 7.8GB의 데이터가 사라진 사례, 부작업자가 git checkout -- <files>로 주이용자의 미공개 편집 내용을 함께 삭제한 사례 등이 있다.

본 기사에서는 이러한 사고를 예방하는 3가지 PreToolUse hook을 settings.json에 3줄 추가하는 것만으로 1분 만에 도입하는 절차를 정리한다. cc-safe-setup의 751개 사례 중에서, 90일간의 사고 85%를 직접 예방할 수 있는 최소한의 3개를 선별했다.

도입 전후로 동일한 명령을 claude로 실행하여 차단 동작을 확인할 수 있다.

cc-safe-setup의 examples/에 있는 751개의 hook 중에서, 최근 90일간 발생한 130건의 사고 계통(복구 불가능한 bash 명령, 미공개 작업 삭제, 데이터베이스 파괴)을 모두 커버하는 최소한의 3개를 선별했다.

선별 조건은 다음 세 가지다.

  • 차단 대상이 명확하며, 이용자의 통상적인 운용을 방해하지 않는다.
  • 예외 경로(node_modules 등)가 내장되어 있어 즉시 도입할 수 있다.
  • 사고의 기원이 GitHub 이슈로 확인 가능하다.

첫 번째 hook은 rm-safety-net.sh (이전 이름은 destructive-guard.sh이며, 5월 11일에 개명됨)이다. 사고의 기원은 Reddit의 717GB 삭제 사례와, 이슈 56738 (24,472행의 SQL 삭제), 이슈 54912 (파일 시스템의 크기 구분 사고)이다.

rm -rfgit reset --hard 또는 git clean -fd 계통을 일괄적으로 차단한다. node_modulesdist, build, /tmp 안의 rm -rf는 허용하도록 판정이 내장되어 있어 통상적인 운용을 방해하지 않는다.

도입 절차: cc-safe-setupnpm을 통해 도입하면 ~/.claude/hooks/rm-safety-net.sh에 배치된다. ~/.claude/settings.jsonhooksPreToolUse 배열에, 일치 조건은 Bash, 명령은 $CC_HOOKS/rm-safety-net.sh로 하는 요소를 1개 추가한다.

도입 후, claude에서 rm -rf ~/Desktop 등의 명령을 실행하면 차단 메시지가 나타난다. 통상적인 rm -rf node_modules는 통과된다.

두 번째는 block-database-wipe.sh이다. 사고의 기원은 이슈 56738 (24,472행의 SQL 삭제)과 이슈 56255 (7.8GB의 PostGIS DROP DATABASE)이다.

7가지 계통의 데이터베이스 파괴 명령을 차단한다. Laravelmigrate:fresh, Djangoflush, Railsdb:drop, raw SQLDROP DATABASETRUNCATE, Symfonyschema:drop, Prismamigrate reset, PostgreSQLdropdb가 해당된다.

도입 절차는 첫 번째와 동일한 형식으로, 명령 경로를 $CC_HOOKS/block-database-wipe.sh로 교체하여 1줄을 추가한다.

claude에서 psql -c "DROP DATABASE production" 등을 실행하면 차단된다. 테스트 환경에서의 migrate:fresh는 환경 변수 CC_DB_TEST_ENV=1로 허용할 수 있다.

세 번째는 uncommitted-discard-guard.sh이다. 사고의 기원은 이슈 57463 (부작업자가 sed 복구를 위해 git checkout -- <files>를 실행하여 주이용자의 미공개 편집 내용을 함께 삭제한 사례)이다.

git checkout -- . 또는 git restore .

또는 git checkout -- <files>

를 통해 미공개 편집 내용을 버리는 명령을 차단한다. 해당 파일에 변경 사항이 없는 경우에는 허용하므로, 통상적인 운용을 방해하지 않는다.

도입 절차는 첫 번째와 두 번째와 동일한 형식으로, 명령의 경로를 $CC_HOOKS/uncommitted-discard-guard.sh로 교체하고 한 줄을 추가한다.

도입 후, claude의 부작업자(sub-worker)가 git checkout -- <files>로 미공개 편집 내용을 버리려고 하면 차단된다. 상위 사용자의 작업이 git stash list를 통해 복구할 수 있는 경로를 남겨둔다.

3가지 hook으로 최근 90일간 발생한 130건의 사고 계통 중, 되돌릴 수 없는 bash 명령(6건), 데이터베이스 파괴(2건), 미공개 작업 삭제(3건)를 포함한 총 약 110건(85퍼센트)을 직접 예방한다.

나머지 15퍼센트(파일 시스템의 대규모 사고, 홈 디렉토리 위치 삭제, gh 도구의 파괴 조작, 부작업자의 범위 초과)는 추가적인 11개의 hook으로 커버할 수 있다. 전체 14개 구성은 cc-safe-setup의 examples/에서 확인할 수 있다.

3가지 도입 후, claude에서 다음 명령들을 실행하여 차단 동작을 확인할 수 있다.

rm -rf /tmp/test-dir-does-not-exist는 통과됨 (/tmp는 허용 경로)

rm -rf ~/Desktop/test는 차단됨 (~/Desktop은 허용 경로가 아님)

psql -c "DROP DATABASE test"는 차단됨 (환경 변수 지정이 없음)

변경 사항이 있는 상태에서 git checkout -- README.md는 차단됨

차단 메시지는 표준 에러(stderr)로 출력된다. claude 본체는 차단 이유를 읽고 다른 경로를 제안한다.

cc-safe-setupnpm을 통해 도입한다. npx cc-safe-setup install을 실행하면 14개의 예시 hook이 ~/.claude/hooks/에 배치된다.

~/.claude/settings.jsonhooksPreToolUse 배열에 3개의 요소를 추가한다. 각 요소의 일치 조건은 Bash이며, 명령의 경로는 순서대로 $CC_HOOKS/rm-safety-net.sh, $CC_HOOKS/block-database-wipe.sh, $CC_HOOKS/uncommitted-discard-guard.sh 3개이다.

claude를 재시작한다. 이것으로 도입이 완료된다.

최근 90일간 연속적으로 발생한 Claude Code 사고의 85퍼센트는 3개의 PreToolUse hook으로 예방할 수 있다. cc-safe-setup의 751개 예시 중에서, 사고의 기원이 GitHub 이슈로 확인되는 최소한의 3개를 선별했다.

settings.json에 3줄만 추가하면 도입할 수 있으므로, 사용자의 운용 초기 단계에서 포함할 것을 권장한다.

3개로 커버할 수 없는 사고(파일 시스템의 대규모 사고, 홈 디렉토리 위치 삭제 등)에 대해서는 cc-safe-setup의 추가 11개 hook으로 대응한다. 전체 14개 구성은 본 기사의 후속편에서 정리할 예정이다.

AI 자동 생성 콘텐츠

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

원문 바로가기
0

댓글

0