본문 바로가기

Django에서 Throttling 설정으로 API 보호하기

_Big 2025. 5. 17.
반응형

django 로고 이미지


API가 확장되고 외부에 공개되면, 남용을 방지하고 요청 빈도를 제어하는 것이 매우 중요해집니다. Throttling(요청 제한)은 Django REST Framework(DRF)에 내장된 기능으로, 사용자가 일정 시간 동안 API에 보낼 수 있는 요청 수를 제한합니다.

이 가이드에서는 DRF에서 Throttling을 설정하여 API를 보호하고 성능을 유지하는 방법을 알아봅니다.

서론

Throttling은 API 보안에서 필수적인 도구입니다. 인증이나 권한 설정이 누가 API에 접근할 수 있는지를 제어한다면, Throttling은 얼마나 자주 접근할 수 있는지를 제어합니다.

Django REST Framework는 여러 가지 내장 Throttle 클래스와 커스텀 규칙을 정의할 수 있는 유연성을 제공합니다.

1. settings.py에서 Throttling 활성화

먼저 settings.py에 Throttle 클래스를 설정합니다:

REST_FRAMEWORK = {
    'DEFAULT_THROTTLE_CLASSES': [
        'rest_framework.throttling.AnonRateThrottle',
        'rest_framework.throttling.UserRateThrottle',
    ],
    'DEFAULT_THROTTLE_RATES': {
        'anon': '100/day',
        'user': '1000/day'
    }
}

위 설정은 익명 사용자는 하루 100회, 인증된 사용자는 하루 1000회 요청할 수 있도록 제한합니다.

 

2. 기본 제공 Throttle 클래스 이해하기

DRF는 다음과 같은 Throttle 클래스를 제공합니다:

  • AnonRateThrottle: 익명 사용자 제한
  • UserRateThrottle: 인증 사용자별 제한
  • ScopedRateThrottle: 특정 뷰에 고유 제한을 부여하는 스코프 기반 제한

상황에 맞게 이들을 혼합하여 사용할 수 있습니다.

 

3. Scoped Throttling 적용하기

Scoped Throttling을 사용하면 각 API 엔드포인트에 다른 제한을 설정할 수 있습니다. 예시:

settings.py:

'DEFAULT_THROTTLE_CLASSES': [
    'rest_framework.throttling.ScopedRateThrottle',
],
'DEFAULT_THROTTLE_RATES': {
    'low_request': '10/day',
    'high_request': '1000/day',
}

views.py:

from rest_framework.throttling import ScopedRateThrottle

class LimitedView(APIView):
    throttle_classes = [ScopedRateThrottle]
    throttle_scope = 'low_request'

    def get(self, request):
        return Response({"message": "이 엔드포인트는 요청 제한이 적용됩니다."})

 

4. 커스텀 Throttle 클래스 만들기

더 정교한 제어가 필요할 경우 사용자 정의 Throttle 클래스를 만들 수 있습니다:

from rest_framework.throttling import BaseThrottle

class IPThrottle(BaseThrottle):
    def allow_request(self, request, view):
        ip = request.META.get('REMOTE_ADDR')
        # 여기에 IP 추적 및 제한 로직 작성
        return True

이 클래스를 DEFAULT_THROTTLE_CLASSES에 등록하여 사용할 수 있습니다.

 

5. Throttling 동작 테스트

요청이 제한을 초과하면, DRF는 자동으로 429 Too Many Requests 응답을 반환합니다. 이 응답 메시지는 필요에 따라 커스터마이징할 수 있습니다.

Postman이나 curl 같은 도구를 사용하여 빠른 요청을 시뮬레이션하고 제한 동작을 테스트해보세요.

 

마치며

Throttling은 Django API의 안정성과 보안을 유지하는 데 핵심적인 역할을 합니다. DRF의 유연한 Throttle 시스템을 활용하면 남용을 방지하고 서버 리소스를 보호할 수 있습니다.

여러분은 Django 프로젝트에서 Throttling을 어떻게 설정하셨나요? 전략을 공유하거나 궁금한 점이 있다면 댓글로 남겨주세요—API 보호를 최적화하는 데 도움을 드리겠습니다!

 

 

Django 모델링: 데이터베이스 설계의 핵심

강력한 웹 애플리케이션은 모두 잘 구조화된 데이터베이스 위에 구축됩니다. Django 세계에서는 데이터를 제대로 모델링하는 것이 모든 것의 출발점입니다—사용자 인터랙션부터 백엔드 처리까

bigadmin.org

 

반응형

댓글