SlowAPI: FastAPI에서 Rate Limiting 구현

2025. 2. 23. 10:38·파이썬/Fast API
반응형
# 설치
pip install slowapi
pip install redis  # Redis 백엔드 사용시

기본 Rate Limiting 설정

from fastapi import FastAPI
from slowapi import Limiter, _rate_limit_exceeded_handler
from slowapi.util import get_remote_address
from slowapi.errors import RateLimitExceeded

limiter = Limiter(key_func=get_remote_address)
app = FastAPI()
app.state.limiter = limiter
app.add_exception_handler(RateLimitExceeded, _rate_limit_exceeded_handler)

@app.get("/")
@limiter.limit("5/minute")
async def read_root():
    return {"Hello": "World"}

Redis 백엔드 사용

from slowapi.middleware import SlowAPIMiddleware
from slowapi.storage import RedisStorage
import redis

redis_client = redis.Redis(host='localhost', port=6379)
limiter = Limiter(
    key_func=get_remote_address, 
    storage_uri="redis://localhost:6379"
)

app.add_middleware(SlowAPIMiddleware)

커스텀 키 함수 구현

from fastapi import Request

def get_user_api_key(request: Request):
    api_key = request.headers.get("X-API-Key")
    return api_key or get_remote_address(request)

limiter = Limiter(key_func=get_user_api_key)

@app.get("/api/data")
@limiter.limit("100/day")
async def get_data(request: Request):
    return {"data": "some data"}

동적 제한 설정

def rate_limit_by_user_tier(request: Request):
    user_tier = get_user_tier(request)  # 사용자 등급 확인
    limits = {
        "basic": "10/minute",
        "premium": "100/minute",
        "enterprise": "1000/minute"
    }
    return limits.get(user_tier, "5/minute")

@app.get("/api/premium")
@limiter.limit(rate_limit_by_user_tier)
async def premium_endpoint(request: Request):
    return {"status": "success"}

경로별 제한 설정

@app.get("/api/public")
@limiter.limit("10/minute")
async def public_endpoint(request: Request):
    return {"access": "public"}

@app.get("/api/private")
@limiter.limit("30/minute", key_func=lambda _: "global")
async def private_endpoint(request: Request):
    return {"access": "private"}

@app.post("/api/write")
@limiter.limit("5/minute;100/day")
async def write_endpoint(request: Request):
    return {"operation": "write"}

에러 처리 커스터마이징

from fastapi import HTTPException
from slowapi.errors import RateLimitExceeded

@app.exception_handler(RateLimitExceeded)
async def custom_rate_limit_exceeded_handler(request: Request, exc: RateLimitExceeded):
    return JSONResponse(
        status_code=429,
        content={
            "error": "Rate limit exceeded",
            "reset_at": exc.reset_at.isoformat(),
            "retry_after": exc.retry_after
        }
    )

그룹 제한 설정

from slowapi import Limiter
from slowapi.util import get_remote_address

limiter = Limiter(
    key_func=get_remote_address,
    default_limits=["100/day", "10/minute"]
)

@app.post("/upload")
@limiter.limit(
    "10/hour",
    key_func=lambda r: f"{get_remote_address(r)}/upload"
)
async def upload_file(request: Request):
    return {"status": "uploaded"}

 

주요 기능 및 장점

  1. 유연한 설정
    • 다양한 시간 단위 지원
    • 동적 제한 설정
    • 백엔드 선택 가능
  2. 확장성
    • Redis 백엔드 지원
    • 커스텀 키 함수
    • 그룹 제한 설정
  3. 사용자 경험
    • 상세한 에러 메시지
    • 재시도 정보 제공
    • 헤더 기반 상태 추적
  4. 모니터링
    • 제한 상태 추적
    • 사용량 통계
    • 디버깅 용이

SlowAPI를 사용하면 API의 사용량을 효과적으로 제어하고 서버 리소스를 보호할 수 있습니다.

저작자표시 비영리 변경금지 (새창열림)

'파이썬 > Fast API' 카테고리의 다른 글

FastAPI Response Set-Cookie와 HttpOnly 보안 구현  (1) 2025.02.27
FastAPI Security: API 보안 구현  (0) 2025.02.24
FastAPI Permissions: 권한 관리 구현  (0) 2025.02.22
FastAPI-Users with MongoDB: JWT 인증  (0) 2025.02.21
pyinstrument : 성능 최적화를 위한 프로파일링  (0) 2025.02.11
'파이썬/Fast API' 카테고리의 다른 글
  • FastAPI Response Set-Cookie와 HttpOnly 보안 구현
  • FastAPI Security: API 보안 구현
  • FastAPI Permissions: 권한 관리 구현
  • FastAPI-Users with MongoDB: JWT 인증
코샵
코샵
나의 코딩 일기장
    반응형
  • 코샵
    끄적끄적 코딩 공방
    코샵
    • 분류 전체보기 (725)
      • 스마트팜 (0)
      • 상품 추천 (223)
      • MongoDB (4)
      • 하드웨어 (17)
      • 일기장 (4)
      • 파이썬 (130)
        • Basic (41)
        • OpenCV (8)
        • Pandas (15)
        • PyQT (3)
        • SBC(Single Board Computer) (1)
        • 크롤링 (14)
        • Fast API (29)
        • Package (6)
      • Unity (138)
        • Tip (41)
        • Project (1)
        • Design Pattern (8)
        • Firebase (6)
        • Asset (2)
      • Linux (4)
      • C# (97)
        • Algorithm (11)
        • Window (7)
      • TypeScript (51)
        • CSS (10)
      • Git (11)
      • SQL (5)
      • Flutter (10)
        • Tip (1)
      • System (1)
      • BaekJoon (6)
      • Portfolio (2)
      • MacOS (1)
      • 유틸리티 (1)
      • 서비스 (6)
      • 자동화 (3)
      • Hobby (10)
        • 물생활 (10)
        • 식집사 (0)
  • 인기 글

  • 태그

    셀레니움
    카페24리뷰
    appdevelopment
    리뷰관리
    codingtips
    cv2
    learntocode
    스크립트 실행
    Python
    긴유통기한우유
    C#
    믈레코비타멸균우유
    codingcommunity
    상품 리뷰 크롤링
    unity
    programmerlife
    리스트
    스마트스토어리뷰
    파이썬
    list
    라떼우유
    rtsp
    카페24리뷰이관
    쇼핑몰리뷰
    스크립트 실행 순서
    리뷰이관
    devlife
    유니티
    programming101
    ipcamera
  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
코샵
SlowAPI: FastAPI에서 Rate Limiting 구현
상단으로

티스토리툴바