Laravel로 JWT 기반 API 구현 방법

서론

API를 만들때 JWT(Json Web Token)을 사용하는 이유가 무엇일까? 이 이유를 이해하기 위해서는, API의 특성과 인증 및 권한부여의 필요성을 알고있어야 한다. 이러한 이유들을 알아보고, 간단하게 JWT를 사용해서 API를 구현하는 방법을 알아본다.

 

 

API 개발에 JWT를 사용하는 이유

RESTful API는 상태 비저장(stateless)을 원칙으로 한다. 이는 서버가 클라이언트의 상태 정보를 유지하지 않아야 함을 의미하는데, JWT는 이 원칙을 준수한다. 토큰은 클라이언트에 의해 저장되며 서버는 상태 정보를 유지할 필요가 없어진다. 서버가 사용자 상태를 유지하지 않기 때문에, 요청은 어느 서버에서나 처리될 수 있다. 이는 로드 밸런싱과 서비스의 확장성에 유리해진다.

 

그리고 JWT는 디지털 서명을 통해 보안성을 강화한다. 서명된 토큰은 정보의 무결성과 인증된 출처를 보장하여 강력한 보안 메커니즘을 제공한다. 필요한 경우, JWT는 중요 정보를 암호화하여 추가적인 보안 계층을 제공할 수 있다.

 

사용자가 로그인하면, 서버는 JWT를 생성하여 클라이언트에 반환한다. 이후 클라이언트는 API 요청에 JWT를 포함시켜 서버의 인증 과정을 거친다. 세션을 유지할 필요가 없으므로 프로세스가 간소화 되는 것이다. JWT는 사용자에 대한 정보(권한,사용자 ID 등)를 포함하고 있어서 각 요청마다 필요한 정보를 쉽게 추출할 수 있는 효율적인 인증 및 권한 부여도 가능하다.

 

또한 웹,모바일,데스크톱 등 다양한 클라이언트 환경에서 사용될 수 있으며 다양한 서비스 및 어플리케이션 간의 인증 정보를 공유할 수 있다는 강점을 가지고 있다. 세션 정보를 서버에 저장하고 관리하는 과정에 비해, JWT는 클라이언트 측에 저장되어 빠른 처리 속도를 갖는 것 또한 JWT를 사용하는 이유중 큰 비중을 차지한다.

 

 

Laravel에서 JWT를 사용한 API 구현 예제

Laravel을 사용하여 JWT (JSON Web Token) 기반의 API를 만들어 보자. 본 포스팅에서는 대략적으로 JWT 패키지 설치, 설정, 사용자 인증 및 토큰 생성, 그리고 API 라우트 보호에 대해 다룬다.

 

1. JWT 패키지 설치 : Laravel에서 JWT를 사용하기 위해 일반적으로 tymon/jwt-auth 패키지를 설치한다.

composer require tymon/jwt-auth

 

2. 서비스 프로바이더 등록 및 구성 : 설치 후, 서비스 프로바이더를 config/app.php에 등록한다. 그 후 artisan 명령어를 통해 JWT를 위한 비밀키를 생성한다

'providers' => [
    ...
    Tymon\JWTAuth\Providers\LaravelServiceProvider::class,
],
php artisan jwt:secret

이 명령어를 통해 ".env" 파일에 'JWT_SECRET' 키가 추가된다.

 

3. 사용자 모델 설정 : User 모델에서 Tymon\JWTAuth\Contracts\JWTSubject 인터페이스를 구현한다.

use Tymon\JWTAuth\Contracts\JWTSubject;

class User extends Authenticatable implements JWTSubject
{
    // ...

    public function getJWTIdentifier()
    {
        return $this->getKey();
    }

    public function getJWTCustomClaims()
    {
        return [];
    }
}

 

4. 인증 컨트롤러 생성 : JWT를 사용하여 사용자를 인증하는 컨트롤러를 만든다.

php artisan make:controller AuthController

AuthController 내부에서 사용자 인증 및 토큰 생성 로직을 구현한다.

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use App\Models\User;
use Tymon\JWTAuth\Facades\JWTAuth;

class AuthController extends Controller
{
    public function login(Request $request)
    {
        $credentials = $request->only('email', 'password');

        if (!$token = Auth::attempt($credentials)) {
            return response()->json(['error' => 'Unauthorized'], 401);
        }

        return $this->respondWithToken($token);
    }

    protected function respondWithToken($token)
    {
        return response()->json([
            'access_token' => $token,
            'token_type' => 'bearer',
            'expires_in' => auth()->factory()->getTTL() * 60
        ]);
    }
}

 

5. 라우트 설정 : routes/api.php 파일에서 인증 관련 라우트를 설정한다.

Route::post('login', [AuthController::class, 'login']);

 

6. 라우트 보호 : JWT 미들웨어를 사용하여 특정 라우터를 보호할 수 있다.

Route::group(['middleware' => ['jwt.verify']], function() {
    // 보호된 라우트
    Route::get('mypage', [MypageController::class, 'index']);
});

 

 

 

결론

위에서 설명한 기본적인 코드 예제들을 통해 Laravel에서 JWT를 사용하여 API를 구축하는 과정을 파악해보았다. 실제 프로젝트에서는 추가적인 보안 조치, 예외 처리, 데이터 검증 등을 고려해서 API를 구현해야 한다.