Claude Code의 토큰 낭비 문제를 해결했습니다: 유출된 소스 코드로 원인을 찾아 패치했습니다!
핵심 요약
Claude Code의 토큰 소모 버그를 분석해 해결책을 제시하고, 사용량 제한 문제를 정상화했습니다.
- 토큰 낭비 원인 — 세션 재개 시 캐시 관련 메시지를 삭제하는 db8 함수 버그로 인해 매번 전체 토큰을 다시 처리함
- 해결 방법 — Node.js 환경에서 실행하고 db8 함수에 캐시 관련 메시지 유형을 허용하는 패치 적용
- 보안 및 정책 논란 — 일부 사용자는 패치 스크립트에 포함된 구독 확인 우회 코드가 정책 위반이라고 지적함
- 커뮤니티 반응 — Anthropic의 코드 품질에 대한 비판과 함께, AI를 활용한 버그 수정 사례에 대해 긍정적이고 흥미로운 반응
https://github.com/Rangizingo/cc-cache-fix/tree/main
Disclaimer : Codex가 찾아서 고친 거지, 내가 한 게 아님. IT 업계 종사자라 질문을 어떻게 해야 할지는 알지만, 작업은 얘가 다 했음. 지난 2시간 동안 잘 돌아가길래 그냥 공유함. 5시간 사용량이 6%인데 이건 정상임! 어차피 다들 Claude한테 이 레포 복제해서 적용하라고 시킬 거 뻔하니까 그냥 레포 올림. 난 리눅스 쓰지만 Codex한테 OS 상관없이 돌아가게 짜달라고 했음. 내 맥에서도 잘 됨.
아래 내용은 전부 Codex가 쓴 거임, 내가 쓴 거 아님.
난 minified된 cli.js를 리버스 엔지니어링하면서 세션 재개 시 프롬프트 캐싱을 완전히 망가뜨리는 버그 두 개를 발견함.
실제로 무슨 일이 벌어지고 있나
Claude Code에는 세션 파일(~/.claude/projects/에 있는 JSONL 파일들)에 뭘 저장할지 필터링하는 db8이라는 함수가 있음. Anthropic 사용자가 아니면, 모든 attachment 타입 메시지를 삭제해버림. 별거 아닌 것 같지만, 그중에는 모델에게 어떤 툴을 이미 알렸는지 추적하는 deferred_tools_delta 레코드도 포함되어 있음.
세션을 재개하면 Claude Code는 메시지 기록을 스캔해서 "모델한테 어떤 툴을 알려줬지?"라고 확인함. 근데 db8이 세션 파일에서 그 레코드를 다 지워버렸으니 아무것도 못 찾음. 그래서 재개할 때마다 모든 deferred 툴을 처음부터 다시 알림. 매번. 재개할 때마다.
이게 캐시 프리픽스를 세 가지 방식으로 망가뜨림:
- 새 세션에서 messages[0]에 있던 시스템 리마인더가 messages[N]으로 밀려남
- 첫 번째 사용자 메시지 내용이 달라지니까 (첫 번째 메시지에서 계산되는) 빌링 해시가 바뀜
- 메시지 배열 길이가 달라지니까 cache_control 브레이크포인트가 어긋남
결과적으로 대화 전체가 cache_read를 타는 게 아니라 cache_creation 토큰으로 다시 빌드됨. 대화가 길어질수록 상황은 더 나빠짐.
내 실제 세션 데이터
순정 claude로 같은 대화를 하면서 턴마다 캐시 비율이 떨어지는 걸 지켜봄:
Turn 1: cache_read: 15,451 cache_creation: 7,473 ratio: 67%
Turn 5: cache_read: 15,451 cache_creation: 16,881 ratio: 48%
Turn 10: cache_read: 15,451 cache_creation: 35,006 ratio: 31%
Turn 15: cache_read: 15,451 cache_creation: 42,970 ratio: 26%
cache_read는 절대 안 변함. 15,451(시스템 프롬프트만)에 고정됨. 나머지는 전부 제값 내고 토큰 처리됨.
패치 적용 후:
Turn 1 (resume): cache_read: 7,208 cache_creation: 49,748 ratio: 13% (구조적 초기화라 예상됨)
Turn 2: cache_read: 56,956 cache_creation: 728 ratio: 99%
Turn 3: cache_read: 57,684 cache_creation: 611 ratio: 99%
26%에서 99%로. 이게 차이임.
버그가 하나 더 있음
독립형 바이너리(~/.local/share/claude/에 설치된 거)는 커스텀 Bun 포크를 쓰는데, 모든 나가는 API 요청에서 cch=00000이라는 센티넬 값을 다시 씀. 대화에 이 문자열이 포함되면 캐시 프리픽스가 깨짐. 바이너리 대신 Node.js(node cli.js)로 실행하면 이 문제는 완전히 사라짐.
관련 이슈: anthropics/claude-code#40524 및 anthropics/claude-code#34629
해결 방법 두 가지:


