jm_p_op
Throttling - 비정상적 요청 유저 벤하기 본문
목표 - 요청을 매크로 보내는 사람 걸러주기
throttling -> request을 카운팅해서 제한을 걸러준다 -> 카운팅하는것에서 유저를 벤시키면 되지 않을까?
기본세팅
-비로그인 유저는 ip로 저장된다.
settings.py
REST_FRAMEWORK = {
'DEFAULT_THROTTLE_CLASSES': [
'rest_framework.throttling.AnonRateThrottle',
'rest_framework.throttling.UserRateThrottle'
],
'DEFAULT_THROTTLE_RATES': {
'anon': '100/day',
'user': '1000/day'
}
}
view.py
from rest_framework.throttling import UserRateThrottle
class testview(APIview):
throttle_classes = [UserRateThrottle]
def get(self, request, format=None):
return Response("")
비로그인유저(anon) : 하루 100번
로그인유저(user): 하루 1000번
요청가능하다
넘을시 하루만큼 사용불가능
Custom class view
- 횟수 제한후 벤걸기
class limit10Throttle(UserRateThrottle):
def __init__(self):
'''타켓범위'''
pass
def allow_request(self, request, view):
'''return True #통과
return False #요청 막음'''
return super().allow_request(self, request, view) #카운팅후 throttle_failure와 throttle_success실행
def throttle_failure(self):
#횟수제한 되었을때
request.user.is_active=False
request.user.save()
return super.throttle_failure(self)
def throttle_success(self):
#횟수 제한에 안걸렸을때
return super.success(self)
post요청과 횟수,시간 설정
def allow_request(self, request, view):
if request.method == "POST":
self.rate = self.get_rate()
self.num_requests = 3 #최대 횟수
self.duration = 10 #걸리는 시간(초)
...