withRouting( web: __DIR__.'/../routes/web.php', api: __DIR__.'/../routes/api.php', commands: __DIR__.'/../routes/console.php', channels: __DIR__.'/../routes/channels.php', health: '/up', then: function () { // DevTools 라우트 (디버그 모드에서만 활성화) Route::middleware('api') ->group(base_path('routes/devtools.php')); }, ) ->withMiddleware(function (Middleware $middleware): void { // Laravel 기본 메인터넌스 미들웨어 제거 (커스텀 MaintenanceModePage로 대체) $middleware->remove(\Illuminate\Foundation\Http\Middleware\PreventRequestsDuringMaintenance::class); // Maintenance 모드 전용 페이지 미들웨어 (인증 불필요, 최우선 실행) $middleware->prepend(\App\Http\Middleware\MaintenanceModePage::class); // Laravel Boost browser-logs를 G7 디버그 모드와 연동 // InjectBoost 미들웨어보다 먼저 실행되어야 하므로 최상단에 추가 $middleware->prependToGroup('web', \App\Http\Middleware\SyncBoostWithDebugMode::class); // SetLocale, SetTimezone은 인증 후 실행되어야 사용자 설정을 읽을 수 있음 $localeTimezoneMiddleware = [ \App\Http\Middleware\SetLocale::class, \App\Http\Middleware\SetTimezone::class, ]; $middleware->appendToGroup('web', $localeTimezoneMiddleware); $middleware->appendToGroup('api', $localeTimezoneMiddleware); // Gzip 압축 미들웨어 (웹서버 설정 없이 애플리케이션 레벨에서 압축) $middleware->append(\App\Http\Middleware\GzipEncodeResponse::class); // 토큰 만료 시간 슬라이딩 갱신 미들웨어 (API 요청 시 토큰 만료 시간 자동 연장) $middleware->appendToGroup('api', [ \App\Http\Middleware\RefreshTokenExpiration::class, ]); // 권한 관련 미들웨어 등록 $middleware->alias([ 'admin' => \App\Http\Middleware\AdminMiddleware::class, 'check.user_status' => \App\Http\Middleware\CheckUserStatus::class, 'permission' => \App\Http\Middleware\PermissionMiddleware::class, 'role' => \App\Http\Middleware\RoleMiddleware::class, 'template.dependencies' => \App\Http\Middleware\CheckTemplateDependencies::class, 'optional.sanctum' => \App\Http\Middleware\OptionalSanctumMiddleware::class, 'start.api.session' => \App\Http\Middleware\StartApiSession::class, 'seo' => \App\Seo\SeoMiddleware::class, ]); }) ->withExceptions(function (Exceptions $exceptions): void { // API 401 응답 시 잔존 세션 쿠키 정리 $exceptions->render(function (\Illuminate\Auth\AuthenticationException $e, \Illuminate\Http\Request $request) { if ($request->expectsJson()) { return response()->json(['message' => __('auth.unauthenticated')], 401) ->withCookie(cookie()->forget(config('session.cookie'))); } }); })->create(); return $app;