HTTP 429 Too Many Requests 응답 코드는 클라이언트가 짧은 시간 안에 너무 많은 요청을 서버에 보냈을 때 발생합니다. 이는 서버가 트래픽을 조절하고, 서비스의 안정성을 유지하기 위해 적용하는 Rate Limiting(요청 제한) 메커니즘 때문입니다.
🧐 1. HTTP 429 상태 코드 원인
🚀 API 요청 과부하: 일정 시간 내 너무 많은 API 요청 전송
🔄 봇 또는 스크래핑: 자동화된 크롤링이 과도하게 실행될 경우
🔄 잘못된 클라이언트 구현: 적절한 딜레이 없이 요청을 연속적으로 보냄
⚙ 서버 측 Rate Limiting: API 제공자가 클라이언트 요청 수를 제한함
🔧 2. HTTP 429 해결 방법
✅ 1) 요청 속도 조절 (Rate Limit 고려)
API 요청 시 일정한 간격을 두고 요청해야 합니다. 예를 들어, 0.5~1초의 간격을 추가하면 429 오류를 방지할 수 있습니다.
import time
import requests
url = "https://api.example.com/data"
for i in range(10):
response = requests.get(url)
if response.status_code == 429:
print("429 오류 발생! 대기 후 재시도 중...")
time.sleep(5) # 5초 대기 후 재시도
else:
print(response.json()) # 정상 응답
time.sleep(1) # 1초 간격 요청
✅ 2) Retry-After 헤더 확인
서버가 Retry-After 헤더를 제공하는 경우, 해당 시간이 지나면 요청을 다시 보내야 합니다.
import requests
import time
url = "https://api.example.com/data"
response = requests.get(url)
if response.status_code == 429:
retry_after = int(response.headers.get("Retry-After", 5)) # 기본 5초 대기
print(f"429 오류 발생! {retry_after}초 후 다시 요청")
time.sleep(retry_after)
response = requests.get(url) # 재시도
✅ 3) API 키 변경 또는 업그레이드
일부 API는 무료 사용자에게 요청 제한을 적용할 수 있습니다. 제한을 완화하려면:
🔑 새 API 키 생성 (가능한 경우)
📈 유료 플랜 업그레이드 (제한 증가)
🔀 다중 API 키 활용 (로테이션 적용)
✅ 4) IP 변경 (IP 기반 Rate Limiting 대응)
일부 서버는 같은 IP에서 너무 많은 요청이 오면 차단할 수 있습니다. 이를 해결하는 방법:
🔄 VPN 또는 프록시 사용
🔄 다중 IP를 가진 서버 활용
🔄 IP 로테이션 적용 (프록시 변경)
✅ 5) 백엔드에서 캐싱 적용
동일한 요청이 반복적으로 발생하면, 백엔드에서 캐싱을 적용하여 불필요한 API 호출을 줄일 수 있습니다.
from cachetools import TTLCache
cache = TTLCache(maxsize=100, ttl=300) # 5분 캐싱
def get_data(url):
if url in cache:
return cache[url]
response = requests.get(url)
if response.status_code == 200:
cache[url] = response.json()
return response.json()