2026년 3월 31일, Anthropic의 공식 CLI 도구인 Claude Code의 소스코드 전체가 인터넷에 풀렸습니다. TypeScript로 작성된 51만 줄, 파일 1,920개. 난독화도 안 된 원본 그대로입니다.
목차
- 어떻게 유출됐나
- 뭐가 들어있나
- 이 시리즈에서 다룰 것
어떻게 유출됐나
보안 연구원 Chaofan Shou(@Fried_rice)가 npm에 배포된 Claude Code 패키지에서 .map 파일을 발견했습니다. source map이란 빌드된 코드를 원본 소스에 매핑해주는 파일인데, Anthropic이 이걸 그대로 배포해버린 겁니다.
문제의 .map 파일은 약 57MB 크기였고, Anthropic의 R2 스토리지 버킷에서 zip으로 다운로드할 수 있었습니다. source map 안에는 빌드 전 원본 TypeScript 소스가 통째로 들어 있었고, 이를 추출하면 프로젝트 전체를 복원할 수 있었습니다.
빌드 스크립트를 보면 원인이 명확합니다.
scripts/build-bundle.ts에서 source map 생성 옵션을 확인할 수 있습니다.
// scripts/build-bundle.ts (line 112~113)
// Source maps for production debugging (external .map files)
sourcemap: noSourcemap ? false : 'external',
--no-sourcemap 플래그를 명시적으로 넣지 않으면 기본으로 external source map이 생성됩니다. 프로덕션 빌드에서 이 플래그를 빠뜨린 채 npm에 퍼블리시한 것으로 보입니다. 디버깅 편의를 위해 넣어둔 옵션이 보안 사고로 이어진 셈입니다.
뭐가 들어있나
유출된 소스의 규모부터 정리하면 이렇습니다.
| 항목 | 수치 |
|---|---|
| 전체 파일 수 | ~1,920개 |
| 코드 라인 수 | 512,000+ |
| 언어 | TypeScript (strict 모드) |
| 런타임 | Bun |
| 터미널 UI | React + Ink |
| CLI 파싱 | Commander.js |
| 스키마 검증 | Zod |
| API 클라이언트 | Anthropic SDK |
| 텔레메트리 | OpenTelemetry |
| 피처 플래그 | GrowthBook |
package.json을 보면 기술 스택의 윤곽이 바로 드러납니다.
// package.json (line 7~11)
"type": "module",
"main": "src/entrypoints/cli.tsx",
"bin": {
"claude": "src/entrypoints/cli.tsx"
},
진입점이 .tsx 파일입니다. CLI 도구인데 React를 쓴다는 뜻이고, 실제로 터미널 UI를 Ink(React 기반 터미널 렌더러)로 그리고 있습니다. 의존성 목록에 react, react-reconciler가 들어있는 것도 이 때문입니다.
tsconfig.json에서는 한 가지 흥미로운 설정이 있습니다.
// tsconfig.json (line 20~22)
"paths": {
"bun:bundle": ["./src/types/bun-bundle.d.ts"]
}
Bun 런타임의 번들러 전용 모듈인 bun:bundle에 대한 타입 매핑입니다. 이 모듈을 통해 빌드 타임에 피처 플래그를 주입하고, dead code elimination을 수행합니다. VOICE_MODE, PROACTIVE, BRIDGE_MODE 같은 플래그로 기능을 선택적으로 활성화하는 구조입니다.
빌드 파이프라인도 깔끔합니다. esbuild로 단일 .mjs 파일을 만들고, 코드 스플리팅 없이 하나로 번들링합니다. CLI 도구답게 #!/usr/bin/env node shebang을 배너로 삽입하고, MACRO.VERSION 같은 컴파일 타임 상수도 define으로 주입합니다.
이 시리즈에서 다룰 것
이 시리즈에서는 유출된 소스코드를 처음부터 끝까지 분석합니다. 총 19편으로 구성했고, 각 편에서 하나의 주제를 깊이 파고듭니다.
| Part | 주제 |
|---|---|
| 1 | 프로젝트 구조 분석 — 1,900개 파일의 디렉토리 구조 |
| 2 | 부팅 과정 — CLI 실행부터 첫 프롬프트까지 |
| 3 | 시스템 프롬프트 — Claude에게 주입되는 지시문 |
| 4 | 도구 시스템 — 40개 도구의 등록, 권한, 실행 |
| 5 | 권한 시스템 — 도구 실행 전 허가/거부 판단 |
| 6 | 쿼리 엔진 — 4.6만 줄짜리 LLM API 핵심 |
| 7 | 컨텍스트 수집 — 시스템 정보, 파일, 환경 |
| 8 | 슬래시 명령어 — /commit, /review 등 50개 명령 |
| 9 | 터미널 UI — React + Ink 렌더링 파이프라인 |
| 10 | MCP 통합 — Model Context Protocol 클라이언트 |
| 11 | IDE 브릿지 — VS Code, JetBrains 연동 |
| 12 | 멀티 에이전트 — AgentTool과 코디네이터 |
| 13 | 메모리와 컨텍스트 압축 — /compact와 메모리 추출 |
| 14 | 인증과 OAuth — 로그인 흐름과 JWT |
| 15 | 텔레메트리 — OpenTelemetry 계측 |
| 16 | 피처 플래그와 빌드 — GrowthBook, dead code 제거 |
| 17 | 플러그인과 스킬 — 확장 시스템 |
| 18 | 서버 모드와 원격 세션 |
| 19 | 설계 패턴 총정리 — 51만 줄에서 배우는 것들 |
각 편에서는 실제 소스코드를 발췌하면서, 왜 이렇게 설계했는지를 중심으로 분석합니다. 공식 문서에는 없는, 코드에서만 알 수 있는 내부 구현을 다룹니다.
Anthropic이 만든 AI 코딩 도구의 내부를 이렇게 자세히 들여다볼 수 있는 기회는 다시 오지 않을 수도 있습니다. 다음 편에서는 1,920개 파일이 어떤 원칙으로 정리되어 있는지, 프로젝트 구조부터 살펴봅니다.
다음 편 예고: [Claude Code 해부학 Part 1] 클로드 코드(Claude Code) 프로젝트 구조 분석 — 1,900개 파일은 어떻게 정리되어 있나
[Claude Code 해부학] 시리즈
- Part 1: 프로젝트 구조 분석
- Part 2: 부팅 과정 분석
- Part 3: 시스템 프롬프트 분석
'AI 코딩 에이전트' 카테고리의 다른 글
| Claude Code 부팅 과정 분석: 실행 후 0.5초 안에 벌어지는 일들 (해부학 Part 2) (0) | 2026.04.01 |
|---|---|
| Claude Code 프로젝트 구조 분석: 1,900개 파일의 지도 그리기 (해부학 Part 1) (2) | 2026.04.01 |
| Claude Code BashTool 분석: 도구 프롬프트가 500줄인 이유 (해부학 Part 7) (0) | 2026.04.01 |
| Notion AI로 회의록 자동 정리하는 방법 — 실제 사용 후기 (0) | 2026.03.31 |
| Claude Code vs Cursor vs Codex CLI, 2026년 AI 코딩 도구 비교 (0) | 2026.03.29 |
