Skip to content

속도 제한

소개

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

lightbulb

들어오는 HTTP 요청의 속도 제한에 관심이 있다면 속도 제한 미들웨어 문서를 참조하십시오.

캐시 구성

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

'default' => env('CACHE_STORE', 'database'),
 
'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() {
// 메시지 보내기...
}
);
 
if (! $executed) {
return '너무 많은 메시지가 전송되었습니다!';
}

필요한 경우 attempt 메서드에 네 번째 인수를 제공할 수 있으며, 이는 "감쇠율" 또는 사용 가능한 시도가 재설정될 때까지의 시간(초)입니다. 예를 들어, 위의 예제를 수정하여 2분마다 5번의 시도를 허용할 수 있습니다:

$executed = RateLimiter::attempt(
'send-message:'.$user->id,
$perTwoMinutes = 5,
function() {
// 메시지 보내기...
},
$decayRate = 120,
);

수동으로 시도 횟수 늘리기

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

use Illuminate\Support\Facades\RateLimiter;
 
if (RateLimiter::tooManyAttempts('send-message:'.$user->id, $perMinute = 5)) {
return '너무 많은 시도입니다!';
}
 
RateLimiter::increment('send-message:'.$user->id);
 
// 메시지 보내기...

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

use Illuminate\Support\Facades\RateLimiter;
 
if (RateLimiter::remaining('send-message:'.$user->id, $perMinute = 5)) {
RateLimiter::increment('send-message:'.$user->id);
 
// 메시지 보내기...
}

주어진 속도 제한기 키의 값을 둘 이상 늘리려면 원하는 양을 increment 메서드에 제공할 수 있습니다:

RateLimiter::increment('send-message:'.$user->id, amount: 5);

제한기 가용성 확인

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

use Illuminate\Support\Facades\RateLimiter;
 
if (RateLimiter::tooManyAttempts('send-message:'.$user->id, $perMinute = 5)) {
$seconds = RateLimiter::availableIn('send-message:'.$user->id);
 
return ''.$seconds.'초 후에 다시 시도해 주세요.';
}
 
RateLimiter::increment('send-message:'.$user->id);
 
// 메시지 보내기...

시도 횟수 초기화

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

use App\Models\Message;
use Illuminate\Support\Facades\RateLimiter;
 
/**
* 메시지를 읽음으로 표시합니다.
*/
public function read(Message $message): Message
{
$message->markAsRead();
 
RateLimiter::clear('send-message:'.$message->user_id);
 
return $message;
}