Throttle이란
- 특정 조건 속에 최대 호출 회수를 제한, 결정하는 클래스
- view에서 throttle_classes로 호출 및 사용이 가능하며 그 형태가 permission과 비슷함.
- get_throttles 함수를 통해서도 접근이 가능한 것으로 보인다.
Setting
- 프로젝트 전체에서 전역으로 사용할 경우 settings.py에서 사용이 가능하다
- 보통 AnonRateThrottle, UserRateThrottle를 많이 사용하고 둘은 Authentication의 차이가 있음
- Default_rate를 지정(scope에 따라서)
클라이언트 식별 방법
- X-Forwarded_For와 Remote-Addr HTTP 헤더는 throttling을 위해 클라이언트 IP 주소를 고유하게 식별하는데 사용된다
- X-Forwarded_For헤더가 있으면 사용되고, 없으면 Remote-Addr 헤더 값이 사용된다
- 비인증요청에 대해서는 IP를 기준으로 카운트하게되는데, 이 때 Remote-Addr WSGI 변수값을 참조하게 되면 문제가 발생하게 된다
- 로드 밸런서를 통할 경우 여러 유저들의 Remote-Addr 의 값이 동일해지고, 이는 여러 유저가 같은 timestamp를 가지게 되기 때문이다
그렇기 때문에 X-Forwarded_For 헤더값이 Remote-Addr 값에 우선하게 된다
비회원에 대한 Throttling
- 현재 각 비회원에 대해 요청을 제한을 둘 예정이며 request.user가 없을 때 설정을 따로 진행했으나 모든 비회원 유저에 대해 같은 제한을 제시(1/minute 을 각기 다른 ip에서 요청했음에도 실패)
- 즉 다른 IP에서 보낸 요청을 다르게 받아들일 수 있도록 작업이 필요할 것으로 보임