백엔드/Laravel
[Laravel] Sanctum을 활용한 상태 기반 인증 및 API 연결
알쓸신개
2024. 12. 19. 11:28
1. 문제 정의: API 라우트에서 세션이나 인증 값 사용 불가
Laravel의 api.php는 상태 비저장(Stateless) API를 위한 라우팅 파일입니다. 이로 인해 web.php에서 가능한 세션(Session) 또는 인증(Auth::user()) 값을 api.php에서는 기본적으로 사용할 수 없습니다.
이를 해결하기 위해, 상태 기반 인증을 API에도 적용할 수 있는 방법이 필요합니다.
2. Laravel Sanctum이란?
Laravel Sanctum은 라라벨 공식 인증 시스템으로, 두 가지 방식의 인증을 지원합니다.
2-1. API 토큰 인증
모바일 앱 또는 외부 서비스에서 사용되는 토큰 기반 인증
2-2. 상태 기반 인증
SPA(Single Page Application)에서 세션과 쿠키를 이용하는 인증
Sanctum은 이 두 방식을 모두 지원하며, 특히 상태 기반 인증을 통해 api.php에서도 세션과 Auth::user()를 사용할 수 있도록 합니다.
3. Sanctum 설치 및 설정
3-1. 패키지 설치
composer require laravel/sanctum
3-2. 설정 파일 퍼블리시
php artisan vendor:publish --provider="Laravel\Sanctum\SanctumServiceProvider"
이 명령어는 config/sanctum.php 파일을 생성합니다.
3-3. 마이그레이션 실행
php artisan migrate
personal_access_tokens 테이블이 생성됩니다.
3-4. 미들웨어 등록
app/Http/Kernel.php에서 api 미들웨어 그룹에 다음 항목을 추가합니다.
'api' => [
\Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class,
'throttle:api',
\Illuminate\Routing\Middleware\SubstituteBindings::class,
],
4. 상태 기반 인증 구현
4-1. CSRF 토큰 요청
Sanctum은 CSRF 보호를 요구합니다. 프론트엔드에서 /sanctum/csrf-cookie에 먼저 요청하여 CSRF 토큰을 받아야 합니다.
axios.get('/sanctum/csrf-cookie').then(() => {
axios.post('/login', {
email: 'user@example.com',
password: 'password'
});
});
4-2. API 인증 라우트 구성
api.php에 인증 미들웨어를 적용하여 인증된 사용자만 접근 가능한 라우트를 생성합니다.
use Illuminate\Http\Request;
Route::middleware('auth:sanctum')->get('/user', function (Request $request) {
return $request->user();
});
4-3. 로그인 및 로그아웃 처리
- 로그인: /login 엔드포인트를 사용해 기본 인증 처리
- 로그아웃: /logout 엔드포인트로 세션 종료
5. 요약 및 장점
5-1. 상태 기반 인증 제공
세션과 쿠키 기반 인증으로 Auth::user() 사용 가능
5-2. 간단한 설치와 설정
Laravel 프로젝트에서 기본적으로 쉽게 적용 가능
5-3. SPA 및 프론트엔드 통합에 적합
Vue, React 등 SPA 프론트엔드와의 통합에 최적화