본문 바로가기
일반IT/AI

💸 클로드 토큰, 이렇게 하면 60% 줄일 수 있습니다 — API 비용 최적화 완전 가이드

by gasbugs 2026. 3. 31.

매달 청구서를 보고 눈이 번쩍 뜨인다면, 당신은 혼자가 아닙니다.
토큰 낭비는 모두의 문제입니다.


🎯 이 글에서 다루는 것

  • 토큰이 정확히 어떻게 과금되는지 (인풋 vs 아웃풋의 차이)
  • 프롬프트 캐싱(Prompt Caching)으로 비용 90%까지 줄이는 방법
  • 모델 선택 전략 — Haiku vs Sonnet vs Opus 언제 쓸까
  • claude.ai 일반 사용자도 적용할 수 있는 실용 팁
  • API 개발자를 위한 코드 레벨 최적화 기법

📌 들어가며 — 왜 토큰 최적화가 중요한가

Claude API를 처음 쓰다 보면 이런 상황을 겪게 됩니다. 처음엔 괜찮았는데, 어느 순간 월 청구서가 예상보다 훨씬 크게 나옵니다.

원인을 추적해보면 대부분 패턴이 비슷합니다. 매 요청마다 같은 시스템 프롬프트를 반복 전송하거나, 대화가 길어질수록 이전 히스토리 전체를 재처리하거나, 간단한 작업에 비싼 Opus 모델을 쓰는 식이죠.

 

한 개발자의 실제 사례를 보면, 처음에 1,000토큰이었던 세션이 5번의 메시지 교환만으로 15,000토큰 이상으로 불어났습니다. 대화를 할 때마다 Claude는 새 질문만 처리하는 것이 아니라 이전 프롬프트, 이전 응답, 코드 스니펫, 맥락 정보 전부를 재처리하기 때문입니다. BSWEN

 

이 글에서는 이 문제를 체계적으로 해결하는 방법을 다룹니다.


🔍 토큰 비용 구조 먼저 이해하기

인풋 vs 아웃풋 — 어느 쪽이 더 비쌀까?

토큰 최적화에서 가장 먼저 알아야 할 핵심 사실이 있습니다.

 

아웃풋 토큰은 인풋 토큰 대비 5배 비쌉니다. Sonnet 4 기준으로, 불필요한 응답 500토큰은 낭비된 인풋 토큰 2,500개와 비용이 같습니다. 출력 길이를 최적화하는 것이 인풋을 줄이는 것보다 훨씬 큰 절감 효과를 냅니다. SitePoint

 

즉, "짧게 대답해줘" 한 마디가 생각보다 훨씬 강력한 비용 절감 방법입니다.

 

토큰 과금 구조 한눈에 보기

 

구분 설명 과금 단위
일반 인풋 매 요청마다 새로 처리 표준가
캐시 쓰기 캐시에 저장할 때 표준가 × 1.25 (5분)
캐시 읽기 캐시에서 불러올 때 표준가 × 0.1 (90% 절감!)
아웃풋 생성된 응답 표준가 × 5

💡 핵심 기법 1 — 프롬프트 캐싱 (Prompt Caching)

개념: "같은 내용을 왜 매번 다시 읽나요?"

프롬프트 캐싱의 개념은 단순합니다. 고정된 내용(시스템 프롬프트, 문서, 도구 정의 등)은 한 번만 처리하고, 이후 요청에서는 캐시된 결과를 재활용하는 방식입니다.

 

예를 들어, 하루에 수백 명의 사용자가 동일한 문서에 대해 질문을 던지는 시스템을 운영한다면, 매번 동일한 문서를 재처리하지 않고 캐시를 유지함으로써 입력 토큰 비용의 90%까지 절감할 수 있습니다. Brunch

 

API에서 캐싱 적용하는 법

import anthropic

client = anthropic.Anthropic()

# 시스템 프롬프트에 cache_control 추가
response = client.messages.create(
    model="claude-sonnet-4-6",
    max_tokens=1024,
    system=[
        {
            "type": "text",
            "text": "당신은 AWS 클라우드 전문가입니다. 아래는 프로젝트 문서입니다...\n\n[수천 토큰의 고정 문서]",
            # 👇 이 한 줄이 핵심!
            "cache_control": {"type": "ephemeral"}
        }
    ],
    messages=[
        {"role": "user", "content": "EC2 비용 최적화 방법을 알려주세요"}
    ]
)

# 사용량 확인
print(f"캐시 읽기 토큰: {response.usage.cache_read_input_tokens}")
print(f"캐시 쓰기 토큰: {response.usage.cache_creation_input_tokens}")

 

캐시 TTL (유효시간) 전략

 

Anthropic의 캐시는 기본적으로 비활성 5분 후 만료됩니다. 단, 캐시가 히트될 때마다 타이머가 리셋됩니다. 따라서 매 1~2분마다 메시지를 주고받는 활발한 코딩 세션에서는 캐시가 계속 유지됩니다. 반대로 5분 이상 입력이 없으면 캐시가 소멸되며, 다음 요청은 콜드 스타트(캐시 쓰기)가 됩니다. Claude Code Camp

 

1시간짜리 장기 캐시도 가능합니다:

# 1시간 캐시 (beta 헤더 필요)
import anthropic

client = anthropic.Anthropic(
    default_headers={"anthropic-beta": "extended-cache-ttl-2025-04-11"}
)

response = client.messages.create(
    model="claude-sonnet-4-6",
    max_tokens=1024,
    system=[
        {
            "type": "text",
            "text": "[대용량 고정 문서...]",
            "cache_control": {
                "type": "ephemeral",
                "ttl": "1h"  # 1시간 캐시
            }
        }
    ],
    messages=[{"role": "user", "content": "질문"}]
)

 

⚠️ 주의: 1시간 캐시는 쓰기 비용이 표준가의 2배입니다. 요청이 충분히 많은 경우에만 경제적입니다.


💡 핵심 기법 2 — 모델 선택 전략

모든 작업에 Opus를 쓰면 망합니다

일반적으로 80%의 작업에는 Sonnet으로 시작하고, 복잡한 아키텍처 결정이나 심층 분석이 필요할 때만 Opus로 전환하는 것이 권장됩니다. Claude Fast

 

모델 적합한 작업 상대적 비용
Haiku 분류, 간단한 Q&A, 키워드 추출 최저
Sonnet 코딩, 분석, 일반 작업 (대부분) 중간
Opus 복잡한 추론, 전략 수립 최고

실제 라우팅 패턴 예시

def route_request(task_type: str, complexity: str) -> str:
    """작업 복잡도에 따라 모델 자동 선택"""
    
    if task_type in ["classification", "simple_qa", "keyword_extraction"]:
        return "claude-haiku-4-5-20251001"  # 최저 비용
    
    elif complexity == "high" or task_type in ["architecture", "deep_analysis"]:
        return "claude-opus-4-6"  # 고품질 필요 시
    
    else:
        return "claude-sonnet-4-6"  # 기본값 (80% 케이스)

# 사용 예시
model = route_request(task_type="code_review", complexity="medium")
# → "claude-sonnet-4-6" 반환
```

---

## 💡 핵심 기법 3 — 출력 길이 제어

아웃풋 토큰이 5배 비싸다는 사실을 기억하시죠? 그래서 **응답 길이를 제어하는 것**이 비용 절감에 가장 직접적인 효과를 냅니다.

### ❌ 토큰 낭비형 프롬프트
```
"EC2 비용 최적화 방법을 알려주세요"
```

→ Claude가 장황한 설명, 배경 지식, 예시, 부연 설명을 모두 포함해 응답

### ✅ 토큰 절약형 프롬프트
```
"EC2 비용 최적화 방법을 3가지만, 각 50자 이내로 간결하게 알려주세요"

 

→ 딱 필요한 내용만 전달

명시적 길이 제약을 프롬프트에 추가하는 것만으로 토큰 사용량을 40%까지 줄였다는 사례도 있습니다. 핵심 원칙은 "Claude에게 뭘 원하는지 탐색하게 하지 말고, 원하는 것을 명확히 지정하라"는 것입니다. BSWEN

응답 형식 지정 팁

 
# 나쁜 예시
messages=[{"role": "user", "content": "이 코드 리뷰해줘"}]

# 좋은 예시
messages=[{
    "role": "user", 
    "content": """다음 코드를 리뷰해주세요. 
    형식: JSON으로만 응답
    {"issues": [...], "improvements": [...]}
    각 항목은 한 줄 이내로 작성"""
}]

💡 핵심 기법 4 — 컨텍스트 관리

대화가 길어질수록 비용이 선형으로 증가합니다

컨텍스트 누적이 토큰 소비의 주요 원인이며, 관리하지 않으면 200K 토큰 컨텍스트 창이 점점 채워지게 됩니다. DeepWiki

관련 없는 작업은 무조건 새 대화로

# Claude Code에서
/clear          # 현재 세션 초기화
/compact        # 대화 요약으로 컨텍스트 압축 (~50% 절감)
/cost           # 현재 토큰 사용량 확인

파일은 필요한 부분만 붙여넣기

# ❌ 500줄 전체 파일 붙여넣기
with open("app.py") as f:
    code = f.read()  # 500줄 = ~3,000 토큰 낭비

# ✅ 필요한 함수만 추출
# "calculate_cost 함수(라인 42-67)의 버그를 수정해주세요"

💡 핵심 기법 5 — Token-Efficient Tool Use (API 고급)

API를 직접 사용하는 개발자라면 이 기능이 특히 유용합니다.

 

Token-Efficient Tool Use 는 현재 Claude Sonnet 4.6과 Opus 4.6에서 사용 가능하며, 베타 헤더 token-efficient-tools-2025-02-19 를 추가하는 것만으로 즉시 적용됩니다. 에이전트 애플리케이션에서 이 최적화들을 조합하면 월 API 비용을 60~80% 줄일 수 있습니다. Claude Lab

# Token-Efficient Tool Use 활성화
curl https://api.anthropic.com/v1/messages \
  -H "content-type: application/json" \
  -H "x-api-key: $ANTHROPIC_API_KEY" \
  -H "anthropic-version: 2023-06-01" \
  -H "anthropic-beta: token-efficient-tools-2025-02-19" \  # 이 한 줄!
  -d '{
    "model": "claude-sonnet-4-6",
    "max_tokens": 1000,
    "tools": [...],
    "messages": [...]
  }'

💡 핵심 기법 6 — Batch API 활용

급하지 않은 대량 작업은 Batch API를 사용하면 50% 할인이 적용됩니다.

import anthropic

client = anthropic.Anthropic()

# 대량 요청을 배치로 처리
batch_requests = [
    {
        "custom_id": f"request-{i}",
        "params": {
            "model": "claude-haiku-4-5-20251001",
            "max_tokens": 100,
            "messages": [{"role": "user", "content": f"텍스트 {i} 분류해줘"}]
        }
    }
    for i in range(100)
]

# 배치 생성 (24시간 내 처리, 50% 할인)
batch = client.messages.batches.create(requests=batch_requests)
print(f"배치 ID: {batch.id}")

⚠️ 흔한 실수 & 주의사항

캐시를 깨뜨리는 행동들:

MCP 도구 추가, 시스템 프롬프트에 타임스탬프 삽입, 세션 중간에 모델 전환 — 이런 행동들은 전체 캐시를 무효화해 해당 요청의 비용을 5배 이상으로 만들 수 있습니다. Claude Code Camp

# ❌ 캐시 파괴 패턴
system_prompt = f"현재 시각: {datetime.now()}\n당신은 전문가입니다..."
# 매 요청마다 시간이 달라지므로 캐시 미스 발생

# ✅ 올바른 패턴
system_prompt = "당신은 전문가입니다..."
# 고정된 내용만 캐시 적용

MCP 서버 관리:

불필요한 MCP 서버는 비활성화하세요. 활성화된 MCP 서버마다 도구 정의가 시스템 프롬프트에 추가되어 컨텍스트 창을 소비합니다. ClaudeLog


✅ 정리 — 비용 절감 우선순위

실제 적용 순서로 정리하면 이렇습니다:

우선순위 기법 예상 절감
1순위 프롬프트 캐싱 적용 최대 90%
2순위 출력 길이 명시적 제한 30~40%
3순위 모델 라우팅 (Haiku/Sonnet/Opus) 40~70%
4순위 관련 없는 작업마다 새 대화 시작 20~30%
5순위 Batch API (급하지 않은 대량 작업) 50%
6순위 Token-Efficient Tool Use 헤더 추가 10~20%

이 중 프롬프트 캐싱 + 모델 라우팅만 제대로 적용해도 대부분의 케이스에서 비용을 절반 이하로 줄일 수 있습니다.

다음 단계로는 Anthropic 공식 Prompt Engineering 가이드와 Claude Code의 /compact, /cost 명령어 활용을 추천드립니다.