본문 바로가기
Framework/Laravel Framework

[Laravel] sanctum (API 인증) 구축

by 원동호 2021. 8. 24.
반응형

구성 : Laravel Framework 8.5

2021.05.21 - [Framework/Laravel Framework] - [Laravel] JWT API Server 구축하기(1)

2021.05.25 - [Framework/Laravel Framework] - [Laravel] JWT API Server 구축하기(2)

 

전 포스팅에서는 JWT를 이용하여 구축해 보았다. 이번 포스팅에서는 토큰 기반이지만 JWT보다는 가벼운 너낌..?의 sanctum을 이용하여 구축해볼 것이다.

 

https://laravel.kr/docs/8.x/sanctum

 

라라벨 메뉴얼에 설명이 아주 잘 되어 있으므로 간략하게 내용 정리만 하고 코드를 살펴 보겠다.

sanctum을 이용하면 API 토큰 발급과 SPA(Single Page Application) 인증시 사용할 수 있다.

이번 포스팅에서는 API 토큰에 관해서만 진행하도록 하겠다. 실습은 Postman으로 진행.

 

API 인증

  • Sanctum은 OAuth의 복잡함 없이 사용자에게 API 토큰을 발행하는 단순한 패키지이다.
  • Sanctum을 사용하여 해당 토큰을 생성하고 관리 할 수 있습니다. 이러한 토큰들은 매우 긴 만료일(몇 년)을 가지고 있지만, 어느 때라도 사용자에 의해서 해지(revoke) 할 수도 있다.
  • Sanctum은 단일 데이터베이스 테이블 내에 사용자 API 토큰을 저장하고, 유효한 API 토큰을 포함해야하는 Authorization 헤더를 통해 오는 요청(request)만 인증에 성공하게 된다.

 

설치

1. Composer

composer require laravel/sanctum

2. vendor:publish

php artisan vendor:publish --provider="Laravel\Sanctum\SanctumServiceProvider"

3. migration (token을 위한 personal_access_tokens table이 생성된다.)

본 포스팅에서는 Sanctum에서 제공하는 기본 migration을 이용한다.

php artisan migrate

4. User 모델 확인

토큰을 생성하기 전에 User모델이 HasApiTokens trait을 사용하고 있는지 확인한다. 값이 지정되지 않다면 코드를 수정하도록 하자.

use Laravel\Sanctum\HasApiTokens;

class User extends Authenticatable
{
    use HasApiTokens, HasFactory, Notifiable;
    .
    .
    .
 }

5. 회원가입 및  Token 발급

// 회원가입
Route::post('/sanctum/register',function (Request $request) {
    User::create([
        'email' => $request->input('email'),
        'password' => bcrypt($request->input('password')),
        'name' => $request->input('name')
    ]);
    return response()->json(['message'=>'success'],200);
});

회원가입

 

// 토큰 발급
Route::post('/sanctum/token', function (Request $request) {
    $request->validate([
        'email' => 'required|email',
        'password' => 'required',
    ]);

    $user = User::where('email', $request->email)->first();

    if (! $user || ! Hash::check($request->password, $user->password)) {
        throw ValidationException::withMessages([
            'email' => ['The provided credentials are incorrect.'],
        ]);
    }
    // createToken의 인자는 token table의 name 컬럼 값에 저장된다. 
    return $user->createToken('token-name')->plainTextToken;
});

토큰 발급

sanctum token table에 저장된 걸 확인할 수 있다.

6. 발급한 토큰으로 API 요청

Route::middleware(['auth:sanctum'])->group(function () {
    Route::get('/users',function (Request $request){
        return User::find(1);
    });
});

토큰 발급 API 요청 후 응답값을 Authorization->Bearer Token을 선택하고 Token에 값을 입력한 후 요청한다.

토큰값이 잘못되거나, 누락 될 경우엔 처리를 하지 않았으므로 PHP 에러가 발생한다.

 

7. 만료 시간 설정

config\sanctum.php

<?php

return [
.
.
// null 일때는 만료 시간이 없으므로 영구하게 사용할 수 있다.
// 만료 기간을 지정하려면 null 대신 값을 입력하면 된다.
    'expiration' => null,
.
.
];

 

 

반응형

댓글