jm_p_op

Throttling - 비정상적 요청 유저 벤하기 본문

팀/>_water

Throttling - 비정상적 요청 유저 벤하기

jm_p_op 2023. 7. 6. 03:24

목표 - 요청을 매크로 보내는 사람 걸러주기

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 #걸리는 시간(초)
        ...