
공항에 도착해서 비행기를 타려면, 가장 먼저 보안 검색대를 통과해야 합다.
이때 당신은 항공권과 신분증(여권)을 제시해야 한다.
이것이 바로 인증(Authentication)이다.
사용자가 아이디와 비밀번호를 입력하여 로그인하는 과정과 같다.
시스템은 이 사용자가 우리 서비스에 등록된 회원 본인인지를 확인하고, 일단 '인증된 사용자'로서 시스템 내부로 들여보내 준다.
보안 검색대를 통과하면 당신은 면세 구역에 들어오게 됩니다. 이곳에서는 자유롭게 쇼핑을 하거나 쉴 수 있다.
하지만 당신이 예매한 '파리행 KE901편'을 타려면, 42번 탑승 게이트로 가야 한다.
이것이 바로 인가(Authorization)이다.
로그인한 사용자(인증된 사용자)가 특정 행동을 할 권한이 있는지 확인하는 과정이다.
예를 들어, 게시판에서 '글 삭제' 버튼을 눌렀을 때, 시스템은 이 사용자가 '해당 글을 삭제할 권한'(예: 글 작성자 본인)이 있는지를 검사하는 것과 같다.
요약하면,
인증은 시스템에 들어올 자격이 있는지 확인하는 것이고,
인가는 시스템에 들어온 사용자가 특정 행동(글쓰기, 수정, 삭제 등)을 할 권한이 있는지 확인하는 것입니다.
라라벨은 브리즈(Breeze)라는 스타터 키트를 통해 복잡한 인증 기능을 단 몇 분 만에 구현할 수 있도록 지원한다.
새로운 라라벨 프로젝트에서 다음 명령어를 순서대로 실행한다.
# 1. Breeze 패키지 설치
composer require laravel/breeze --dev
# 2. Breeze 설치 (Blade + 기본 PHP 버전)
php artisan breeze:install
# 3. 데이터베이스 테이블 생성 (users 테이블 등)
php artisan migrate
# 4. 자바스크립트/CSS 파일 빌드
npm install && npm run dev
이 명령어들을 실행하면, 여러분의 프로젝트에 다음과 같은 인증 기능이 자동으로 완성된다.
라우트: 회원가입, 로그인, 로그아웃, 비밀번호 찾기 등에 필요한 모든 URL 주소 (routes/auth.php)
컨트롤러: 인증 로직을 처리하는 모든 컨트롤러 (app/Http/Controllers/Auth/)
뷰: 실제 사용자가 보게 될 로그인, 회원가입 화면 등 (resources/views/auth/)
이제 프로젝트를 실행하고 /login이나 /register 주소로 접속하면, 바로 사용할 수 있는 로그인과 회원가입 페이지가 나타난다.
로그인한 사용자만 접근할 수 있는 페이지를 만들려면, 라우트에 auth 미들웨어를 추가하면 된다.
// routes/web.php
// '/dashboard' 주소는 auth 미들웨어 검문을 통과해야만 접근 가능
Route::get('/dashboard', function () {
return view('dashboard');
})->middleware(['auth']);
이제 로그인하지 않은 사용자가 /dashboard에 접근하면 자동으로 로그인 페이지로 이동된다.
사용자가 로그인한 후, 특정 행동에 대한 권한을 검사하는 방법이다.
라라벨은 주로 게이트(Gates)와 정책(Policies) 두 가지 방법을 제공한다.
정책이 좀 더 구조화된 방식이다.(아래는 게이트 방식이다.)
게이트는 특정 사용자가 특정 행동을 할 수 있는지 true 또는 false로 결정하는 간단한 클로저(함수)이다.
app/Providers/AuthServiceProvider.php):boot 메서드 안에 게이트를 정의한다.Post)을 수정할 권한은 해당 게시글을 작성한 사람에게만 있다"는 규칙을 만들어 볼 것이다.use App\Models\Post;
use App\Models\User;
use Illuminate\Support\Facades\Gate;
public function boot()
{
$this->registerPolicies();
Gate::define('update-post', function (User $user, Post $post) {
return $user->id === $post->user_id;
});
}
Gate 파사드나 @can 지시어를 통해 쉽게 사용할 수 있다.컨트롤러에서 사용:
use Illuminate\Support\Facades\Gate;
public function update(Request $request, Post $post)
{
if (! Gate::allows('update-post', $post)) {
abort(403); // 403 Forbidden 에러 발생 (권한 없음)
}
// 권한이 있으면 수정 로직 실행...
}
블레이드 뷰에서 사용:
@can('update-post', $post)
<a href="/posts/{{ $post->id }}/edit">수정하기</a>
@endcan
이제 @can 블록 안의 '수정하기' 버튼은 오직 해당 게시글을 작성한 사용자에게만 보이게 된다.
사용자 인증(Authentication)과 인가(Authorization)는 애플리케이션이라는 견고한 성을 지키는 이중 보안 시스템이다.
이 둘은 서로를 보완하며, 데이터의 무결성과 사용자의 신뢰를 보장하는 가장 핵심적인 장치이다.
인증은 성의 정문을 지키는 경비병과 같다.
방문객이 성에 들어오기 전, 신원을 확인하여 자격이 있는 사람만 안으로 들여보낸다.
라라벨에서는 Breeze와 Sanctum 같은 강력한 도구를 통해 이 '로그인'이라는 첫 번째 방어선을 매우 쉽고 안전하게 구축할 수 있다.
인가는 성 안에 들어온 방문객이 왕의 집무실이나 무기고 같은 특정 장소에 들어갈 권한이 있는지 확인하는 과정이다.
라라벨의 게이트(Gates)와 정책(Policies)은 각 사용자에게 역할과 상황에 맞는 열쇠와 통행증을 발급하여, 허가된 행동만 할 수 있도록 정교하게 통제하는 역할을 한다.