$request->ip(), 'user_id' => optional($request->user())->id, 'method' => $request->method(), 'uri' => $request->getRequestUri(), 'input' => $request->all(), 'headers' => $request->headers->all(), ]); $apiKey = $request->header('X-API-KEY'); $validApiKey = false; // 1. API 키가 유효한지 확인 if ($apiKey) { $validApiKey = DB::table('api_keys') ->where('key', $apiKey) ->where('is_active', true) ->exists(); } if (!$validApiKey) { return response()->json(['message' => 'Unauthorized. Invalid or missing API key'], 401); } // Bearer 인증 (Sanctum) $user = []; if($token = $request->bearerToken()) { $accessToken = PersonalAccessToken::findToken($token); if ($accessToken && $accessToken->tokenable instanceof User) { $user = $accessToken->tokenable; if ($user) { // 기본 테넌트(여러개 소속시 우선순위) $tenantId = $user->tenant?->tenant_id ?? $user->userTenants->first()?->tenant_id; $request->attributes->set('tenant_id', $tenantId); $request->attributes->set('api_user', $user->id); // ApiKeyMiddleware 등에서 app()->instance('api_user', $user->id); app()->instance('tenant_id', $tenantId); } } } $response = $next($request); // 응답 정보 저장 Log::info('API Response', [ 'uri' => $request->getRequestUri(), 'status' => $response->getStatusCode(), 'content' => $response->getContent(), // 응답 body도 원하면! ]); return $response; } }