Laravel Passport 최신 스코프 – 속성 기반 OAuth 스코프 적용
Source: Dev.to
Laravel Passport는 전통적으로 라우팅 레벨에서 OAuth 스코프를 적용하며, 보통 라우트 파일에 정의된 미들웨어를 통해 동작합니다. 이는 동작하지만 다음과 같은 문제를 일으키는 경우가 많습니다:
- 라우트마다 흩어져 있는 인가 규칙
- 인프라스트럭처와 결합된 컨트롤러
- 중복되거나 검토하기 어려운 스코프 요구사항
- API가 성장함에 따라 명확성이 떨어짐
Laravel Passport Modern Scopes는 다른 접근 방식을 제시합니다.
아이디어: 의미 있는 곳에 스코프 선언하기
스코프를 라우트에 연결하는 대신, 이 패키지는 PHP 8 어트리뷰트를 사용해 컨트롤러 혹은 컨트롤러 액션에 직접 OAuth 스코프 요구사항을 선언할 수 있게 합니다. 인가 의도는 보호하는 코드 바로 옆에 위치하고, Passport는 인증 및 토큰 검증을 완전히 담당합니다.
예시
use N3XT0R\PassportModernScopes\Support\Attributes\RequiresScope;
use N3XT0R\PassportModernScopes\Support\Attributes\RequiresAnyScope;
#[RequiresScope('users:read')]
final class UserController
{
public function index()
{
// Requires users:read
}
#[RequiresAnyScope('users:update', 'users:write')]
public function update()
{
// Requires at least one of the given scopes
}
}
단일 미들웨어가 런타임에 컨트롤러 어트리뷰트를 검사하고 Laravel Passport의 기본 tokenCan 검사를 사용해 이를 강제합니다. 인증 자체는 설정된 가드(예: auth:api)의 책임으로 남아 있습니다.
이 패키지가 하는 일
- 어트리뷰트 기반 OAuth 스코프 적용을 지원
- 라우트를 깔끔하게 유지하고 인프라와 무관하게 설계
- 인가 요구사항을 명시적이고 탐색 가능하게 함
- Passport 기존 스코프 검증과 호환
- Passport 내부 구조를 변경할 필요 없음
스코프는 연결되는 것이 아니라 선언되는 것입니다.
어트리뷰트를 사용하는 이유
- 선언적이고 명시적임
- 라우트와 컨트롤러 사이에 중복이 없음
- 코드 리뷰 시 이해가 쉬움
- 정적 분석 및 문서 도구와 친화적
- 라우트 정의에 흩어져 있는 매직 문자열이 없음
이렇게 하면 인가 의도가 HTTP 연결과 분리됩니다.
이 패키지가 하지 않는 일
- ❌ Laravel Passport를 대체하지 않음
- ❌ 인증을 구현하지 않음
- ❌ 커스텀 가드를 도입하지 않음
- ❌ 비즈니스 규칙을 강제하지 않음
오직 선언된 OAuth 스코프 요구사항만을 해석하고 적용합니다.
아키텍처 상 위치
Laravel Passport Modern Scopes는 의도적으로 작고 집중된 패키지입니다. 다음과 잘 어울립니다:
- 구조화된 스코프 모델(
resource:action등) - 도메인 레벨 인가 로직
- 중앙에서 스코프를 관리하는 관리자 도구
단독으로 사용하거나 상위 수준 인가 라이브러리와 함께 사용할 수 있습니다.
설치
composer require n3xt0r/laravel-passport-modern-scopes:^2.0
미들웨어는 패키지의 서비스 프로바이더를 통해 자동으로 등록됩니다.
마무리 생각
이 패키지는 추상화가 아니라 명확성에 중점을 둡니다. 다음을 선호한다면:
- 명시적인 인가 요구사항
- 깔끔한 라우트
- 의도를 명확히 표현하는 컨트롤러
어트리뷰트 기반 스코프 적용은 매우 자연스러운 선택이 될 수 있습니다.
피드백과 토론을 환영합니다.