티스토리 뷰

배움/PHP

Laravel JWT 구현

spaces25 2025. 5. 26. 17:45
반응형

✅ Laravel에서 JWT 인증 구현 단계

1. Laravel 프로젝트 생성 (생략 가능)

laravel new jwt-example
cd jwt-example

2. tymon/jwt-auth 패키지 설치

composer require tymon/jwt-auth

3. 서비스 프로바이더 및 alias 등록 (Laravel 5.x 필요 / Laravel 6 이상은 생략 가능)

config/app.php (Laravel 6 이상에서는 필요 없음)

'providers' => [
    Tymon\JWTAuth\Providers\LaravelServiceProvider::class,
],

4. 패키지 설정 파일 생성

php artisan vendor:publish --provider="Tymon\JWTAuth\Providers\LaravelServiceProvider"

설정 파일이 config/jwt.php로 생성됩니다.


5. JWT 시크릿 키 생성

php artisan jwt:secret

.env 파일에 JWT_SECRET=... 키가 추가됩니다.


6. User 모델 설정

App\Models\User 또는 App\User 클래스에 JWTSubject 인터페이스를 구현:

use Tymon\JWTAuth\Contracts\JWTSubject;

class User extends Authenticatable implements JWTSubject
{
    use Notifiable;

    public function getJWTIdentifier()
    {
        return $this->getKey(); // 보통 PK (id)
    }

    public function getJWTCustomClaims()
    {
        return []; // 커스텀 claims 추가 가능
    }
}

7. 인증 Guard 설정

config/auth.php에서 guards 수정:

'guards' => [
    'api' => [
        'driver' => 'jwt',
        'provider' => 'users',
    ],
],

8. AuthController 작성 (로그인 / 회원가입 등)

php artisan make:controller AuthController

 

app/Http/Controllers/AuthController.php 예시:

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

class AuthController extends Controller
{
    public function register(Request $request)
    {
        $user = User::create([
            'name' => $request->name,
            'email' => $request->email,
            'password' => Hash::make($request->password),
        ]);

        $token = JWTAuth::fromUser($user);

        return response()->json(compact('user', 'token'));
    }

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

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

        return response()->json(compact('token'));
    }

    public function me()
    {
        return response()->json(auth()->user());
    }

    public function logout()
    {
        auth()->logout();
        return response()->json(['message' => 'Successfully logged out']);
    }

    public function refresh()
    {
        return response()->json(['token' => auth()->refresh()]);
    }
}

9. 라우트 정의

routes/api.php 파일에 다음과 같이 추가:

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

Route::middleware('auth:api')->group(function () {
    Route::get('me', [AuthController::class, 'me']);
    Route::post('logout', [AuthController::class, 'logout']);
    Route::post('refresh', [AuthController::class, 'refresh']);
});

 


🔐 테스트 시 주의 사항

  • 인증된 요청에는 반드시 Authorization: Bearer <token> 헤더를 추가해야 합니다.
  • Postman 등을 사용할 때 이 헤더를 설정해야 보호된 라우트 접근이 가능합니다.
반응형

'배움 > PHP' 카테고리의 다른 글

Laravel 11 Swagger  (0) 2025.06.02
Laravel 11 비동기 구현  (0) 2025.05.27
PHP supervisor 설치 및 실행  (0) 2025.05.21
Laravel11 브로드캐스팅 PrivateChannel , reverb 사용 예시  (0) 2025.05.19
Laravel 11 테스트 코드 작성 샘플  (0) 2025.05.14
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/08   »
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
글 보관함