백엔드/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 프론트엔드와의 통합에 최적화


6. 참고 자료

Laravel Sanctum 공식 문서
Axios + Sanctum SPA 예제