웹 시스템은 짧은 시간 내에 수많은 클라이언트 요청으로 인해 어려움을 겪는 경우가 많습니다. 이로 인해 서버가 과부하되어 속도 저하나 오류가 발생할 수 있습니다. 비율 제한기는 각 클라이언트의 요청 빈도를 제어하여 이 문제를 우아하게 해결합니다. 지정된 시간 내에 API 또는 서비스 호출을 제한하는 문지기 역할을 합니다.
속도 제한은 다음과 같은 몇 가지 중요한 이점을 제공합니다.
남용 방지: 서비스 거부(DoS) 공격과 같은 과도하거나 악의적인 요청을 완화하여 시스템 과부하를 방지합니다.
리소스 관리: 효율적인 리소스 할당을 보장하여 한 클라이언트가 서버 리소스를 독점하여 다른 클라이언트에 영향을 미치는 것을 방지합니다.
성능 향상: 요청 폭주를 방지하여 트래픽 부하가 높은 상황에서도 애플리케이션 응답성을 유지합니다.
사용자 경험 개선: 과도한 요청으로 인한 사용자 잠금이나 성능 저하를 방지합니다.
보안 강화: 요청 비율을 제한하여 무차별 대입 공격이나 악용 시도를 방지하는 데 도움이 됩니다.
인기 있는 Chi 라우팅 패키지와 golang.org/x/time/rate
패키지(토큰 버킷 알고리즘 사용)를 사용하여 Go 구현을 살펴보겠습니다. 이 예에서는 http.Handler
을 사용하여 클라이언트 요청 비율을 제어합니다.
<code class="language-go">package main import ( "encoding/json" "net/http" "strings" "time" "github.com/go-chi/chi" "golang.org/x/time/rate" ) func main() { r := chi.NewRouter() // Globally limits to 5 requests per second with a burst of 10 r.Use(RateLimiter(rate.Limit(5), 10, 1*time.Second)) // Test route r.Get("/", func(w http.ResponseWriter, r *http.Request) { w.Write([]byte("Request successful")) }) http.ListenAndServe(":3000", r) } // RateLimiter middleware func RateLimiter(limit rate.Limit, burst int, waitTime time.Duration) func(next http.Handler) http.Handler { limiterMap := make(map[string]*rate.Limiter) lastRequestMap := make(map[string]time.Time) return func(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { ip := strings.Split(r.RemoteAddr, ":")[0] limiter, exists := limiterMap[ip] if !exists { limiter = rate.NewLimiter(limit, burst) limiterMap[ip] = limiter } lastRequestTime, lastRequestExists := lastRequestMap[ip] if lastRequestExists && time.Since(lastRequestTime) < waitTime { //Handle exceeding rate limit http.Error(w, http.StatusText(http.StatusTooManyRequests), http.StatusTooManyRequests) return } if !limiter.Allow() { http.Error(w, http.StatusText(http.StatusTooManyRequests), http.StatusTooManyRequests) return } lastRequestMap[ip] = time.Now() next.ServeHTTP(w, r) }) } }</code>
비율 제한을 초과하면 429 (Too Many Requests)
오류가 발생합니다.
클라이언트 사용량을 식별하고 제한하는 방법에는 여러 가지가 있습니다.
IP 기반: 특정 IP 주소의 요청을 제한합니다. 간단하지만 공유 네트워크(NAT)에서는 비효율적입니다.
인증 토큰 기반: 인증 토큰(JWT, OAuth)을 기반으로 요청을 추적합니다. 더욱 세부적이지만 인증이 필요합니다.
클라이언트 ID 기반: 고유한 클라이언트 ID(API 키)를 사용합니다. 서비스 통합에는 효과적이지만 키가 손상되면 취약합니다.
사용자별 세션: 고유 세션 식별자를 기반으로 요청을 제한합니다. 개인의 사용자 경험에 중점을 둡니다.
경로/엔드포인트 기반: 트래픽이 많은 특정 엔드포인트로 요청을 제한합니다. 다른 방법과 잘 결합됩니다.
이 예에서는 토큰 기반 인증이 없는 공용 API 또는 애플리케이션에 적합한 IP 주소를 사용하여 단순화했습니다.
비율 제한은 애플리케이션 보안, 안정성 및 사용자 경험에 필수적입니다. 이 예에서는 Go 및 Chi를 사용한 실용적이고 효율적인 구현을 보여줍니다. 이는 남용을 방지하고 공정한 자원 분배를 보장하는 중요한 기술입니다.
위 내용은 속도 제한기란 무엇이며 왜 사용합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!