비중이 가장 작은 스킬이지만 개념은 분명합니다. 이 수업에서는 훅이 무엇을 보장하고 무엇을 보장하지 못하는지, 어느 시점에 무엇을 할 수 있는지를 다룹니다.
훅이 필요한 이유
프롬프트로 부탁한 것은 대체로 지켜지지만 항상은 아닙니다. 반드시 지켜져야 하는 것은 코드로 강제해야 합니다.
훅은 정해진 시점에 실행되는 코드입니다. 조건이 맞으면 언제나 실행되고, 모델의 판단이 개입하지 않습니다.
프롬프트: "운영 DB에는 접근하지 마세요" → 대체로 지켜짐, 보장 없음
훅: 실행 직전에 대상을 검사해 거부 → 조건이 맞으면 항상 차단
이 차이가 훅의 존재 이유 전부입니다. 시험에서는 둘을 같은 수준의 통제로 놓는 선택지가 오답으로 나옵니다.
시점과 할 수 있는 일
Claude Code에서는 여러 시점에 훅을 걸 수 있습니다. 대표적인 것들입니다.
- 도구 실행 전(
PreToolUse) — 검사하고 차단할 수 있습니다. 막아야 하는 일은 반드시 여기입니다. - 도구 실행 후(
PostToolUse) — 결과를 보고 기록하거나 후처리합니다. 이미 실행된 뒤라 막을 수 없습니다. - 세션 시작(
SessionStart) — 초기 상태를 준비합니다. - 종료(
Stop) — 정리 작업을 합니다.
차단은 실행 전 시점에서만 가능하다는 것이 핵심입니다. 파괴적 명령을 실행 후 시점에서 잡으려는 구성은 이미 벌어진 일을 기록할 뿐입니다.
def pre_tool_use(tool_name, tool_input):
if tool_name == "run_shell":
cmd = tool_input.get("command", "")
if any(p in cmd for p in DANGEROUS_PATTERNS):
return {"deny": True, "reason": "파괴적 명령으로 판단되어 차단했습니다"}
return {"deny": False}
차단할 때 이유를 함께 돌려주는 것이 중요합니다. 그래야 모델이 다른 방법을 찾습니다. 이유 없이 막으면 같은 시도를 반복합니다.
훅으로 할 수 없는 것
훅은 조건과 동작을 코드로 적을 수 있는 일에만 씁니다. 그렇지 않은 요구는 대상이 아닙니다.
- "답변을 더 정확하게 만들어라" → 조건을 코드로 적을 수 없습니다.
- "맥락에 맞게 판단하라" → 판단 자체가 모델의 몫입니다.
- "위험해 보이면 막아라" → "위험해 보임"을 코드로 정의해야 훅이 됩니다.
세 번째가 실무에서 자주 부딪히는 지점입니다. 막고 싶은 것을 구체적인 패턴이나 대상 목록으로 정의할 수 있어야 훅이 됩니다. 정의할 수 없다면 다른 수단 — 권한 축소나 사람 승인 — 을 써야 합니다.
또 하나, 훅은 자기가 아는 시점에서만 동작합니다. 훅이 걸리지 않는 경로로 같은 일이 벌어질 수 있다면 그 경로도 함께 막아야 합니다. 도구 실행을 막아 두고 다른 통로로 셸을 쓸 수 있다면 방어가 완성되지 않습니다.
감사 기록
차단만이 훅의 용도는 아닙니다. 무슨 일이 있었는지 남기는 것도 중요한 쓰임입니다.
def post_tool_use(tool_name, tool_input, result):
audit.write({
"ts": now(),
"tool": tool_name,
"args_hash": sha1(json.dumps(tool_input, sort_keys=True))[:12],
"ok": not result.get("is_error"),
})
기록에서 챙길 점이 있습니다. 인자 원문을 그대로 남기면 그 로그가 유출 경로가 될 수 있습니다. 해시나 요약으로 남기고, 필요할 때만 상세 기록을 켜는 편이 안전합니다.
차단된 시도도 기록해야 합니다. 무엇이 얼마나 자주 막히는지 보면, 권한 설정이 과한지 부족한지 판단할 수 있습니다. 매일 같은 것이 막히고 있다면 그 작업을 안전하게 할 방법을 따로 만들어 줘야 한다는 신호입니다.
시험 함정
- 훅과 프롬프트 지시를 같은 수준의 통제로 보는 선택지 — 훅만 결정적으로 실행됩니다.
- 실행 후 시점의 훅으로 파괴적 동작을 막는다는 구성 — 차단은 실행 전 시점에서만 가능합니다.
- 차단 시 이유를 돌려주지 않는 구현 — 모델이 같은 시도를 반복합니다.
- "위험해 보이면 막아라" 같은 요구를 그대로 훅으로 만들 수 있다는 서술 — 조건을 코드로 정의해야 합니다.
- 훅을 걸었으니 다른 경로도 함께 막힌다는 가정 — 훅이 걸리지 않는 통로는 별도로 막아야 합니다.
- 감사 로그에 인자 원문을 그대로 남기는 관행 — 로그 자체가 유출 경로가 됩니다.
실습 시나리오
실제 시험과 같은 형식의 시나리오 문제입니다.
에이전트가 실수로 운영 데이터를 삭제하는 일을 막으려 합니다. 가장 확실한 구성은 무엇입니까?
빌드 연습 · 차단 훅과 감사 기록 붙이기
약 25분1.차단 대상 정의
막아야 할 명령과 대상을 구체적인 패턴 목록으로 적습니다.
기대 결과 · 코드로 판정 가능한 조건이 됩니다.
2.실행 전 훅
패턴에 걸리면 거부하고 이유를 반환합니다.
기대 결과 · 차단 시 모델이 다른 접근을 시도합니다.
3.감사 기록
실행과 차단을 모두 기록하되 인자는 해시로 남깁니다.
기대 결과 · 원문 없이도 무슨 일이 있었는지 알 수 있습니다.
4.우회 경로 점검
같은 작업을 다른 도구로 할 수 있는지 확인합니다.
기대 결과 · 우회 가능한 경로가 발견되면 함께 막힙니다.
5.차단 빈도 확인
일정 기간 차단 기록을 세어 과한지 부족한지 판단합니다.
기대 결과 · 반복 차단되는 작업이 식별됩니다.