인증이란
인증(Authentication)이란 접근해 온 사용자가 “누구인지”를 확인하는 구조입니다.
웹 애플리케이션에서는 로그인 폼에서 이메일 주소와 비밀번호를 받아 올바르다면 세션에 사용자 정보를 저장합니다.
이후 요청에서는 그 세션을 참조해 사용자를 식별합니다.
Laravel의 인증 기능은 “가드”와 “프로바이더”라는 두 가지 개념으로 구성되어 있습니다.
가드 : 각 요청에서 사용자를 어떻게 인증할지를 정의합니다. 기본값은 session 가드로, 세션과 쿠키를 사용해 상태를 관리합니다.
프로바이더 : 사용자를 데이터베이스에서 어떻게 가져올지를 정의합니다. 기본값은 Eloquent를 사용합니다.
인증 설정 파일은 config/auth.php입니다. 기본 설정 그대로 대부분의 웹 애플리케이션에 대응할 수 있습니다.
스타터 킷을 사용한 인증
Laravel에서는 laravel new로 애플리케이션을 생성할 때 스타터 킷을 선택하기만 하면 로그인·등록·비밀번호 재설정 같은 인증 기능이 자동으로 구축됩니다. 이것이 가장 권장되는 방법입니다.
애플리케이션을 생성한다
Laravel 인스톨러로 애플리케이션을 생성합니다. 중간에 스타터 킷을 선택하는 프롬프트가 표시됩니다. 스타터 킷으로 React , Vue , Livewire , Svelte 중에서 선택할 수 있습니다.
팀의 기술 스택에 맞춰 선택해 주세요.
프런트엔드 의존 관계를 설치한다
cd my-app
npm install && npm run build
데이터베이스를 준비한다
.env 파일의 데이터베이스 설정을 확인한 후 마이그레이션을 실행합니다.users 테이블을 포함하는 초기 마이그레이션이 적용됩니다.
개발 서버를 기동한다
브라우저에서 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 미들웨어의 구조나 독자 미들웨어의 작성 방법을 자세히 배웁니다.