일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- nodejs
- 배포
- 라라벨
- CSS
- NextJS
- pagination
- 공연티켓
- netfunnel
- React
- threejs
- nginx
- exceljs
- Python
- metamask
- 블록체인
- Setting
- 오블완
- Remix
- polygon
- Kaikas
- 회고
- 티스토리챌린지
- nft
- Ai
- node
- chatGPT
- miniconda
- jquery
- Laravel
- PM2
- Today
- Total
박주니 개발 정리
laravel sanctum middleware 응용 방법 본문
설명전)
설명 듣기전 먼저 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들이 존재한다면 그건 나중에 문제가 될 수 있는 요인이기 때문에 개발자는 구현만 한다고해서 개발자가 아닌 여러 경우의 수에도 견고하게 잘만드는 것이 기본 소양임을 다시 한번 느꼈습니다.