Claude Code의 토큰 낭비 문제를 해결했습니다: 유출된 소스 코드로 원인을 찾아 패치했습니다!
Thanks to the leaked source code for Claude Code, I used Codex to find and patch the root cause of the insane token drain in Claude Code and patched it. Usage limits are back to normal for me!
핵심 요약
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

