Django는 강력하고 유연한 웹 프레임워크로, 많은 개발자들이 애용하는 도구입니다. 하지만 웹 애플리케이션과 API의 성능을 유지하고 보안을 강화하려면 스로틀링(Throttling) 기능을 적절히 활용하는 것이 중요합니다.
스로틀링은 요청 속도를 제한하여 서버 자원을 보호하고, 악의적인 트래픽으로부터 시스템을 방어하는 강력한 도구입니다. 오늘은 Django REST Framework(DRF)에서 스로틀링을 구현하고 활용하는 방법에 대해 알아보겠습니다. 🧑💻
왜 스로틀링이 필요할까요? 아래와 같은 이유들이 스로틀링을 도입해야 하는 중요성을 보여줍니다.
DDoS(Distributed Denial of Service) 공격은 짧은 시간 안에 대량의 요청을 보내 서버를 마비시키는 대표적인 공격입니다. 스로틀링을 통해 특정 사용자의 요청 빈도를 제한하면, 이러한 악성 요청을 효과적으로 방어할 수 있습니다.
특히 무료 API에서는 사용자가 정해진 정책 이상으로 요청을 보낼 경우 문제가 발생할 수 있습니다. 예를 들어, 한 사용자가 과도한 요청을 보내면 다른 사용자들에게 불편을 초래할 수 있습니다. 요청 속도를 제한함으로써 공정한 사용 환경을 유지할 수 있습니다.
비정상적으로 많은 요청이 몰리면 서버 성능에 영향을 미칠 수 있습니다. 이는 전체 서비스 품질 저하로 이어질 수 있으며 최악의 경우, 서비스가 멈추거나 과도한 트래픽으로 인한 불필요한 요금이 과다 청구될 수 있습니다. 스로틀링은 이를 방지하는 핵심적인 도구입니다.
Django REST Framework(DRF)는 스로틀링을 기본적으로 지원하며, 설정만으로 손쉽게 요청 속도를 제어할 수 있습니다.
Django 프로젝트의 settings.py
파일에서 DEFAULT_THROTTLE_CLASSES
와 DEFAULT_THROTTLE_RATES
를 정의하여 스로틀링을 설정할 수 있습니다.
# settings.py
REST_FRAMEWORK = {
'DEFAULT_THROTTLE_CLASSES': [
'rest_framework.throttling.UserRateThrottle', # 로그인 사용자 제한
'rest_framework.throttling.AnonRateThrottle', # 비로그인 사용자 제한
],
'DEFAULT_THROTTLE_RATES': {
'user': '100/day', # 로그인 한 사용자는 하루에 최대 100회 요청 가능
'anon': '10/hour', # 비로그인 사용자는 한 시간에 최대 10회 요청 가능
}
}
기본 설정 외에도 특정 API에 맞는 요청 제한을 적용하기 위해 커스텀 스로틀링 클래스를 정의할 수 있습니다.
from rest_framework.throttling import BaseThrottle
class CustomThrottle(BaseThrottle):
def allow_request(self, request, view):
# 특정 조건에 따라 요청 허용 여부 결정
user_ip = request.META.get('REMOTE_ADDR')
if user_ip == "192.168.0.1": # 예: 특정 IP는 차단
return False
return True
def wait(self):
# 제한된 요청의 대기 시간 반환 (초 단위)
return 60
이 커스텀 스로틀링 클래스는 allow_request
메서드를 통해 요청을 허용하거나 거부할 수 있습니다.
# settings.py
REST_FRAMEWORK = {
'DEFAULT_THROTTLE_CLASSES': [
'rest_framework.throttling.UserRateThrottle',
'rest_framework.throttling.AnonRateThrottle',
],
'DEFAULT_THROTTLE_RATES': {
'user': '1000/day', # 로그인 사용자: 하루 1000회
'anon': '100/day', # 비로그인 사용자: 하루 100회
}
}
특정 IP 주소에서의 요청 빈도를 제한하여 악성 트래픽을 방어할 수 있습니다.
from rest_framework.throttling import SimpleRateThrottle
class IPBasedThrottle(SimpleRateThrottle):
scope = 'ip'
def get_cache_key(self, request, view):
# 요청한 사용자의 IP 주소를 기준으로 캐싱
return self.get_ident(request)
# settings.py
REST_FRAMEWORK = {
'DEFAULT_THROTTLE_CLASSES': [
'myproject.throttling.IPBasedThrottle', # 커스텀 IP 기반 스로틀링
],
'DEFAULT_THROTTLE_RATES': {
'ip': '50/minute', # 분당 50회 요청 제한
}
}
DDoS 공격은 대규모 요청을 보내 서버를 마비시키는 것을 목표로 합니다. 이를 방지하기 위해 다음과 같은 전략을 사용할 수 있습니다:
요청이 제한되었을 때 반환하는 응답 메시지를 커스터마이징하여 사용자 경험을 개선할 수 있습니다.
from rest_framework.throttling import AnonRateThrottle
class CustomAnonThrottle(AnonRateThrottle):
THROTTLE_MESSAGE = '요청 제한을 초과하였습니다. 잠시 후 다시 시도해주세요.'
스로틀링 로그를 저장하여 악성 트래픽 패턴을 분석하고, 이를 기반으로 보안 정책을 강화할 수 있습니다.
Django REST Framework의 스로틀링은 서버 자원을 보호하고, 안정적인 API 서비스를 제공하기 위한 핵심 도구입니다. 로그인 여부에 따른 제한, IP 기반 제한, 커스텀 스로틀링 등을 통해 보안을 강화하고 공정한 사용 환경을 조성할 수 있습니다.
스로틀링 자체는 캐싱을 활용하기 때문에 성능에 큰 영향을 미치지 않습니다. 그러나 잘못된 설정은 사용자 경험에 부정적인 영향을 줄 수 있으니, 적절한 한도를 설정하는 것이 중요합니다.
UserRateThrottle
을 커스터마이징하거나, 사용자 그룹에 따라 서로 다른 스로틀링 클래스를 적용하면 됩니다.
Django의 로깅 기능을 활용하여 제한된 요청을 기록하고 분석할 수 있습니다.
상담만 받아보셔도 좋습니다 긱다이브의 상담으로 업체 비교를 시작해보세요