속도 제한

시작하기

라라벨에는 애플리케이션의 캐시와 함께 사용하기 쉬운 속도 제한 추상화가 포함되어 있어 지정된 시간 동안 모든 작업을 제한하는 쉬운 방법을 제공합니다.

{팁} HTTP 요청의 속도 제한하는 방법에 관심이 있으면 속도 제한기 미들웨어 문서를 확인하세요.

캐시 환경설정

일반적으로 속도 제한기는 애플리케이션의 cache 구성 파일 내 default 키로 정의된 기본 애플리케이션 캐시를 활용합니다. 그러나 애플리케이션의 cache 구성 파일 내에서 limiter 키를 정의하여 속도 제한기가 사용해야 하는 캐시 드라이버를 지정할 수 있습니다.

'default' => 'memcached',

'limiter' => 'redis',

기본적인 사용법

Illuminate\Support\Facades\RateLimiter 파사드는 속도 제한기와 상호 작용하는 데 사용할 수 있습니다. 속도 제한기가 제공하는 가장 간단한 방법은 주어진 시간(초) 동안 지정된 콜백 속도를 제한하는 attempt 메소드입니다.

콜백에 남은 시도가 없을 때 attempt 메서드는 false를 반환합니다. 그렇지 않으면 attempt 메소드는 콜백의 결과 또는 true를 리턴합니다. attempt 메소드에서 허용되는 첫 번째 인수는 속도 제한기 "키"이며, 속도 제한 중인 작업을 나타내는 임의의 문자열일 수 있습니다.

use Illuminate\Support\Facades\RateLimiter;

$executed = RateLimiter::attempt(
    'send-message:'.$user->id,
    $perMinute = 5,
    function() {
        // Send message...
    }
);

if (! $executed) {
  return 'Too many messages sent!';
}

시도 횟수 수동 증가

속도 제한기와 수동으로 상호 작용하려는 경우 다양한 다른 방법을 사용할 수 있습니다. 예를 들어, tooManyAttempts 메소드를 호출하여 주어진 속도 제한기 키가 분당 허용되는 최대 시도 횟수를 초과했는지 확인할 수 있습니다.

use Illuminate\Support\Facades\RateLimiter;

if (RateLimiter::tooManyAttempts('send-message:'.$user->id, $perMinute = 5)) {
    return 'Too many attempts!';
}

또는 remaining 메서드를 사용하여 주어진 키에 대해 남은 시도 횟수를 검색할 수 있습니다. 주어진 키에 남은 재시도가 있는 경우 hit 메서드를 호출하여 총 시도 횟수를 늘릴 수 있습니다.

use Illuminate\Support\Facades\RateLimiter;

if (RateLimiter::remaining('send-message:'.$user->id, $perMinute = 5)) {
    RateLimiter::hit('send-message:'.$user->id);

    // Send message...
}

리미터 가용성 결정

키에 더 이상 시도가 남아 있지 않으면 availableIn 메서드는 더 많은 시도를 사용할 수 있을 때까지 남은 시간(초)을 반환합니다.

use Illuminate\Support\Facades\RateLimiter;

if (RateLimiter::tooManyAttempts('send-message:'.$user->id, $perMinute = 5)) {
    $seconds = RateLimiter::availableIn('send-message:'.$user->id);

    return 'You may try again in '.$seconds.' seconds.';
}

시도 횟수 초기화

clear 메소드를 사용하여 주어진 속도 제한기 키에 대한 시도 횟수를 재설정할 수 있습니다. 예를 들어 수신자가 주어진 메시지를 읽을 때 시도 횟수를 재설정할 수 있습니다.

use App\Models\Message;
use Illuminate\Support\Facades\RateLimiter;

/**
 * Mark the message as read.
 *
 * @param  \App\Models\Message  $message
 * @return \App\Models\Message
 */
public function read(Message $message)
{
    $message->markAsRead();

    RateLimiter::clear('send-message:'.$message->user_id);

    return $message;
}