Claude Code HTTP Hooks: 웹앱으로 AI 에이전트 제어하기

Claude Code HTTP Hooks: 웹앱으로 AI 에이전트 제어하기

4분 읽기원문 보기
Claude CodeAI개발도구Hook웹앱

안녕하세요, Tom입니다.

Claude Code 쓰면서 "이 작업 승인 여부를 웹 대시보드에서 관리할 수 있으면 좋겠는데..."라고 생각해본 적 있으세요?

이제 가능합니다. Claude Code에 HTTP Hook 기능이 추가되었습니다.

HTTP Hook이 뭔가요?

기존 **커맨드 훅(Command Hook)**은 강력하지만 복잡했습니다:

  • 쉘 스크립트 작성 필요
  • 보안 관리 까다로움
  • 상태 공유 어려움

HTTP Hook은 이걸 완전히 바꿉니다:

Claude Code 이벤트 발생
  ↓
HTTP POST → 웹 서버 (localhost도 가능)
  ↓
웹 서버가 응답 (승인/거부/수정)
  ↓
Claude Code가 응답에 따라 행동

왜 이게 중요한가?

1. 웹앱으로 제어 가능

// Express.js 예시
app.post('/claude-hook', (req, res) => {
  const { event, context } = req.body;
  
  if (event.type === 'file_write') {
    // 파일 쓰기 승인 여부를 웹 대시보드에서 확인
    if (isDangerousPath(event.path)) {
      res.json({ approved: false, reason: 'Sensitive file' });
    } else {
      res.json({ approved: true });
    }
  }
});

이제 브라우저에서 실시간으로:

  • Claude Code가 뭘 하려는지 확인
  • 승인/거부 버튼 클릭
  • 로그 확인 및 저장

2. 팀 단위 권한 관리

데이터베이스 ←→ 웹 서버 ←→ Claude Code
  • 중앙 DB로 권한 관리: 누가 어떤 작업을 승인했는지 추적
  • 팀원과 공유: 같은 웹앱으로 여러 Claude Code 인스턴스 제어
  • 감사 기록: 모든 이벤트를 DB에 저장

3. 복잡한 로직도 쉽게

쉘 스크립트로는 어려웠던 것들:

  • ❌ REST API 호출
  • ❌ 데이터베이스 쿼리
  • ❌ 복잡한 조건문
  • ❌ 실시간 알림

웹 서버에서는:

  • ✅ 모든 npm 패키지 사용 가능
  • ✅ Prisma, TypeORM 등으로 DB 연동
  • ✅ TypeScript로 타입 안전하게
  • ✅ Slack/Discord 웹훅 바로 연동

실전 활용 예시

예시 1: 민감한 파일 보호

// hooks/file-protection.ts
const PROTECTED_PATHS = [
  '.env',
  'secrets/',
  'config/production.yml'
];
 
app.post('/hook', async (req, res) => {
  if (req.body.event.type === 'file_write') {
    const path = req.body.event.path;
    
    if (PROTECTED_PATHS.some(p => path.includes(p))) {
      // Slack으로 알림 전송
      await slackNotify({
        text: `⚠️ Claude Code가 민감한 파일 수정 시도: ${path}`,
        channel: '#security'
      });
      
      return res.json({
        approved: false,
        message: '민감한 파일은 수동 승인이 필요합니다.'
      });
    }
  }
  
  res.json({ approved: true });
});

예시 2: 비용 관리

// hooks/cost-tracking.ts
app.post('/hook', async (req, res) => {
  const { event, context } = req.body;
  
  // API 호출 비용 추적
  if (event.type === 'api_call') {
    const cost = estimateCost(event.model, event.tokens);
    
    await db.usage.create({
      data: {
        userId: context.user,
        model: event.model,
        tokens: event.tokens,
        cost: cost
      }
    });
    
    // 일일 한도 체크
    const todayTotal = await db.usage.sum({ where: { 
      userId: context.user,
      date: new Date()
    }});
    
    if (todayTotal > DAILY_LIMIT) {
      return res.json({
        approved: false,
        message: '오늘 일일 한도를 초과했습니다.'
      });
    }
  }
  
  res.json({ approved: true });
});

예시 3: 작업 승인 대시보드

// 실시간 승인 대시보드
app.get('/dashboard', (req, res) => {
  res.render('dashboard', {
    pendingActions: await getPendingActions()
  });
});
 
// 웹소켓으로 실시간 이벤트 전송
io.on('connection', (socket) => {
  socket.on('approve', async (eventId) => {
    await approveEvent(eventId);
    io.emit('event_approved', eventId);
  });
});

로컬호스트도 가능!

가장 좋은 점:

# 1. 로컬에서 웹 서버 실행
npm run dev  # http://localhost:3000
 
# 2. Claude Code 설정
claude-code --http-hook=http://localhost:3000/hook

외부 서버 필요 없음. 개발 머신에서 바로 테스트 가능합니다.

기존 커맨드 훅과 비교

기능커맨드 훅HTTP 훅
설정 난이도높음 (스크립트)낮음 (웹 API)
복잡한 로직어려움쉬움
팀 공유어려움쉬움
실시간 대시보드불가능가능
보안 관리복잡함명확함 (HTTP)
디버깅어려움쉬움 (로그/UI)

시작하기

  1. 공식 문서 확인
    Claude Code Hooks Reference

  2. 간단한 서버로 시작

    import express from 'express';
     
    const app = express();
    app.use(express.json());
     
    app.post('/hook', (req, res) => {
      console.log('Event:', req.body);
      res.json({ approved: true });
    });
     
    app.listen(3000);
  3. Claude Code 연결

    claude-code --http-hook=http://localhost:3000/hook

마무리하며

HTTP Hook는 Claude Code를 **"혼자 쓰는 도구"에서 "팀이 관리하는 인프라"**로 바꿔줍니다.

특히:

  • 민감한 작업이 많은 프로덕션 환경
  • 여러 사람이 Claude Code를 쓰는 팀
  • 승인 프로세스가 필요한 조직

에서 정말 유용할 것 같습니다.

여러분은 어떤 Hook을 만들어보고 싶으신가요?


이 글은 Geeknews에서 발견한 내용을 정리한 것입니다. 원본은 여기에서 확인할 수 있습니다.