Laravel에서 API 호출 제한 설정 - 파트 1

3263 단어 apilaravelphp
이 두 부분으로 구성된 기사 시리즈에서는 호출 사용자의 액세스 수준에 따라 API에 대한 요청 제한을 설정하는 두 가지 방법을 살펴보겠습니다. 이는 사용자 그룹을 특정 시간당 특정 수의 API 호출로 제한하려는 구독 기반 API에 매우 유용합니다.

이 부분은 라라벨에 내장된 속도 제한기를 사용하는 데 초점을 맞출 것이고, 두 번째 부분은 설정된 제한을 적용하기 위해 사용자 지정 미들웨어를 만드는 데 집중할 것입니다.

속도 제한기 사용



이 목표를 달성하는 가장 간단한 방법은 라라벨에 내장되어 API 미들웨어 제한 경로에 대해 기본적으로 활성화되는 속도 제한 서비스를 설정하는 것입니다. 기본 제한은 분당 60개 요청으로 설정됩니다. 구성은 configureRateLimiting() 메서드의/app/Providers/RouteServiceProvider에서 변경할 수 있습니다. 이것이 기본값입니다.

protected function configureRateLimiting()
{
    RateLimiter::for('api', function (Request $request) {
        return Limit::perMinute(60);
    });
}


기본 제한을 비활성화하려는 경우(사용자가 API 엔드포인트에 대해 과부하로 이어질 수 있는 무제한 요청을 허용하므로 권장하지 않음) return Limit::none(); 이 함수에서 또는/app/Http/Kernel의 api 미들웨어 그룹에서 이 스로틀을 제거할 수 있습니다.

사용자 지정 속도 제한기 정의



configureRateLimiting() 메서드에서 더 많은 비율 제한자를 정의할 수 있습니다. 다양한 축구 경기에서 결과를 가져오기 위해 API 경로에 대한 호출을 제한하는 matches라는 리미터를 만들어 봅시다.

이 사용 사례의 경우 등록되지 않은 방문자, 무료 계정이 있는 등록된 사용자 및 서비스에 가입한 등록된 사용자의 세 가지 유형의 사용자가 있다고 가정해 보겠습니다. 첫 번째는 등록되지 않았으므로 API 토큰이 없으므로 API에 액세스할 수 없습니다. 두 번째는 API 액세스 토큰이 있지만 요청 제한은 시간당 한 번이며 구독한 사용자는 무제한으로 만들 수 있습니다. API에 대한 호출. 다음 변수를 사용합니다.
  • 액세스 수준 - 사용자가 속한 범주, 0은 무료 계정 사용자, 1은 구독 사용자입니다. 이는 데이터베이스에 있는 사용자 테이블의 액세스 열로 표시됩니다
  • .
  • 전달자 토큰 - 데이터베이스에 있는 사용자 테이블의 api_token 열로 표시되는 요청 인증을 위한 API 토큰 유형, 모든 사용자가 고유한 토큰을 가짐

  • 이제 모두 합치자.

    //RouteServiceProvider.php
    protected function configureRateLimiting()
    {
        RateLimiter::for('api', function (Request $request) {
            return Limit::perMinute(60);
        });
    
        RateLimiter::for('matches', function (Request $request) {
          $user = User::where('api_token', $request->bearerToken())
                  ->first();
          switch ($user->access) {
            case 0:
              return Limit::perHour(1)->response(function () {
                return response()->json(
                  ['error' => 'Request limit exceeded'],
                  429
                );
              });
              break;
            case 1:
              return Limit::none();
              break;
          }
        });
    }
    



    //routes/api.php
    Route::middleware(['auth:api','json.force','throttle:matches'])
    ->get('test', 'ApiController@testMatches');
    


    이제 자체 제한을 성공적으로 설정했으므로 구독 사용자는 아래에서 볼 수 있는 것처럼 여전히 제한되므로 원래 API 속도 제한기를 비활성화할 수 있습니다.



    API 테스트에 사용된 스크립트를 찾을 수 있습니다here.

    이를 달성하기 위해 API 속도 제한기를 제한 없이 설정하거나/app/Http/Kernel의 api 미들웨어 그룹에서 throttle:api를 비활성화할 수 있습니다.

    다음



    다음 시간에는 API에 대한 액세스를 제한해야 할 필요성을 처음 만났을 때 요청 속도 제한 문제를 직접 해결한 방법을 보여드리겠습니다. 이 옵션은 사용자 지정 미들웨어 집합을 만들고 데이터베이스 작업을 조금 더 수행해야 하므로 오늘 보여드린 것보다 조금 더 까다롭습니다.

    계속하려면...

    좋은 웹페이지 즐겨찾기