[LARAVEL]사용자 인증 & 인가

김세연·2025년 9월 23일

Laravel

목록 보기
9/14
post-thumbnail

사용자 인증 & 인가 (Authentication & Authorization) 

인증(Authentication): 공항 보안 검색대 통과

공항에 도착해서 비행기를 타려면, 가장 먼저 보안 검색대를 통과해야 합다.
이때 당신은 항공권과 신분증(여권)을 제시해야 한다.

  • 무엇을 확인하나요?:
    당신이 누구인지(신원), 그리고 오늘 비행기를 탈 자격이 있는 승객인지를 확인한다.

이것이 바로 인증(Authentication)이다.
사용자가 아이디와 비밀번호를 입력하여 로그인하는 과정과 같다.
시스템은 이 사용자가 우리 서비스에 등록된 회원 본인인지를 확인하고, 일단 '인증된 사용자'로서 시스템 내부로 들여보내 준다.

인가(Authorization): 특정 비행기 탑승 게이트 통과

보안 검색대를 통과하면 당신은 면세 구역에 들어오게 됩니다. 이곳에서는 자유롭게 쇼핑을 하거나 쉴 수 있다.
하지만 당신이 예매한 '파리행 KE901편'을 타려면, 42번 탑승 게이트로 가야 한다.

  • 무엇을 확인하나요?:
    탑승 게이트의 직원은 당신의 항공권을 다시 확인하여, 당신이 'KE901편에 탑승할 권한'이 있는지 검사한다.
    당신이 '인증된 공항 승객'인 것은 맞지만, 모든 비행기를 탈 수 있는 것은 아니기 때문이다.

이것이 바로 인가(Authorization)이다.
로그인한 사용자(인증된 사용자)가 특정 행동을 할 권한이 있는지 확인하는 과정이다.
예를 들어, 게시판에서 '글 삭제' 버튼을 눌렀을 때, 시스템은 이 사용자가 '해당 글을 삭제할 권한'(예: 글 작성자 본인)이 있는지를 검사하는 것과 같다.

요약하면,
인증시스템에 들어올 자격이 있는지 확인하는 것이고,
인가시스템에 들어온 사용자가 특정 행동(글쓰기, 수정, 삭제 등)을 할 권한이 있는지 확인하는 것입니다.


인증 (Authentication): 라라벨 브리즈(Breeze)로 로그인 구현하기

라라벨은 브리즈(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에 접근하면 자동으로 로그인 페이지로 이동된다.


인가 (Authorization): 게이트와 정책으로 권한 관리하기

사용자가 로그인한 후, 특정 행동에 대한 권한을 검사하는 방법이다.
라라벨은 주로 게이트(Gates)와 정책(Policies) 두 가지 방법을 제공한다.
정책이 좀 더 구조화된 방식이다.(아래는 게이트 방식이다.)

게이트 (Gates)

게이트는 특정 사용자가 특정 행동을 할 수 있는지 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)는 애플리케이션이라는 견고한 성을 지키는 이중 보안 시스템이다.
이 둘은 서로를 보완하며, 데이터의 무결성과 사용자의 신뢰를 보장하는 가장 핵심적인 장치이다.

인증: "당신은 누구인가?" - 성문의 경비병

인증은 성의 정문을 지키는 경비병과 같다.
방문객이 성에 들어오기 전, 신원을 확인하여 자격이 있는 사람만 안으로 들여보낸다.
라라벨에서는 BreezeSanctum 같은 강력한 도구를 통해 이 '로그인'이라는 첫 번째 방어선을 매우 쉽고 안전하게 구축할 수 있다.

인가: "무엇을 할 수 있는가?" - 내부의 열쇠와 통행증

인가는 성 안에 들어온 방문객이 왕의 집무실이나 무기고 같은 특정 장소에 들어갈 권한이 있는지 확인하는 과정이다.
라라벨의 게이트(Gates)와 정책(Policies)은 각 사용자에게 역할과 상황에 맞는 열쇠와 통행증을 발급하여, 허가된 행동만 할 수 있도록 정교하게 통제하는 역할을 한다.

인증과 인가를 마스터했다는 것은 단순히 로그인 기능을 만드는 기술을 넘어, 누가 애플리케이션에 접근할 수 있고, 그들이 무엇을 할 수 있는지를 완벽하게 제어할 수 있는 능력을 갖추었다는 의미이다.

profile
공부 재밌따

0개의 댓글