클로드 코드 유출 소스코드 아키텍처 정밀 분석 - 브런치
[AI] claude code
|
|
📰 뉴스
#review
#분석
#소스코드
#아키텍처
#유출
#클로드
#ai 에이전트
#anthropic
#claude
#claude code
#보안
#소스코드 유출
#아키텍처 분석
원문 출처: [AI] claude code · Genesis Park에서 요약 및 분석
요약
2026년 3월 유출된 앤스로픽의 CLI 기반 AI 코딩 에이전트인 '클로드 코드'의 소스코드 아키텍처 분석 결과, 총 51만 줄, 2,041개 파일 규모의 정통 소프트웨어 엔지니어링 플랫폼으로 설계된 것으로 나타났습니다. 터미널 환경에서 웹 프론트엔드 수준의 UI를 구현하기 위해 React 기반의 Ink 라이브러리를 사용하고, 빠른 실행 속도와 빌드 시점 코드 제거를 위해 Bun 런타임을 채택한 것이 기술적 특징입니다. 특히 4만 6천 줄의 LLM 호출 중추 엔진과 3단계 컨텍스트 압축 시스템을 갖췄으며, 89개의 피처 플래그를 통해 멀티에이전트 조율이나 음성 입력 등 다양한 기능을 독립적으로 관리합니다. 이번 소스 유출 사례는 배포 과정에서 소스맵 제거를 철저히 검증해야 하는 소프트웨어 공급망 보안의 중요성을 여실히 보여줍니다.
본문
51만 줄의 코드가 보여주는 AI 에이전트의 현재와 미래 분석 대상: Claude Code 소스 스냅샷 (2026-03-31) 분석일: 2026-04-03 규모: 2,041개 파일, 512,664줄, 32MB — 00장 들어가기 전에 00-1. 분석 배경 2026년 3월 31일, 보안 연구자 Chaofan Shou가 Claude Code의 npm 배포 패키지에 포함된 소스맵(.map) 파일을 통해 원본 TypeScript 소스가 공개적으로 접근 가능한 상태임을 발견했다. Anthropic의 R2 스토리지 버킷에 난독화되지 않은 소스가 참조되어 있었다. 본 보고서는 해당 스냅샷의 아키텍처를 분석한 기술 문서이다. "소프트웨어 공급망 보안의 중요성을 보여주는 사례이다. 빌드 아티팩트(소스맵)가 프로덕션 배포에 포함되면, 소스코드 전체가 역추적 가능해진다. CI/CD 파이프라인에서 소스맵 제거를 반드시 검증해야 한다." 00-2. 분석 범위 총 파일 수는 2,041개이며, TypeScript 파일이 1,332개, TSX 파일이 552개, 기타가 157개다. 소스 코드는 총 512,664줄이고, 빈 줄과 주석을 제외하면 약 40만 줄로 추정된다. 전체 용량은 32MB이며 텍스트 파일만으로 구성되어 있다. 가장 큰 파일은 REPL.tsx로 896KB에 달하는 메인 대화 화면 전체이다. 빌드 시점 코드 제거를 위한 피처 플래그는 89개, AI가 실행하는 도구는 40종, 사용자 슬래시 명령은 101종이다. 00-3. Claude Code란? Claude Code는 Anthropic이 개발한 CLI 기반 AI 코딩 에이전트이다. 터미널에서 자연어로 대화하며 파일 편집, 명령 실행, 코드 검색, 웹 검색, 멀티에이전트 병렬 작업을 수행한다. VSCode와 JetBrains IDE 연동, MCP(Model Context Protocol) 서버 지원, 플러그인 시스템을 갖춘 완전한 소프트웨어 플랫폼이다. 단순한 CLI 도구가 아닌 이유는 규모에서 드러난다. 51만 줄이라는 코드 규모는 Linux 커널의 초기 버전이나 중형 웹 프레임워크 전체에 맞먹는다. 이것은 AI가 코딩을 돕는 '도구'가 아니라, AI가 직접 소프트웨어를 개발하는 '플랫폼'으로 설계되었음을 의미한다. "51만 줄 규모의 에이전트 시스템은 업계에서 공개된 것 중 가장 크다. 이는 AI 에이전트 개발이 단순한 프롬프트 엔지니어링이 아니라, 수백 명이 수년간 작업하는 정통 소프트웨어 엔지니어링임을 증명한다. 에이전트를 만드는 것과 에이전트 플랫폼을 만드는 것은 완전히 다른 차원의 문제이다." — 01장 기술 스택과 설계 철학 01-1. 기술 스택 런타임은 Bun을 사용한다. Node.js 대비 3~5배 빠른 시작 속도, 내장 번들러, feature flag 지원이 선택 이유다. 언어는 TypeScript의 strict 모드로, 51만 줄 규모의 코드베이스에서 정적 타입으로 안정성을 확보했다. 터미널 UI에는 React와 Ink를 사용한다. 컴포넌트 기반 UI를 터미널에서 렌더링하는 선언적 패러다임이다. CLI 파싱에는 Commander.js의 extra-typings 버전을, 스키마 검증에는 Zod v4를, 코드 검색에는 ripgrep을 사용한다. 프로토콜 층에서는 MCP SDK와 LSP를 통해 외부 도구 서버 및 언어 서버와 표준 연동한다. API는 Anthropic SDK를 사용하며, 인증은 OAuth 2.0, JWT, macOS Keychain의 다중 계층이다. 텔레메트리에 OpenTelemetry와 gRPC를, 피처 플래그에 GrowthBook을 사용하여 A/B 테스트 및 단계적 기능 롤아웃을 지원한다. 01-2. 터미널에서 React를 돌린다 Claude Code의 가장 독특한 설계 결정은 터미널 UI를 React 컴포넌트로 구축한 것이다. Ink 라이브러리가 React의 가상 DOM을 터미널 문자열로 렌더링한다. 흐름으로 보면 React 컴포넌트 트리가 Ink 렌더러를 거쳐 ANSI 이스케이프 시퀀스로 변환되고, 최종적으로 터미널에 출력된다. 이 접근법의 장점은 네 가지다. 389개의 UI 컴포넌트를 선언적으로 관리할 수 있고, 상태 관리에 React 훅을 활용하며(104개 커스텀 훅), 컴포넌트 재사용과 합성이 가능하고, 권한 다이얼로그 등 복잡한 UI를 JSX로 표현할 수 있다. "터미널에 React를 적용한 것은 관성적 사고를 깬 결정이다. 대부분의 CLI 도구는 문자열 출력에 의존하지만, Claude Code는 웹 프론트엔드 수준의 UI 복잡도를 터미널에서 달성했다. 이는 AI 에이전트의 터미널 인터페이스, 서버 관리 도구, 데이터 파이프라인 모니터링 등 터미널 기반 복잡 UI가 필요한 모든 도메인에 적용 가능한 패턴이다." 01-3. Bun의 빌드 시점 코드 제거 bun:bundle의 feature() 함수로 89개의 피처 플래그가 빌드 시점에 평가된다. 비활성 기능의 코드가 완전히 제거되어 배포 바이너리가 경량화된다. 비활성 코드의 import 체인까지 트리쉐이킹으로 제거되므로, 실험 기능이 프로덕션 바이너리의 크기나 보안에 영향을 주지 않는다. 발견된 89개 피처 플래그 중 주목할 것들을 정리하면 다음과 같다. PROACTIVE는 선제적 에이전트 행동, KAIROS는 백그라운드 에이전트 시스템, KAIROS_DREAM은 메모리 정리/통합(수면 중 꿈)이다. COORDINATOR_MODE는 멀티에이전트 조율, ULTRAPLAN은 고급 계획 모드, ULTRATHINK는 확장된 사고 모드이다. ANTI_DISTILLATION_CC는 모델 증류 방지 메커니즘이고, DAEMON은 데몬(백그라운드) 모드, VOICE_MODE는 음성 입력이다. BRIDGE_MODE는 IDE 브릿지, BUDDY는 동반 스프라이트 캐릭터, AGENT_TRIGGERS는 에이전트 트리거 시스템, WEB_BROWSER_TOOL은 웹 브라우저 도구이다. 01-4. 시작 최적화: 병렬 프리페치 main.tsx(804KB, 전체에서 두 번째로 큰 파일)의 시작 부분에서 무거운 모듈 import보다 먼저 사이드 이펙트를 실행한다. MDM 관리 설정 읽기(startMdmRawRead)와 macOS 키체인 비동기 프리페치(startKeychainPrefetch)가 나머지 약 135ms의 import와 병렬로 실행된다. OpenTelemetry, gRPC, GrowthBook 등 무거운 모듈은 동적 import()로 필요 시점에만 로드한다. "CLI 도구의 체감 성능에서 시작 시간은 결정적이다. 사용자는 100ms 이상이면 느리다고 느낀다. I/O 작업(키체인, 설정)을 CPU 작업(모듈 로드)과 중첩시키는 전략은 모든 CLI 도구, 마이크로서비스 콜드스타트, 서버리스 함수 최적화에 직접 적용 가능하다." — 02장 핵심 엔진 상세 분석 02-1. QueryEngine.ts — LLM 호출의 중추 (46,630줄) Claude Code에서 가장 중요한 단일 파일이다. 모든 LLM API 호출이 이 엔진을 거친다. 주요 책임은 Anthropic API에 메시지 전송 및 스트리밍 응답 처리, 도구 호출(tool use) 루프 관리, thinking 모드 제어, 재시도 로직(Rate limit, 네트워크 오류), 토큰 카운팅 및 비용 추적, 컨텍스트 윈도우 관리, 메모리 프롬프트 로드이다. 핵심 의존성을 보면, query.ts(68KB)가 API 쿼리 파이프라인을, cost-tracker.ts가 토큰 비용 계산을, Tool.ts(29KB)가 도구 타입 정의를, commands.ts(25KB)가 명령어 레지스트리를 담당한다. services/api/claude.ts가 Anthropic API 클라이언트이고, services/compact/가 컨텍스트 압축, memdir/가 영구 메모리를 관리한다. 하나의 파일이 46,000줄이라는 것은 일반적 설계 원칙에서는 권장하지 않는 규모이다. 그러나 스트리밍 응답 도중 도구가 호출되고, 도구 결과가 다시 스트림에 합류하는 복잡한 흐름을 여러 파일로 분리하면 상태 동기화 문제가 발생하기 때문에 현실적으로 유리한 구조이다. "AI 에이전트에서 LLM 호출 엔진은 단일 거대 파일로 유지하는 것이 실무적으로 유리할 수 있다. 도구 호출 루프, 스트리밍, 재시도, 토큰 관리가 긴밀하게 결합되어 있어, 분리하면 오히려 버그가 증가한다. 이는 트랜잭션 경계 안에서는 모놀리식이 더 안전하다는 원칙과 일맥상통한다." 02-2. Tool.ts — 도구 타입 시스템 (29,516줄) 모든 도구의 베이스 인터페이스를 정의한다. 각 도구가 구현해야 하는 계약을 보면, name과 description으로 도구를 식별하고, inputSchema(Zod 스키마)로 입력을 검증하며, permissionMode로 권한 모델을 정의한다. execute 함수가 실제 실행을 담당하고, renderProgress가 진행 UI를 React로 렌더링하며, validate가 사전 검증을 수행한다. 02-3. 컨텍스트 압축 시스템 대화가 길어지면 컨텍스트 윈도우를 초과한다. services/compact/ 디렉토리가 이를 해결한다. compact.ts(1,705줄)가 메인 압축 로직, sessionMemoryCompact.ts(630줄)가 세션 메모리 압축, microCompact.ts(530줄)가 마이크로 압축(경량), autoCompact.ts(351줄)가 자동 압축 트리거, prompt.ts(374줄)가 압축 프롬프트를 담당한다. 압축은 세 단계로 이루어진다. 첫째, Auto Compact가 토큰 한도 접근 시 자동 트리거된다. 둘째, Micro Compact가 API 레벨에서 경량 압축을 수행한다. 셋째, Full Compact가 전체 대화를 요약으로 교체한다. "3단계 컨텍스트 압축은 의료 기록 요약, 법률 문서 분석, 장기 프로젝트 관리 등 긴 컨텍스트가 필요한 모든 AI 애플리케이션에 참고할 수 있는 설계 패턴이다." — 03장 도구 시스템 정밀 분석 03-1. BashTool — 가장 복잡한 도구 (12,411줄, 18개 파일) 셸 명령 실행을 담당하며, 보안이 가장 중요한 도구이다. 파일별로 보면, BashTool.tsx(1,143줄)가 메인 실행 로직이다
Genesis Park 편집팀이 AI를 활용하여 작성한 분석입니다. 원문은 출처 링크를 통해 확인할 수 있습니다.
공유