CPN 한국어 자습서 · Claude Code in Action
3 · 훅과 SDK
Gotchas around hooks
훅은 강력한 만큼 보안 함정도 있습니다. Claude Code 문서가 권하는 다섯 가지 안전 수칙을 짚고, 그중 절대 경로 권장이 만드는 공유 문제와 그 해법($PWD 자리표시자 + init-claude.js)을 살펴봅니다. 본 레슨은 자막이 없어 강의 스크린샷에서 내용을 추출했습니다.
이 장에서 배우는 것What you'll learn
약 3분훅 작성 시 입력을 절대 맹신하지 않기
셸 변수는 항상 따옴표 — "$VAR"
.. 경로 탐색(path traversal) 차단
스크립트는 절대 경로로 지정
.env·.git/·키 등 민감 파일은 건너뛰기
절대 경로의 공유 문제 → $PWD + init-claude.js
..로 상위 디렉터리를 거슬러 올라가 의도 밖 파일에 접근하는 공격. 막아야 한다./home/.../hooks/x.js처럼 루트부터의 전체 경로. 상대 경로보다 가로채기에 안전.npm run setup 때 도는 스크립트. $PWD를 실제 경로로 바꿔 settings.local.json을 만든다.앞서 npm run setup 뒤 .claude 디렉터리에 settings.json 파일이 둘 생긴 걸 눈치챘을 수 있습니다. Claude Code 문서는 훅 보안에 관해 다섯 가지를 권합니다. 항목을 눌러 펼치고 확인하세요.
훅에 들어오는 데이터를 절대 맹신하지 않습니다. 파일 경로·도구 입력을 항상 검사하고 정제한 뒤 사용합니다.
셸에서 변수를 쓸 땐 "$VAR"처럼 따옴표로 감쌉니다. $VAR로 두면 공백·특수문자로 의도치 않은 동작이 생길 수 있습니다.
파일 경로에 ..가 있는지 확인합니다. 상위 디렉터리를 거슬러 올라가 의도 밖 파일에 닿는 것을 막습니다.
훅 스크립트 경로는 전체(절대) 경로로 지정합니다. 경로 가로채기(path interception)와 바이너리 심기(binary planting) 공격을 줄여 줍니다.
.env·.git/·키 파일 등 민감한 대상은 다루지 않도록 합니다. 앞서 만든 .env 차단 훅이 그 예입니다.
확인함 0 / 5
권장 사항 중 하나가 바로 절대 경로 사용입니다. 경로 가로채기와 바이너리 심기 공격을 줄여 주죠. 그런데 이게 공유를 어렵게 만듭니다 — 내 컴퓨터의 절대 경로는 동료의 경로와 다르기 때문입니다.
안전을 위해 절대 경로를 쓰면, 그 경로는 내 컴퓨터에만 맞습니다. 그대로 커밋해 공유하면 동료의 경로와 달라 동작하지 않습니다.
/Users/grider/code/queries공유용 settings.example.json엔 $PWD 표식만 둡니다. npm run setup이 init-claude.js로 이를 실제 경로로 바꿔 settings.local.json을 만듭니다.
이 문제를 풀기 위해, 프로젝트엔 settings.example.json 파일을 둡니다. 그 안의 명령은 $PWD 자리표시자를 담습니다. npm run setup을 돌리면 함께 설치된 init-claude.js가 $PWD를 프로젝트의 실제 절대 경로로 바꿔 settings.local.json에 씁니다.
// settings.example.json (공유·커밋되는 파일) { "hooks": { "PreToolUse": [ { "matcher": "Read|Grep", "hooks": [ { "type": "command", "command": "node $PWD/hooks/read_hook.js" // 자리표시자 } ] } ] } }
$ npm run setup # npm install && node ./scripts/init-claude.js added 170 packages ✓ Successfully created .claude/settings.local.json Replaced $PWD with: /Users/you/code/queries $ # 이제 절대 경로지만, 공유 파일은 그대로 일반적
공유되는 설정 파일은 일반적인 채로 두면서, 각자의 컴퓨터에서는 권장대로 절대 경로를 쓰게 됩니다. 두 마리 토끼를 잡는 셈입니다.
.. 차단 · 절대 경로 · 민감 파일 회피.settings.example.json에 $PWD 자리표시자를 둔다.npm run setup의 init-claude.js가 $PWD를 실제 경로로 치환해 settings.local.json 생성.Q1훅에서 셸 변수를 안전하게 쓰는 방법은?
따옴표로 감싸지 않으면 공백·특수문자로 의도치 않은 동작이 생길 수 있습니다.
Q2절대 경로를 쓰면 생기는 공유 문제는?
내 컴퓨터의 절대 경로는 동료의 경로와 다릅니다. 그래서 $PWD 자리표시자가 필요합니다.
Q3settings.example.json의 $PWD는 언제 실제 경로로 바뀌나요?
setup 스크립트가 $PWD를 프로젝트의 실제 절대 경로로 바꿔 settings.local.json을 만듭니다.
함정을 알았으니, 이제 실제로 쓸모 있는 훅을 만들어 봅니다 — 작업 흐름에 바로 녹일 수 있는 유용한 훅 예시입니다. → 유용한 훅
전 코스는 계속 무료입니다. 등록하면 이 코스의 남은 16개 레슨을 끝까지 읽을 수 있습니다.
이미 등록하셨다면 그때 쓰신 이메일을 넣어 주세요.