Django Throttling

허진수·2022년 7월 10일
0

Django

목록 보기
1/5

개요

인증, 비 인증 된 사용자에 대해 요청 횟수의 제한을 둘 수 있는 DRF의 기능이다.
여러 개의 Throttle을 지정해서 사용 할 수 있고, API 별로 나누어서 설정 할 수 도 있다.
공식 문서에서는 이를denial-of-service공격의 방어책으로 사용하지 말라고 경고하고 있다.


설정

전역 설정의 경우는 다음과 같이 할 수있다.

REST_FRAMEWORK = {
  'DEFAULT_THROTTLE_CLASSES': [
    'rest_framework.throttling.AnonRateThrottle',
    'rest_framework.throttling.UserRateThrottle',
  ]
  'DEFAULT_THROTTLE_RATES': {
    'anon': '100/day'#기간은 숫자/단위의 형식으로 지정한다.
    'user': '1000/day'#단위는 second, minute, hour, day가 있다.
  }
}

View 혹은 ViewSet별 설정은 다음과 같다.

...import
from rest_framework.ghrottling import UserRateThrottle

class SampleView(APIView):
  throttle_classes = [UserRateThrottle]
  ...

함수형 view에서의 설정은 다음과 같다.

@api_view(['GET'])
@throttle_classes([UserRateThrottle])
def example_view_method(request, format=None):
  ...

클라이언트 구분 방법

HTTP 헤더의 X-Forwarded-For와 WSGI의 REMOTE_ADDR을 참조하여 구분한다.
X-Forwarded-For을 우선적으로 확인한다.

캐시

Throttle은 Django의 cache backend를 사용한다.
기본 설정인 LocMemCache는 간단한 환경에서는 괜찮을 것이다.

‘default’말고 다른 캐시를 Throttle에서 사용하고 싶으면 다음과 같이 하면 된다.

from django.core.cache import caches

class CustomAnonThrottle(AnonRateThrottle):
  cache = caches['alternate']

종류

AnonRateThrottle

unathenticated user즉, 인증이 되지 않은 사용자에 대해서만 Throttle을 적용한다.
IP주소를 unique key를 생성한다.

UserRateThrottle

user는 user id를 unique key를 생성하고, unathenticated user는 IP주소를 기준으로 unique key를 생성한다.
동시에 여러개의 UserRateThrottle을 사용할 수 있다.

ScopedRateThrottle

API에 부분적으로 적용이 가능하다.
throttle_scope라는 속성을 가지고 있는 view만 적용을 받는다
request의 scope를 user id 혹은 IP주소와 붙여서 unique key를 생성한다.

커스텀

BaseThrottle을 상속받아 allow_request함수를 재정의 하여 만들 수 있다.
True/False를 반환하여야 한다.

wait

선택적으로 wait을 재정의 하여 다음 request를 보내기 위해 기다려야 하는 시간을 정할 수 있다.
allow_request에서 False를 반환한 경우 호출된다.
request가 이 wait함수에 의해 Throttle되면, response에 Retry-After 헤더가 포함된다.

정리

인증, 비 인증 된 사용자에 따라 request의 횟수 제한을 설정 할 수 있는 기능이다.

permission과 비슷해 보이지만 엄연히 다른 기능을 수행하고 있다.

request 가 몰리는 API에 제약을 풀어주는 등 잘 사용하면 어느정도 request에 맞게 Throttle을 두어 무분별한 request를 방지 할 수 있다.
profile
안녕하세요

0개의 댓글