본문 바로가기
Django/Django REST framework

DRF throttling 사용기

by hyun-am 2023. 1. 8.

스로틀링 개념

스로틀링은 특정 기간 동안 시스템 또는 장치가 만들 수 있는 요청 수를 제한하는데 사용되는 기술입니다. 제한을 사용하는 데는 다음과 같은 몇가지 이유가 있습니다.

  1. 시스템 또는 네트워크의 과부하를 방지하려면 : 시스템이 한 번에 너무 많은 요청을 받으면 과부하 상태가 되어 모든 요청을 효과적으로 처리할 수 없습니다. 스로틀링은 시스템이 용량 제한 내에서 유지되도록 하는 데 도움이 됩니다.
  2. 악의적인 활동으로부터 보호하기 위해 : 경우에 따라 과도한 요청으로 시스템을 압도하려는 악의적인 공격에 대한 방어 수단으로 제한을 사용할 수 있습니다. 가능한 요청 수를 제한함으로써 시스템은 이러한 공격을 더 잘 견딜수 있습니다. 예를 들면 음식검색 API를 만들었는데 초당 막 1만회 요청이 들어오면 이것을 쓰로틀링을 통해 조절 할 수 있습니다.
  3. 리소스 활용을 최적화하려면 리소스를 효율적으로 사용하기 위해 스로틀링을 사용할 수 있습니다. 예를 들어 시스템의 대역폭이나 처리 능력이 제한된 경우 조절을 통해 이러한 리소스가 불필요하거나 중복된 요청에 낭비되지 않고 최적의 방식으로 사용되도록 할 수 있습니다.

Django에서 쓰로틀링 사용하기

DRF 쓰로틀링 개념

번역된 사이트

https://hyun-am-coding.tistory.com/entry/15-Throttling

 

15. Throttling

Throttling은 요청이 승인되어야 하는지 여부를 결정하는 점에서 permissions와 유사합니다. throttling은 임시 상태를 나타내며 클라이언트가 API에 대해 수행할 수 있는 요청 속도를 제어하는 데 사용됩

hyun-am-coding.tistory.com

공식문서

https://www.django-rest-framework.org/api-guide/throttling/

 

Throttling - Django REST framework

 

www.django-rest-framework.org

대표적인 3가지

UserRateThrottle, AnonRateThrottle, ScopedRateThrottle 이렇게 있습니다. 또한 Custom을 해서 사용할 수 있습니다.

  • UserRateThrottle : 인증된 유저당
  • AnonRateThrottle : 익명 사용자에 대한
  • ScopedRateThrottle : ID or 해당 IP에대한

서비스에 적용하기

  1. 테스트를 위해 초당 1회만 허용하도록 하겠습니다.(에러를 확인하기 위해)
  2. 사용하는 throttle은 UserRateThrottle입니다.
  3. 사용할 뷰셋은 ObjectViewSet입니다

먼저 throttling.py라는 스로틀링을 사용하고 싶은 앱에다가 만들겠습니다.

그 후 코드는 다음과 같이 작성하겠습니다.

throttling.py

from rest_framework.throttling import UserRateThrottle

class ObjectThrottle(UserRateThrottle):
    rate = "1/s"

class ObjectAnonThrottle(AnonRateThrottle):
    rate = "1/s"

 

views.py

 

class ObjectViewSet(viewset.ModelViewset):
    permission_classes = [AllowAny]
    pagination_class = ObjectPagination
    model = FoodInformation
    queryset = Object.objects.all()
    serializer_class = ObjectSerializer
    throttle_classes = [
        ObjectThrottle,
        ObjectAnonThrottle
    ]

이런식으로 throttle_classes를 통해 Throttle를 등록할 수 있습니다.

저는 익명유저와 인증된 유저를 둘다 처리하기 위해 두 개 전부 등록했습니다.

 - ObjectThrottle

 - ObjectAnonThrottle

테스트 해보기

만약 스로틀링이 적용된 샘플 API를 1초에 2회이상 요청을 보낸경우 다음과 같이 1초후에 다시 요청해달라는 에러(429 Error)가 나옵니다.

댓글