Laravel Sentinel은 라우트로의 접근을 드라이버 기반으로 제어하는 보안 미들웨어 패키지입니다. Taylor Otwell과 Mior Muhammad Zaki에 의해 개발되었으며, PHP ^8.0 / Laravel 8~13에 대응하고 있습니다.주요 용도는 Telescope · Horizon · Pulse 같은 관리 도구 계열 라우트의 보호입니다. SentinelMiddleware를 라우트에 적용하는 것만으로, 드라이버가 정의한 인가 로직으로 접근을 제어할 수 있습니다.
Telescope나 Horizon에는 각각 gate를 사용한 인가 구조가 준비되어 있었습니다.
// 기존 방법 (TelescopeServiceProvider 등)Gate::before(function ($user) { return $user->isAdmin() ? true : null;});
이 방식은 사용자의 인증 상태에 의존하고 있어, “로그인하지 않으면 판정할 수 없다”는 문제가 있었습니다. Sentinel은 미들웨어로 동작하므로, 인증의 유무와 관계없이 요청 단위로 접근을 제어할 수 있습니다. 또한 여러 관리 도구에 대해 한 곳에서 룰을 정의할 수 있습니다.
Driver 추상 클래스를 상속하여 authorize() 메서드를 구현함으로써 커스텀 드라이버를 만들 수 있습니다.
use Laravel\Sentinel\Sentinel;use Laravel\Sentinel\Drivers\Driver;use Illuminate\Http\Request;Sentinel::extend('admin-only', function ($app) { return new class extends Driver { public function authorize(Request $request): bool { // 인증되어 있고 admin 롤을 가진 사용자만 허가 $user = $request->user(); return $user !== null && $user->hasRole('admin'); } };});
extend()의 등록은 AppServiceProvider::boot() 등에서 수행합니다.
SentinelManager는 Illuminate\Support\Manager를 상속하고 있습니다. Manager는 드라이버 패턴을 구현하기 위한 Laravel의 기반 클래스로, driver()로 드라이버 인스턴스를 캐시하면서 해결합니다.
// src/SentinelManager.phpclass SentinelManager extends Manager{ protected function createLaravelDriver() { return new Laravel(fn () => $this->getContainer()); } public function getDefaultDriver() { return 'laravel'; } public function driverOrFallback(?string $driver) { return rescue( fn () => $this->driver($driver), value(fn () => $this->driver()), false // 로그에 기록하지 않음 ); }}
driverOrFallback()은 지정한 드라이버가 발견되지 않는 경우에도 기본 드라이버로 조용히 폴백하므로, 미들웨어 인자에 존재하지 않는 드라이버 이름을 전달해도 오류가 나지 않습니다.SentinelManager는 SentinelServiceProvider에 의해 스코프 부여 싱글톤(scoped)으로 등록되므로, 1요청 내에서 드라이버의 인스턴스가 재이용됩니다.
// src/SentinelServiceProvider.phppublic function register(): void{ $this->app->scoped(SentinelManager::class, fn ($app) => new SentinelManager($app));}