NGINX 액세스 로그의 Laravel 인증 사용자 ID
이를 달성하기 위한 2가지 부분이 있습니다.
응답 헤더로 사용자 ID 추가
이 목적을 위해 미들웨어를 사용하는 것이 가장 합리적이며 Laravel과 PHP 8 구문 덕분에 정말 간단하게 만들 수 있습니다.
app/Http/Middleware/AppendUserIdToResponse.php
파일을 만듭니다.<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\Response;
class AppendUserIdToResponse
{
public function handle(Request $request, Closure $next): Response
{
/** @var \Symfony\Component\HttpFoundation\Response $response */
$response = $next($request);
$response->headers->set('x-user', $request->user()?->id ?? '-');
return $response;
}
}
Note: I'm taking
$request->user()?->id
here but nothing is stopping you from using$request->user()?->username
if that makes more sense for you.
우리는 항상 헤더를 추가하지만 사용자가 로그인하지 않은 경우 헤더가 전혀 설정되지 않은 경우 NGINX가 기본적으로 사용하는
-
로 기본 설정됩니다.다음으로 이 새로운 미들웨어를
app/Http/Kernel.php
배열의 $middleware
에 등록할 것입니다. /**
* The application's global HTTP middleware stack.
*
* These middleware are run during every request to your application.
*
* @var array
*/
protected $middleware = [
// \App\Http\Middleware\TrustHosts::class,
\App\Http\Middleware\TrustProxies::class,
\Fruitcake\Cors\HandleCors::class,
\App\Http\Middleware\PreventRequestsDuringMaintenance::class,
\Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
\App\Http\Middleware\TrimStrings::class,
\Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
+ \App\Http\Middleware\AppendUserIdToResponse::class,
];
Note: We are adding it to the global middleware stack to make sure it runs for every request instead of needing to register it per route.
이것은 Laravel 측을 위한 것입니다(배포하는 것을 잊지 마십시오)!
NGINX 로그 형식에 사용자 ID 추가
이 부분은 좀 더 "맞춤형"이며 NGINX 및 로그 형식을 설정한 방법에 따라 다르지만 한 번 시도해 보겠습니다!
사용자 정의 로그 형식은
/etc/nginx/nginx.conf
(http {}
블록 내)에서 정의할 수 있으며 다음과 같이 보일 수 있습니다.log_format main_ext '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for" '
'"$host" sn="$server_name" '
'rt=$request_time '
'ua="$upstream_addr" us="$upstream_status" '
'ut="$upstream_response_time" ul="$upstream_response_length" '
'cs=$upstream_cache_status '
'uid="$upstream_http_x_smls_user"';
Note: this
log_format
is the log format required by NGINX Amplify and used as an example.
여기에 사용자 ID를 추가하려면 다음을 수행합니다.
log_format main_ext '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for" '
'"$host" sn="$server_name" '
'rt=$request_time '
'ua="$upstream_addr" us="$upstream_status" '
'ut="$upstream_response_time" ul="$upstream_response_length" '
- 'cs=$upstream_cache_status';
+ 'cs=$upstream_cache_status '
+ 'uid="$upstream_http_x_user"';
마지막에 추가된
uid="$upstream_http_x_user"
에 주목하세요. 사용자uid="1"
가 로그인되어 있으면 1
로, 로그인한 사용자가 없으면 uid="-"
로 렌더링됩니다.사용자 정의
log_format
가 없는 경우 기본combined
형식을 사용하고 있을 수 있습니다. combined
필드가 추가된 이 로그 형식uid
을 추가하십시오.log_format combined_with_user_id '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" '
'uid="$upstream_http_x_user"';
그런 다음 가상 호스트에서
access_log
항목을 찾고 올바른 로그 형식이 사용되었는지 확인해야 합니다.server {
...
access_log /var/log/nginx/access.log combined_with_user_id; # or whatever you named your log format
error_log /var/log/nginx/error.log warn;
...
}
마지막 선택적 단계가 하나 있는데, 이는 응답에서 이 헤더를 숨기는 것입니다. 보안 문제가 아니어야 하지만 응답에 해당 헤더를 포함할 이유가 없으므로 숨길 것입니다.
vhost 구성에서
fastcgi_pass
섹션을 찾아 fastcgi_hide_header x-user;
를 추가하면 다음과 같이 보일 수 있습니다.location = /index.php {
include /etc/nginx/fastcgi_params;
fastcgi_param HTTPS on;
fastcgi_param HTTP_SCHEME https;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
fastcgi_pass php80;
fastcgi_index index.php;
fastcgi_hide_header x-user;
fastcgi_hide_header x-powered-by;
fastcgi_split_path_info ^(.+\.php)(.*)$;
}
마무리
이러한 변경을 수행한 후 NGINX는 사용자
uid="1"
가 로그인한 경우 1
를 추가하거나 액세스 로그 항목에 로그인한 사용자가 없는 경우 uid="-"
를 추가해야 합니다.한 가지 주의할 점은 이것이 "동적"요청, 즉 Laravel/PHP에서 처리하는 요청에만 작동하므로 정적 파일(예: CSS/JS)에는 항상
uid="-"
가 있다는 것입니다.
Reference
이 문제에 관하여(NGINX 액세스 로그의 Laravel 인증 사용자 ID), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/stayallive/laravel-authenticated-user-id-in-nginx-access-log-2n78텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)