Laravel - 인증: 초보자 가이드

안녕하세요, 미래의 Laravel 개발자 여러분! 오늘 우리는 Laravel 인증의 흥미로운 세상으로 뛰어들어 볼 거예요. 프로그래밍에 처음 도전하는 분이라도 걱정 마세요. 이 여정에서 여러분의 친절한 안내자로서 단계별로 모든 것을 설명해 드릴게요. 시작해 보겠습니다!

Laravel - Authorization

기본 이해: 인증 vs 인가

Laravel의 인증 기능에 들어가기 전에, 흔한 혼란을 풀어보겠습니다.

인증: 너는 누구야?

인증은 클럽의 보안원을 상상해 봅시다. 너는 누구인지 증명하는 것이에요. 디지털 세계에서는 일반적으로 사용자이름과 비밀번호로 로그인하는 것을 의미합니다.

인가: 너는 무엇을 할 수 있어?

이제 인가는 비혼합리스트를 상상해 봅시다. 클럽에 들어왔을 때 (인증된 상태에서) 인가는 네가 접근할 수 있는 구역을 결정합니다. 비혼합 룸에 갈 수 있니? DJ 보스 뒤에 가서 할 수 있니?

Laravel에서는 먼저 사용자를 인증한 다음, 인가를 사용하여 애플리케이션에서 할 수 있는 것을 제어합니다.

Laravel의 인가 메커니즘

Laravel은 강력하고 유연한 인가 시스템을 제공합니다. 이를 소화 가능한 조각으로 나눠보겠습니다:

1. 게이트

게이트는 간단한 클로저 기반으로 인가 작업을 수행하는 방법입니다. 애플리케이션의 체크포인트로 생각해 볼 수 있습니다.

게이트를 정의하는 방법은 다음과 같습니다:

Gate::define('edit-post', function ($user, $post) {
return $user->id === $post->user_id;
});

이 게이트는 사용자가 게시물을 편집할 수 있는지 확인합니다. 사용자의 ID가 게시물 작성자의 ID와 일치하면 true를 반환합니다.

게이트를 컨트롤러에서 사용하려면 다음과 같이 합니다:

if (Gate::allows('edit-post', $post)) {
// 사용자는 게시물을 편집할 수 있습니다...
}

또는 Blade 템플릿에서:

@can('edit-post', $post)
<!-- 편집 버튼 표시 -->
@endcan

2. 정책

정책은 특정 모델이나 리소스에 대한 인가 로직을 조직화한 클래스입니다. 각 모델에 대한 특화된 보안원이라고 생각해 볼 수 있습니다.

우리의 Post 모델에 정책을 만들어 보겠습니다:

php artisan make:policy PostPolicy --model=Post

이 명령어는 PostPolicy 클래스를 생성합니다. 이에 메서드를 추가해 보겠습니다:

public function update(User $user, Post $post)
{
return $user->id === $post->user_id;
}

이제 이 정책을 컨트롤러에서 사용할 수 있습니다:

$this->authorize('update', $post);

또는 Blade 템플릿에서:

@can('update', $post)
<!-- 업데이트 버튼 표시 -->
@endcan

3. 역할과 권한

Laravel은 내장된 역할 시스템을 제공하지 않지만, 쉽게 구현할 수 있습니다. 간단한 예제를 보겠습니다:

먼저, 사용자 테이블에 'role' 열을 추가합니다:

Schema::table('users', function (Blueprint $table) {
$table->string('role')->default('user');
});

이제 관리자 권한을 확인하는 게이트를 만들어 보겠습니다:

Gate::define('admin', function ($user) {
return $user->role === 'admin';
});

이를 컨트롤러나 뷰에서 사용할 수 있습니다:

if (Gate::allows('admin')) {
// 사용자는 관리자입니다...
}
@can('admin')
<!-- 관리자 패널 링크 표시 -->
@endcan

4. 미들웨어

Laravel은 라우트 수준에서 접근을 제어할 수 있는 미들웨어를 사용할 수 있습니다. 커스텀 미들웨어를 만들어 보겠습니다:

php artisan make:middleware CheckRole

이 미들웨어의 handle 메서드에서:

public function handle($request, Closure $next, $role)
{
if (! $request->user()->hasRole($role)) {
abort(403, '비인가된 작업.');
}

return $next($request);
}

이 미들웨어를 app/Http/Kernel.php에 등록합니다:

protected $routeMiddleware = [
// ...
'role' => \App\Http\Middleware\CheckRole::class,
];

이제 라우트에서 사용할 수 있습니다:

Route::get('/admin', function () {
//
})->middleware('role:admin');

메서드 표

이 글에서 다룬 주요 메서드의 표입니다:

메서드 설명 예제
Gate::define() 새로운 인가 게이트 정의 Gate::define('edit-post', function ($user, $post) { ... })
Gate::allows() 게이트가 작업을 허용하는지 확인 Gate::allows('edit-post', $post)
$this->authorize() 컨트롤러에서 작업 인가 $this->authorize('update', $post)
@can Blade 디렉티브로 인가 @can('update', $post) ... @endcan
Gate::forUser() 특정 사용자에 대한 게이트 인스턴스 가져오기 Gate::forUser($user)->allows('edit-post', $post)

기억하세요, 인가는 인증된 사용자가 애플리케이션에서 할 수 있는 것을 제어하는 것입니다. 안전하고 사용자 친화적인 웹 애플리케이션을 구축하는 데 중요한 부분입니다.

연습하고 더 많은 애플리케이션을 만들면서, 이 개념에 익숙해질 것입니다. 두려워 말고 실험해 보세요 - 우리 모두가 그렇게 배웁니다!

행복하게 코딩하세요, 미래의 Laravel 전문가 여러분! ??‍??‍?

Credits: Image by storyset