사용자당 속도 제한

4393 단어
The Problem
응용 프로그램 데이터(예를 들어 사용자 ID나 사용자 충성도)에 따라 요청을 속도 제한하기를 원하지만, 응용 프로그램 층 이전에 속도 제한을 적용하기를 원하기 때문에 클라이언트가 제공한 값을 신뢰할 수 없습니다.
이것은 흔히 볼 수 있는 문제로 업계 표준 방법이 IP(또는 CIDR 블록)를 통해 속도 제한을 할 수 있다.실제로 일부 popularCDNs는 IP 키 제어의 속도 제한만 지원한다.불행하게도 IP 기반의 제한은 통상적으로 부족하다. 왜냐하면 너무 많은 악성 데이터를 허용하거나 대량의 합법적인 사용자를 막았기 때문이다. (운영자급이나 사무실NAT 뒤에 많은 사용자가 있다고 상상해 보자.)
The Solution
  • 요청한 에이전트의 보이는 부분(예를 들어 쿠키)에서 응용 프로그램 정보를 전달한다.
  • 애플리케이션 정보를 사용하도록 속도 제한기를 구성합니다.(IP 기반 키로 돌아갈 수 있음)
  • 애플리케이션은 정보를 검증해야 하며 정확하지 않으면 "무용지물"응답을 제공해야 합니다.
  • 1단계와 2단계는 뚜렷하지만 3단계는'벙어리'에이전트가 응용 프로그램 값에 따라 응용 속도 제한을 적용할 수 있도록 허용하는 비밀 요소이다.3단계의 결과는 사기의 값이 공격자에게 아무런 가치도 제공하지 않는다는 것이다. 이것은 먼저 사기의 목적을 파괴한다.
    "공격자에 대한 가치"가 매우 광범위할 수 있으므로, 속도 제한 목표를 반영했는지 확인하십시오.
  • DoS 공격을 방지하려면 검증이 충분히 저렴한지 확인하십시오.
  • 스크래치를 방지하려면 가치 있는 데이터가 반환되지 않도록 하십시오.
  • 인증 실패 시 일반적으로 수행되는 작업은 다음과 같습니다.
  • 쿠키에서 정보를 전달할 경우 쿠키의 설정(또는 수정)을 취소하고 사용자를 같은 URL로 변경합니다.
  • IP 전용 로그인 페이지로 리디렉션합니다.
  • NGINX Example
    NGINX는 이를 쉽게 지원할 수 있습니다.다음은 uid 쿠키에서 전달된 사용자 ID를 통해 속도 제한을 하는 예입니다.
    map $cookie_uid $rate_limit_key {
        "" $binary_remote_addr;
        default $cookie_uid;
    }
    limit_req_zone $rate_limit_key zone=auth:10m rate=10/s;
    
    이 코드 세그먼트는 사용자와 IP에 동일한 제한을 적용하지만 두 개limit_req_zone를 사용하여 그룹마다 다른 제한을 적용할 수 있다.
    Concerns
    Lock-out on Mismatch
    일치하지 않는다고 해서 사용자를 잠그지 않도록 하십시오.예를 들어 쿠키에서 사용자 ID를 검증하기 위해 인증 영패를 사용한다면 인증 영패가 만료되거나 취소되면 401을 되돌려주지 마십시오.이것은 사용자가 모든 요청을 막고 문제를 해결할 뚜렷한 방법이 없게 할 것이다.(지원 팀에서 쿠키를 제거하도록 요청할 수도 있습니다.)
    위에서 말한 바와 같이 신뢰할 수 없는 데이터를 지우고 사용자가 일반적인 IP 기반 필터로 복구할 수 있도록 하는 것이 더 좋다.
    Cost of Validation
    검증의 원가가 매우 낮을 수 있다.일반적으로 인증 요청의 인증 토큰을 어떤 방식으로든 검증하기를 원하지만, 인증 토큰은 사용자 ID와 같은 모든 방식의 속도 제한 설정을 검증하기 위해 충분한 정보를 제공합니다.그러나 정보 공개 요청에 대해 이런 검증은 다른 측면에서 불필요할 수 있고 서비스 요청의 전체 비용을 증가시킬 수 있다.
    불행하게도 저는 어떤 좋은 해결 방안이 있는지 모르겠습니다. 이것은 신분 검증의 속도 제한을 바탕으로 하는 비용입니다. 당신은 실제로 신분 검증을 실행해야 합니다!하나의 해결 방법은 공공 데이터에 대한 요청을 속도 제한에서 배제함으로써 신분 검증 정보를 검증할 필요가 없다는 것이다.단, 속도 제한기와 응용 프로그램 사이에서 속도 제한을 뛰어넘는 요청이 사실상 무제한인지 확인하십시오. (공격자는 모든 요청에 무작위 속도 제한 키를 보낼 수 있기 때문입니다.)동기화를 유지하는 간단한 방법은 요청을 프로그램에 전달하기 전에 요청에서 속도 제한 키를 삭제하고 프로그램이 검증할 내용이 없다는 것이다.이러한 방법은 비용을 낮출 수 있지만, 프로그램이 스크레이퍼에 노출될 수 있기 때문에, 매우 높은 IP 기반 속도 제한을 사용하면 많은 합법적인 요청에 영향을 주지 않는 상황에서 가장 심각한 공격을 방지하기에 충분할 것이다.
    Possible Tweaks
    Key Passing
    쿠키를 통해 속도 제한 정보를 전달하는 것은 간단한 옵션입니다. 브라우저가 모든 후속 요청에 자동으로 추가하지만, 기본적으로 URL 매개 변수나 사용자 정의 제목을 포함하여 모든 방법이 작동할 수 있기 때문입니다.다만 사용자를 밖으로 잠그는 것을 조심해야 한다.사용자 정의 방법으로 속도 제한 정보를 전달할 경우 모든 클라이언트가 속도 제한 정보가 일치하지 않아 거부된 요청을 정상적으로 처리할 수 있도록 해야 한다.
    Variable Limits
    만약 충분한 유연한 속도 제한 시스템이 있다면, 응용 데이터에 따라 속도 제한을 설정할 수도 있다.예를 들어 로그인한 사용자는 10r/s를 얻을 수 있지만 최소 20달러를 쓴 로그인한 사용자는 20r/s를 얻을 수 있다. 이것은 가장 충성스러운 고객에게 신뢰할 수 있는 서비스를 제공하는 동시에 계정 스팸메일의 유효성을 방지할 수 있는 좋은 방법이다.

    좋은 웹페이지 즐겨찾기