슬라이딩 윈도우는 서비스 과부하 방지 및 DDoS 공격 보호를 위한 일반적인 속도 제한(Rate Limiting) 알고리즘입니다. 🛡️
이 알고리즘은 정의된 시간(예: 60초) 동안의 요청 수를 지속적으로 추적하며, 시간이 지남에 따라 윈도우가 "슬라이드"하여 오래된 요청을 제거하고 새로운 요청을 추가합니다. ⏳
고정 윈도우 방식의 버스트(burst) 문제를 해결하고 요청 제한을 시간 경과에 따라 더 균등하게 분배하여 사용자 경험을 향상시킵니다. 📈
각 클라이언트(client ID)는 독립적으로 추적되며, 요청은 현재 윈도우 내 유효한 요청 수가 max_requests 미만일 경우에만 허용됩니다. 👤
구현에는 max_requests (최대 요청 수), window_seconds (윈도우 길이), 그리고 클라이언트별 요청 타임스탬프를 저장하는 딕셔너리(request_timestamps)가 필요합니다. ⚙️
_clean_old_requests 내부 메서드는 현재 윈도우를 벗어난 오래된 타임스탬프를 제거하여 정확한 요청 수를 유지합니다. 🧹
allow_request 메서드는 요청 허용 여부를 결정하고, 허용될 경우 현재 타임스탬프를 기록합니다. 🚦
get_remaining_requests 메서드는 현재 윈도우에서 클라이언트가 추가로 보낼 수 있는 요청 수를 반환합니다. 🔢
다중 스레드 환경에서의 안전성을 위해 threading.Lock을 사용하여 동시 접근 시 데이터 무결성을 보장합니다. 🔒
시간 복잡도는 allow_request 및 get_remaining_requests에 대해 상각(amortized) O(1) 또는 최악의 경우 O(W) (W는 윈도우 내 타임스탬프 수)이며, 공간 복잡도는 O(U * max_requests) (U는 고유 클라이언트 수)입니다. ⏱️