Django에서 Throttling 설정으로 API 보호하기
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
댓글