Laravel Passport로 API 인증 구현하기 🔐
안녕하세요, 개발자 여러분! 오늘은 Laravel Passport를 이용해서 API 인증을 구현하는 방법에 대해 알아볼 거예요. 😎 API 인증이라고 하면 좀 어렵게 들릴 수 있지만, 걱정 마세요! 제가 쉽고 재미있게 설명해드릴게요. ㅋㅋㅋ
먼저, API 인증이 뭔지 간단히 설명하자면, 우리가 만든 API를 허가받은 사용자만 사용할 수 있도록 하는 방법이에요. 마치 비밀 클럽에 들어갈 때 비밀번호를 말해야 하는 것처럼요! 🕵️♂️
Laravel Passport는 이런 API 인증을 쉽게 구현할 수 있도록 도와주는 Laravel의 공식 패키지예요. 이걸 사용하면 복잡한 OAuth2 인증을 손쉽게 구현할 수 있답니다!
자, 그럼 이제 본격적으로 Laravel Passport를 사용해서 API 인증을 구현하는 방법을 알아볼까요? 준비되셨나요? 레츠고! 🚀
1. Laravel Passport 설치하기 📦
먼저, Laravel Passport를 설치해야 해요. 터미널을 열고 프로젝트 디렉토리로 이동한 다음, 다음 명령어를 실행해주세요:
composer require laravel/passport
이 명령어를 실행하면 Composer가 Laravel Passport와 필요한 의존성들을 설치해줄 거예요. 설치가 완료되면 다음 단계로 넘어갈 수 있어요!
설치가 끝났다면, 이제 데이터베이스 마이그레이션을 실행해야 해요. Passport는 토큰을 저장하기 위한 테이블들을 생성해야 하거든요. 다음 명령어를 실행해주세요:
php artisan migrate
이 명령어를 실행하면 필요한 테이블들이 데이터베이스에 생성될 거예요. 마치 마법처럼요! ✨
그 다음, Passport를 초기화해야 해요. 다음 명령어를 실행해주세요:
php artisan passport:install
이 명령어는 암호화 키를 생성하고, 클라이언트 접근 토큰을 생성하는 데 필요한 개인 키와 공개 키를 만들어줘요. 마치 비밀 요원이 암호를 만드는 것처럼요! 🕵️♀️
여기까지 하면 Laravel Passport의 기본적인 설치가 완료됐어요. 이제 우리의 애플리케이션에 Passport를 통합할 준비가 됐답니다!
참고: Laravel Passport를 설치하고 나면, 여러분의 프로젝트에 새로운 기능들이 추가돼요. 마치 슈퍼히어로가 새로운 능력을 얻은 것처럼요! 🦸♂️ 이제 여러분은 OAuth2 인증을 쉽게 구현할 수 있게 됐답니다.
자, 이제 기본적인 설치는 끝났어요. 다음 단계로 넘어가볼까요? 😉
2. Passport 설정하기 ⚙️
이제 우리의 Laravel 애플리케이션에 Passport를 통합할 차례예요. 이 과정은 마치 퍼즐을 맞추는 것과 비슷해요. 각 조각을 올바른 위치에 놓아야 해요!
먼저, App\Models\User
모델에 Laravel\Passport\HasApiTokens
트레이트를 추가해야 해요. 이렇게 하면 우리의 User 모델이 API 토큰을 사용할 수 있게 돼요.
User 모델 파일을 열고 다음과 같이 수정해주세요:
use Laravel\Passport\HasApiTokens;
class User extends Authenticatable
{
use HasApiTokens, Notifiable;
// ...
}
이렇게 하면 User 모델이 API 토큰을 사용할 수 있는 슈퍼파워를 얻게 돼요! 🦸♀️
다음으로, App\Providers\AuthServiceProvider
클래스에 Passport 라우트를 등록해야 해요. 이 파일을 열고 boot
메소드에 다음 코드를 추가해주세요:
use Laravel\Passport\Passport;
public function boot()
{
$this->registerPolicies();
Passport::routes();
}
이렇게 하면 Passport가 필요한 라우트들을 자동으로 등록해줘요. 마치 마법사가 주문을 외우는 것처럼요! 🧙♂️
마지막으로, config/auth.php
파일에서 API 가드의 드라이버를 passport로 변경해야 해요. 이 파일을 열고 다음과 같이 수정해주세요:
'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'users',
],
'api' => [
'driver' => 'passport',
'provider' => 'users',
],
],
이렇게 하면 API 인증에 Passport를 사용하도록 설정이 완료돼요!
팁: 이 설정 과정은 마치 레고 블록을 조립하는 것과 같아요. 각 부분을 올바르게 연결해야 전체 시스템이 제대로 작동하죠. 하나라도 빠뜨리면 안 돼요!
여기까지 하면 Laravel Passport의 기본 설정이 모두 완료됐어요. 이제 우리의 애플리케이션은 API 인증을 위한 준비가 끝났답니다! 🎉
다음 단계에서는 실제로 API 토큰을 발급하고 사용하는 방법에 대해 알아볼 거예요. 재능넷에서 API를 사용해 다양한 재능을 거래하는 것처럼, 우리도 이제 안전하게 API를 사용할 수 있게 될 거예요!
자, 이제 다음 단계로 넘어갈 준비가 됐나요? 계속해서 Laravel Passport의 세계로 더 깊이 들어가볼까요? 😊
3. API 토큰 발급하기 🎫
자, 이제 우리의 API에 접근하기 위한 토큰을 발급하는 방법에 대해 알아볼 거예요. 이 과정은 마치 놀이공원의 입장권을 발급받는 것과 비슷해요. 토큰이 있어야 API라는 놀이기구를 탈 수 있는 거죠! 🎢
Laravel Passport는 여러 가지 방식으로 토큰을 발급할 수 있어요. 오늘은 가장 흔히 사용되는 두 가지 방법에 대해 알아볼 거예요.
3.1 Password Grant Tokens
Password Grant Tokens는 사용자의 이메일과 비밀번호를 직접 사용해 토큰을 발급받는 방식이에요. 이 방식은 자체 모바일 앱이나 SPA(Single Page Application)에서 주로 사용돼요.
먼저, 클라이언트를 생성해야 해요. 다음 명령어를 실행해주세요:
php artisan passport:client --password
이 명령어를 실행하면 클라이언트 ID와 비밀 키가 생성돼요. 이건 마치 비밀 요원의 신분증을 만드는 것과 같아요! 🕵️♂️
이제 토큰을 발급받기 위한 라우트를 만들어볼까요? routes/api.php
파일에 다음 코드를 추가해주세요:
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;
Route::post('/login', function (Request $request) {
$credentials = $request->only('email', 'password');
if (auth()->attempt($credentials)) {
$user = auth()->user();
$token = $user->createToken('MyApp')->accessToken;
return response()->json(['token' => $token], 200);
} else {
return response()->json(['error' => 'Unauthorized'], 401);
}
});
이 코드는 사용자의 이메일과 비밀번호를 확인하고, 인증이 성공하면 토큰을 발급해줘요. 마치 놀이공원 입구에서 티켓을 확인하고 입장 팔찌를 채워주는 것과 같죠! 🎡
3.2 Personal Access Tokens
Personal Access Tokens는 사용자가 직접 생성하고 관리할 수 있는 토큰이에요. 이 방식은 개발자나 파워 유저들이 API를 테스트하거나 장기적으로 사용할 때 유용해요.
Personal Access Token을 생성하는 라우트를 만들어볼까요? routes/api.php
파일에 다음 코드를 추가해주세요:
Route::middleware('auth:api')->post('/token/create', function (Request $request) {
$token = $request->user()->createToken($request->token_name);
return ['token' => $token->plainTextToken];
});
이 코드는 인증된 사용자가 자신만의 Personal Access Token을 생성할 수 있게 해줘요. 마치 자신만의 특별한 VIP 패스를 만드는 것과 같죠! 🌟
주의: 토큰은 매우 중요한 정보예요. 절대로 다른 사람에게 공유하면 안 돼요! 토큰을 가진 사람은 여러분의 계정으로 API에 접근할 수 있으니까요. 마치 집 열쇠와 같다고 생각하면 돼요. 🔑
자, 이제 우리는 API 토큰을 발급하는 방법을 배웠어요. 이 토큰들은 마치 재능넷에서 거래를 할 때 사용하는 인증 수단과 비슷해요. 안전하고 신뢰할 수 있는 거래를 위해 꼭 필요한 요소죠!
다음 단계에서는 이렇게 발급받은 토큰을 사용해 실제로 API에 접근하는 방법에 대해 알아볼 거예요. 준비되셨나요? 계속 가보자고요! 💪
4. API 엔드포인트 보호하기 🛡️
자, 이제 우리는 토큰을 발급받았어요. 그럼 이 토큰을 어떻게 사용할까요? 바로 API 엔드포인트를 보호하는 데 사용할 거예요! 이건 마치 비밀 클럽의 문을 지키는 것과 같아요. 올바른 암호(토큰)를 가진 사람만 들어올 수 있죠! 🚪
Laravel에서는 미들웨어를 사용해 API 라우트를 보호할 수 있어요. Passport는 auth:api
미들웨어를 제공하는데, 이걸 사용하면 인증된 요청만 API에 접근할 수 있게 돼요.
예를 들어, 사용자의 프로필 정보를 반환하는 API 엔드포인트를 만들어볼까요? routes/api.php
파일에 다음 코드를 추가해주세요:
Route::middleware('auth:api')->get('/user', function (Request $request) {
return $request->user();
});
이 코드는 /api/user
엔드포인트를 생성하고, auth:api
미들웨어로 보호해요. 이제 이 엔드포인트에 접근하려면 유효한 토큰이 필요해요!
그럼 이제 이 API를 어떻게 사용할 수 있을까요? 클라이언트 측에서는 HTTP 요청의 헤더에 토큰을 포함시켜 요청을 보내야 해요. 예를 들어, JavaScript를 사용한다면 다음과 같이 요청을 보낼 수 있어요:
fetch('http://your-app.com/api/user', {
headers: {
'Authorization': 'Bearer ' + accessToken
}
})
.then(response => response.json())
.then(data => console.log(data));
여기서 accessToken
은 우리가 이전 단계에서 발급받은 토큰이에요. 'Bearer '라는 접두사를 붙여야 한다는 점을 주의해주세요!
팁: API를 테스트할 때는 Postman 같은 도구를 사용하면 편리해요. Postman을 사용하면 다양한 HTTP 요청을 쉽게 보낼 수 있고, 헤더도 간단히 설정할 수 있답니다. 마치 슈퍼 개발자의 만능 도구 같은 거예요! 🦸♂️
이렇게 하면 우리의 API는 이제 안전하게 보호받고 있어요. 마치 재능넷에서 각 사용자의 개인 정보와 거래 내역을 안전하게 보호하는 것처럼요. 보안은 정말 중요하죠!
하지만 주의할 점이 있어요. 토큰은 매우 중요한 정보이기 때문에, 클라이언트 측에서 안전하게 저장해야 해요. 보통은 브라우저의 localStorage나 secureStorage에 저장하지만, 이것도 완벽하게 안전한 방법은 아니에요. 가능하다면 서버 측에서 세션을 관리하는 것이 더 안전할 수 있어요.
자, 이제 우리는 API를 안전하게 보호하는 방법을 배웠어요. 다음 단계에서는 토큰의 수명 주기와 관리에 대해 더 자세히 알아볼 거예요. API 보안의 세계는 정말 깊고 넓답니다! 계속 탐험해볼까요? 🚀
5. 토큰 관리하기 🔄
API 토큰을 발급하고 사용하는 방법을 배웠으니, 이제 이 토큰들을 어떻게 관리할지 알아볼 차례예요. 토큰 관리는 마치 집 열쇠를 관리하는 것과 비슷해요. 잘 간수해야 하고, 때로는 교체도 해야 하죠! 🔑
5.1 토큰 만료 설정
기본적으로 Passport의 액세스 토큰은 영원히 유효해요. 하지만 이건 보안상 좋지 않죠. 토큰의 수명을 제한하는 게 좋아요. AuthServiceProvider
의 boot
메소드에 다음 코드를 추가해 토큰의 수명을 설정할 수 있어요:
use Laravel\Passport\Passport;
public function boot()
{
$this->registerPolicies();
Passport::routes();
Passport::tokensExpireIn(now()->addDays(15));
Passport::refreshTokensExpireIn(now()->addDays(30));
}
이 코드는 액세스 토큰의 유효 기간을 15일, 리프레시 토큰의 유효 기간을 30일로 설정해요. 마치 놀이공원 입장권의 유효 기간을 정하는 것과 같죠! ⏳
5.2 토큰 폐기
때로는 토큰을 무효화해야 할 때가 있어요. 예를 들어, 사용자가 로그아웃할 때 토큰을 폐기하고 싶을 수 있죠. 이럴 때는 다음과 같은 코드를 사용할 수 있어요:
Route::middleware('auth:api')->post('/logout', function (Request $request) {
$request->user()->token()->revoke();
return response()->json(['message' => 'Successfully logged out']);
});
이 코드는 현재 사용 중인 토큰을 폐기해요. 마치 놀이공원에서 나올 때 입장 팔찌를 반납하는 것과 같죠! 👋
5.3 토큰 갱신
토큰의 수명이 다 되었을 때, 사용자가 다시 로그인하지 않고도 새 토큰을 받을 수 있게 하고 싶다면 리프레시 토큰을 사용할 수 있어요. 리프레시 토큰을 사용해 새로운 액세스 토큰을 발급받는 엔드포인트를 만들어볼까요?
Route::post('/token/refresh', function (Request $request) {
$request->validate([
'refresh_token' => 'required'
]);
$refresh_token = $request->refresh_token;
try {
$response = Http::asForm()->post('http://your-app.com/oauth/token', [
'grant_type' => 'refresh_token',
'refresh_token' => $refresh_token,
'client_id' => config('services.passport.client_id'),
'client_secret' => config('services.passport.client_secret'),
'scope' => '',
]);
return $response->json();
} catch (\Exception $e) {
return response()->json(['error' => 'Invalid refresh token'], 401);
}
});
이 코드는 리프레시 토큰을 사용해 새로운 액세스 토큰을 발급받아요. 마치 오래된 열쇠를 새 열쇠로 교환하는 것과 같죠! 🔁
참고: 리프레시 토큰을 사용할 때는 보안에 특히 주의해야 해요. 리프레시 토큰이 노출되면 공격자가 계속해서 새로운 액세스 토큰을 발급받을 수 있기 때문이에요. 리프레시 토큰은 반드시 안전한 곳에 저장해야 해요!
토큰 관리는 API 보안의 핵심이에요. 적절한 토큰 수명 설정, 필요할 때 토큰 폐기, 그리고 안전한 토큰 갱신 과정을 통해 우리의 API를 더욱 안전하게 만들 수 있어요.
이렇게 토큰을 잘 관리하면, 재능넷에서처럼 사용자들이 안전하게 API를 이용할 수 있어요. 사용자의 개인 정보와 거래 내역을 보호하면서도, 편리한 서비스를 제공할 수 있는 거죠!
자, 이제 우리는 Laravel Passport를 사용해 안전하고 효율적인 API 인증 시스템을 구축하는 방법을 배웠어요. 하지만 API 보안의 세계는 여기서 끝이 아니에요. 더 많은 것들이 우리를 기다리고 있죠! 다음 섹션에서는 좀 더 고급 주제들에 대해 알아볼 거예요. 준비되셨나요? 😊
6. 고급 주제: Scope와 권한 관리 🔬
자, 이제 우리는 Laravel Passport의 기본적인 사용법을 마스터했어요. 하지만 API 세계는 더 깊고 넓답니다. 이번에는 좀 더 고급 주제인 Scope와 권한 관리에 대해 알아볼 거예요. 이건 마치 놀이공원의 VIP 패스 시스템을 만드는 것과 비슷해요! 🎟️
6.1 Scope 정의하기
Scope는 토큰이 할 수 있는 일을 제한하는 방법이에요. 예를 들어, 'read' 스코프를 가진 토큰은 데이터를 읽을 수만 있고, 'write' 스코프를 가진 토큰은 데이터를 쓸 수 있게 하는 식이죠.
Scope를 정의하려면 AuthServiceProvider
의 boot
메소드에 다음과 같은 코드를 추가해요:
use Laravel\Passport\Passport;
public function boot()
{
$this->registerPolicies();
Passport::routes();
Passport::tokensCan([
'read-user' => 'Read user information',
'update-user' => 'Update user information',
'delete-user' => 'Delete user account',
]);
}
이렇게 하면 'read-user', 'update-user', 'delete-user'라는 세 가지 스코프를 정의할 수 있어요. 마치 놀이공원에서 각각 다른 권한을 가진 VIP 패스를 만드는 것과 같죠! 🎭
6.2 Scope 체크하기
Scope를 정의했다면, 이제 API 엔드포인트에서 이 Scope를 체크해야 해요. Laravel Passport는 이를 위한 편리한 미들웨어를 제공해요. 다음과 같이 사용할 수 있어요:
Route::get('/user', function (Request $request) {
// ...
})->middleware(['auth:api', 'scope:read-user']);
Route::put('/user', function (Request $request) {
// ...
})->middleware(['auth:api', 'scope:update-user']);
Route::delete('/user', function (Request $request) {
// ...
})->middleware(['auth:api', 'scope:delete-user']);
이렇게 하면 각 엔드포인트는 해당 Scope를 가진 토큰만 접근할 수 있어요. 마치 특정 VIP 패스가 있어야만 특정 놀이기구를 탈 수 있는 것처럼요! 🎢
6.3 토큰 발급 시 Scope 지정하기
토큰을 발급할 때 Scope를 지정할 수도 있어요. 다음과 같이 할 수 있죠:
$token = $user->createToken('Token Name', ['read-user', 'update-user'])->accessToken;
이렇게 하면 'read-user'와 'update-user' Scope를 가진 토큰이 생성돼요. 이 토큰으로는 사용자 정보를 읽고 수정할 수 있지만, 삭제는 할 수 없어요. 마치 일부 놀이기구만 탈 수 있는 제한된 VIP 패스를 발급받는 것과 같죠! 🎫
팁: Scope를 잘 활용하면 API의 보안을 더욱 강화할 수 있어요. 각 클라이언트나 사용자에게 꼭 필요한 권한만 부여함으로써, 혹시 토큰이 노출되더라도 피해를 최소화할 수 있죠!
6.4 사용자 정의 권한 체크
때로는 Scope만으로는 부족할 때가 있어요. 더 세밀한 권한 체크가 필요할 수 있죠. 이럴 때는 Laravel의 Gate 기능을 활용할 수 있어요. 예를 들어:
Gate::define('update-post', function ($user, $post) {
return $user->id === $post->user_id;
});
Route::put('/posts/{post}', function (Request $request, Post $post) {
if (Gate::denies('update-post', $post)) {
abort(403);
}
// 포스트 업데이트 로직
})->middleware('auth:api');
이 코드는 사용자가 자신의 포스트만 수정할 수 있도록 해요. 마치 놀이공원에서 자신의 사진이 찍힌 놀이기구 사진만 구매할 수 있는 것처럼요! 📸
이렇게 Scope와 사용자 정의 권한 체크를 조합하면, 매우 세밀하고 안전한 API를 만들 수 있어요. 재능넷에서 각 사용자가 자신의 재능 정보만 수정할 수 있고, 관리자만 모든 정보를 볼 수 있게 하는 것처럼 말이죠!
자, 이제 우리는 Laravel Passport를 사용해 정말 강력하고 유연한 API 인증 시스템을 구축하는 방법을 배웠어요. 기본적인 토큰 발급부터 Scope를 이용한 세밀한 권한 관리까지, API 보안의 다양한 측면을 다뤘죠.
이 지식을 바탕으로 여러분은 이제 재능넷과 같은 복잡한 플랫폼의 API도 안전하게 구현할 수 있을 거예요. 사용자의 개인 정보를 보호하면서도, 필요한 기능은 모두 제공하는 균형 잡힌 시스템을 만들 수 있죠.
API 보안의 세계는 정말 넓고 깊어요. 우리가 배운 것은 시작에 불과해요. 하지만 이 기초를 잘 다져놓으면, 앞으로 어떤 복잡한 API 시스템도 자신있게 구축할 수 있을 거예요!
자, 이제 여러분의 차례예요. 이 지식을 활용해 멋진 API를 만들어보세요. 안전하고 효율적인 API로 사용자들에게 최고의 경험을 선사하세요. 화이팅! 🚀👨💻👩💻