메인 콘텐츠로 건너뛰기

인증이란

인증(Authentication)이란 접근해 온 사용자가 “누구인지”를 확인하는 구조입니다. 웹 애플리케이션에서는 로그인 폼에서 이메일 주소와 비밀번호를 받아 올바르다면 세션에 사용자 정보를 저장합니다. 이후 요청에서는 그 세션을 참조해 사용자를 식별합니다. Laravel의 인증 기능은 “가드”와 “프로바이더”라는 두 가지 개념으로 구성되어 있습니다.
  • 가드: 각 요청에서 사용자를 어떻게 인증할지를 정의합니다. 기본값은 session 가드로, 세션과 쿠키를 사용해 상태를 관리합니다.
  • 프로바이더: 사용자를 데이터베이스에서 어떻게 가져올지를 정의합니다. 기본값은 Eloquent를 사용합니다.
인증 설정 파일은 config/auth.php입니다. 기본 설정 그대로 대부분의 웹 애플리케이션에 대응할 수 있습니다.

스타터 킷을 사용한 인증

Laravel에서는 laravel new로 애플리케이션을 생성할 때 스타터 킷을 선택하기만 하면 로그인·등록·비밀번호 재설정 같은 인증 기능이 자동으로 구축됩니다. 이것이 가장 권장되는 방법입니다.
1

애플리케이션을 생성한다

Laravel 인스톨러로 애플리케이션을 생성합니다. 중간에 스타터 킷을 선택하는 프롬프트가 표시됩니다.
laravel new my-app
스타터 킷으로 React, Vue, Livewire, Svelte 중에서 선택할 수 있습니다. 팀의 기술 스택에 맞춰 선택해 주세요.
2

프런트엔드 의존 관계를 설치한다

cd my-app
npm install && npm run build
3

데이터베이스를 준비한다

.env 파일의 데이터베이스 설정을 확인한 후 마이그레이션을 실행합니다.
php artisan migrate
users 테이블을 포함하는 초기 마이그레이션이 적용됩니다.
4

개발 서버를 기동한다

composer run dev
브라우저에서 http://localhost:8000에 접속하면 내비게이션에 “Register”와 “Log in” 링크가 표시됩니다. /register에 접속해 사용자를 등록해 봅시다.
스타터 킷을 사용하면 다음 기능을 즉시 이용할 수 있습니다.
기능URL
사용자 등록/register
로그인/login
비밀번호 재설정/forgot-password
이메일 확인/email/verify
프로필 편집/settings/profile
스타터 킷으로 생성된 코드(컨트롤러·라우트·뷰)는 모두 자신의 애플리케이션 내에 존재합니다. 자유롭게 수정하여 커스터마이징할 수 있습니다.

이용 가능한 스타터 킷

React

React 19·TypeScript·Tailwind·shadcn/ui를 사용한 모던한 SPA를 구축할 수 있습니다. Inertia를 사용해 서버사이드 라우팅을 유지하면서 React의 프런트엔드를 이용할 수 있습니다.

Vue

Vue Composition API·TypeScript·Tailwind·shadcn-vue를 채택하고 있습니다. React와 마찬가지로 Inertia를 사용해 서버사이드와 연동합니다.

Livewire

PHP만으로 동적인 UI를 구축할 수 있는 Livewire를 사용합니다. Blade 템플릿이 중심인 팀이나 JavaScript 프레임워크를 사용하지 않으려는 경우에 최적입니다. Flux UI 컴포넌트 라이브러리가 포함되어 있습니다.

Svelte

Svelte 5·TypeScript·Tailwind·shadcn-svelte를 사용합니다. Inertia와 조합해 모던한 SPA를 구축할 수 있습니다.

인증 파사드

Auth 파사드를 사용하면 현재 인증되어 있는 사용자의 정보를 가져오거나 인증 상태를 확인할 수 있습니다.

인증된 사용자 가져오기

use Illuminate\Support\Facades\Auth;

// 현재 사용자를 가져온다
$user = Auth::user();

// 사용자 ID만 가져온다
$id = Auth::id();
컨트롤러에서는 Request 객체에서도 사용자를 가져올 수 있습니다.
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class DashboardController extends Controller
{
    public function index(Request $request)
    {
        $user = $request->user();

        return view('dashboard', ['user' => $user]);
    }
}

인증 상태 확인

Auth::check()는 사용자가 로그인해 있는지를 true / false로 반환합니다.
use Illuminate\Support\Facades\Auth;

if (Auth::check()) {
    // 로그인됨
} else {
    // 미로그인
}
Blade 템플릿에서는 @auth@guest 디렉티브를 사용하면 편리합니다.
@auth
    <p>안녕하세요, {{ Auth::user()->name }}</p>
    <a href="/logout">로그아웃</a>
@endauth

@guest
    <a href="/login">로그인</a>
    <a href="/register">신규 등록</a>
@endguest

라우트 보호

로그인된 사용자만 접근할 수 있는 라우트를 만들려면 auth 미들웨어를 사용합니다.
// routes/web.php

// 인증된 사용자만 접근 가능
Route::get('/dashboard', function () {
    return view('dashboard');
})->middleware('auth');
인증되지 않은 사용자가 접근하려고 하면 자동으로 /login으로 리다이렉트됩니다. 여러 라우트를 함께 보호하려면 그룹을 사용합니다.
Route::middleware('auth')->group(function () {
    Route::get('/dashboard', [DashboardController::class, 'index']);
    Route::get('/profile', [ProfileController::class, 'show']);
    Route::get('/settings', [SettingsController::class, 'index']);
});
auth 미들웨어를 붙이는 것을 잊으면 미로그인 사용자가 접근할 수 있게 됩니다. 보호가 필요한 라우트에는 반드시 적용해 주세요.

게스트 전용 라우트

로그인된 사용자를 리다이렉트하려면 guest 미들웨어를 사용합니다. 로그인 페이지나 등록 페이지에 적용함으로써 이미 로그인해 있는 사용자를 대시보드로 전송할 수 있습니다.
Route::middleware('guest')->group(function () {
    Route::get('/login', [AuthController::class, 'showLogin']);
    Route::get('/register', [AuthController::class, 'showRegister']);
});

수동 인증

스타터 킷을 사용하지 않고 수동으로 로그인 처리를 구현하려면 Auth::attempt()를 사용합니다.
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Http\RedirectResponse;
use Illuminate\Support\Facades\Auth;

class LoginController extends Controller
{
    public function login(Request $request): RedirectResponse
    {
        $credentials = $request->validate([
            'email' => ['required', 'email'],
            'password' => ['required'],
        ]);

        if (Auth::attempt($credentials)) {
            // 인증 성공 — 세션을 재생성하여 CSRF 공격을 방지
            $request->session()->regenerate();

            return redirect()->intended('/dashboard');
        }

        // 인증 실패
        return back()->withErrors([
            'email' => '이메일 주소 또는 비밀번호가 올바르지 않습니다.',
        ])->onlyInput('email');
    }
}
Auth::attempt()의 첫 번째 인수에 인증 정보 배열을 전달합니다. 비밀번호는 자동으로 해시와 비교되므로 평문 그대로 전달해 주세요. “로그인 상태 유지” 기능을 구현하려면 두 번째 인수에 true를 전달합니다.
// "로그인 상태 유지" 체크박스의 값을 사용
Auth::attempt($credentials, $request->boolean('remember'));
수동 인증을 구현하는 경우에도 스타터 킷의 코드를 참고하는 것을 추천합니다. 안전한 구현의 모범으로 활용할 수 있습니다.

로그아웃

사용자를 로그아웃시키려면 Auth::logout()을 호출합니다. 세션의 무효화와 CSRF 토큰의 재생성도 함께 수행하는 것이 베스트 프랙티스입니다.
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Http\RedirectResponse;
use Illuminate\Support\Facades\Auth;

class LogoutController extends Controller
{
    public function logout(Request $request): RedirectResponse
    {
        Auth::logout();

        // 세션을 무효화한다
        $request->session()->invalidate();

        // CSRF 토큰을 재생성한다
        $request->session()->regenerateToken();

        return redirect('/');
    }
}
라우트에는 POST 메서드를 사용합니다.
Route::post('/logout', [LogoutController::class, 'logout'])->middleware('auth');
Blade 템플릿에서는 폼을 사용해 POST 요청을 보냅니다.
<form method="POST" action="/logout">
    @csrf
    <button type="submit">로그아웃</button>
</form>

정리

하고 싶은 것방법
인증 기능을 빠르게 추가스타터 킷(laravel new)
현재 사용자 가져오기Auth::user() / $request->user()
로그인 상태 확인Auth::check()
라우트 보호->middleware('auth')
수동 로그인Auth::attempt($credentials)
로그아웃Auth::logout()

다음 단계

미들웨어

auth 미들웨어의 구조나 독자 미들웨어의 작성 방법을 자세히 배웁니다.
마지막 수정일 2026년 7월 13일