박주니 개발 정리

laravel sanctum middleware 응용 방법 본문

라라벨

laravel sanctum middleware 응용 방법

박주니 2024. 1. 30. 16:14
728x90
반응형

설명전)

설명 듣기전 먼저 laravel sanctum 로그인 방법부터 보는 것을 추천합니다. 지금 이 방법은 그 이후에 token에 연결된 user 정보를 가지고 와서 추가 체크하는 방법을 구현 후 추가 middleware 설정하는 방법입니다. 

 

1. login 상세 middleware/UserToken.php를 생성합니다. 

php artisan make:middleware UserToken

 

설명)

UserToken.php는 유저가 로그인했을 때 token에 연결된 user 정보기반으로 체크해서 정보가 맞으면 next 아니면 403에러가 나오게 할 것입니다. 

 

2. Http/Kernel.php에서 routeMiddleware에 UserToken을 연결합니다.

    protected $routeMiddleware = [
        'user' => \App\Http\Middleware\UserToken::class,
    ];

설명)

'user' - api.php에 연결할 때 middleware name

'\App\Http\Middleware\UserToken::class' - 연결할 middleware 파일 위치 

 

3. api.php에서 auth:sanctum middleware 이후에 'user' middleare가 진행될 수 있게 설정합니다. 

Route::group(['middleware' => ['auth:sanctum', 'throttle:300,1','user']], function(){
	// 로그인 이후 사용할 Route 설정 
})

설명)

auth:sanctum 을 통해 1차 token 유효성 체크를 하고 2차적으로 'user' 즉 UserToken.php 를 통해 token user check를 진행할 것입니다. 

 

4. Middleware/UserToken.php에서 Auth::user() 했을 때 정상적으로 로그인한 유저 정보가 나오는 지 확인합니다. 

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Log;
class UserToken
{
    public function handle(Request $request, Closure $next)
    {
        $user = Auth::user();
		Log::info($user);
    }
}

설명)

Auth::user() 로그를 확인했을 떄  현재 token match를 했을 때 연결된 user_id를 기반으로 정보를 가지고 오는 것을 확인하실 수 있습니다.

 

5. 추가적으로 조건을 해당 $user에 대한 token이 존재할경우 next 아니면 403에러가 나오게 만듭니다. 

    public function handle(Request $request, Closure $next)
    {
        $user = Auth::user();
        // 요청을 보낸 사용자의 토큰과 연결된 ID가 현재 인증된 사용자의 ID와 일치하는지 확인
        if ($user) {
            return $next($request);
        }

        // 위 조건에 해당하지 않으면 접근 거부
        return response()->json(['message' => 'Unauthorized'], 403);
    }

주의사항)

이 방법은 웹에서 로그인했을 때 token을 확인할경우 단순한 방법으로 접근할 때는 문제가 없지만 postman으로 발행된 token을 넣고 다른 이벤트를 실행하면 문제가 발생됩니다. 

 

6. 유저 정보를 가지고 오는 controller이 존재할경우 data에서 user_id를 받아서 사용하는 것이 아닌 접속한 user token 기반으로 구현을 합니다. 

// 인증된 유저
$authUser = Auth::user();
// user id 가지고 올 때 
$user_id = $authUser->id;

설명)

이 방법을 접근하게 되면 token에 해당된 user_id만 접근할 수 있습니다.

 

느낀점)

개인정보는 client cookie로 다루는 것이 아니라 http-cookie로 노출되지 않게 관리하거나 지금처럼 프레임워크에서 제공하는 것을 최대한 활용해야한다는 것을 느꼈습니다. 

사용자가 개발자도구를 통해 cookie를 봤을 때 현재 api에 접근할 수 있는 key들이 존재한다면 그건 나중에 문제가 될 수 있는 요인이기 때문에 개발자는 구현만 한다고해서 개발자가 아닌 여러 경우의 수에도 견고하게 잘만드는 것이 기본 소양임을 다시 한번 느꼈습니다. 

728x90
반응형
Comments