이메일 인증
번역일: 2026년 6월 20일
이메일 인증
소개
많은 웹 애플리케이션에서 사용자가 서비스를 본격적으로 이용하기 전에 이메일 주소를 인증하도록 요구합니다. Laravel은 이 기능을 매번 직접 구현하지 않아도 되도록 이메일 인증 요청 발송 및 검증을 위한 편리한 내장 기능을 제공합니다.
NOTE
빠르게 시작하고 싶다면 새 Laravel 프로젝트에 스타터 킷을 설치하세요. 스타터 킷은 이메일 인증을 포함한 전체 인증 시스템의 스캐폴딩을 자동으로 구성해 줍니다.
모델 준비
시작하기 전에 App\Models\User 모델이 Illuminate\Contracts\Auth\MustVerifyEmail 인터페이스를 구현하고 있는지 확인하세요.
<?php
namespace App\Models;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
class User extends Authenticatable implements MustVerifyEmail
{
use Notifiable;
// ...
}이 인터페이스를 모델에 추가하면, 새로 가입한 사용자에게 이메일 인증 링크가 담긴 메일이 자동으로 발송됩니다. 내부적으로는 App\Providers\EventServiceProvider에 이미 등록된 SendEmailVerificationNotification 리스너가 Illuminate\Auth\Events\Registered 이벤트를 감지하여 인증 이메일을 발송합니다.
스타터 킷을 사용하지 않고 회원가입 로직을 직접 구현하는 경우에는, 회원가입 완료 후 반드시 Illuminate\Auth\Events\Registered 이벤트를 직접 발송해야 합니다.
use Illuminate\Auth\Events\Registered;
event(new Registered($user));데이터베이스 준비
users 테이블에는 이메일 인증 일시를 저장하는 email_verified_at 컬럼이 있어야 합니다. Laravel 기본 마이그레이션 파일에 이 컬럼이 이미 포함되어 있으므로, 마이그레이션만 실행하면 됩니다.
php artisan migrate라우팅
이메일 인증을 올바르게 구현하려면 세 가지 라우트를 정의해야 합니다.
- 사용자에게 인증 이메일의 링크를 클릭하도록 안내하는 페이지를 반환하는 라우트
- 사용자가 이메일의 인증 링크를 클릭했을 때 해당 요청을 처리하는 라우트
- 사용자가 인증 이메일을 분실했을 때 재발송을 요청할 수 있는 라우트
이메일 인증 안내 페이지
이 라우트는 사용자에게 "회원가입 후 발송된 이메일의 인증 링크를 클릭하세요"라고 안내하는 뷰를 반환합니다. 이메일을 인증하지 않은 상태에서 다른 페이지에 접근하려 할 때 이 페이지로 리다이렉트됩니다. App\Models\User 모델에 MustVerifyEmail 인터페이스가 구현되어 있으면 인증 링크는 회원가입 시 자동으로 발송됩니다.
Route::get('/email/verify', function () {
return view('auth.verify-email');
})->middleware('auth')->name('verification.notice');NOTE
이 라우트의 이름은 반드시 verification.notice여야 합니다. 이메일을 인증하지 않은 사용자를 보호된 라우트에서 리다이렉트할 때 Laravel의 verified 미들웨어가 이 이름을 기준으로 동작하기 때문입니다. 이름이 다르면 리다이렉트가 정상적으로 작동하지 않습니다.
NOTE
이메일 인증을 직접 구현하는 경우 인증 안내 뷰의 내용도 직접 작성해야 합니다. 인증을 포함한 모든 인증 관련 뷰를 자동으로 구성하고 싶다면 Laravel 스타터 킷을 활용하세요.
이메일 인증 처리 라우트
사용자가 이메일의 인증 링크를 클릭했을 때 요청을 처리하는 라우트입니다. 이 라우트의 이름은 verification.verify로 지정하고, auth와 signed 미들웨어를 적용해야 합니다.
use Illuminate\Foundation\Auth\EmailVerificationRequest;
Route::get('/email/verify/{id}/{hash}', function (EmailVerificationRequest $request) {
$request->fulfill();
return redirect('/home');
})->middleware(['auth', 'signed'])->name('verification.verify');이 라우트에서 주목할 점이 두 가지 있습니다.
EmailVerificationRequest 사용: 일반적인 Illuminate\Http\Request 대신 EmailVerificationRequest를 사용합니다. 이는 Laravel에 내장된 폼 요청으로, URL의 id와 hash 파라미터 유효성 검사를 자동으로 처리합니다.
fulfill() 메서드 호출: 이 메서드를 호출하면 인증된 사용자의 markEmailAsVerified 메서드가 실행되고, Illuminate\Auth\Events\Verified 이벤트가 발송됩니다. 인증이 완료된 후에는 원하는 페이지로 자유롭게 리다이렉트할 수 있습니다.
인증 이메일 재발송
사용자가 인증 이메일을 실수로 삭제하거나 받지 못한 경우를 대비해 재발송 라우트를 정의할 수 있습니다. 인증 안내 페이지에 재발송 버튼(폼)을 배치하고 이 라우트로 요청을 보내도록 구성하면 됩니다.
use Illuminate\Http\Request;
Route::post('/email/verification-notification', function (Request $request) {
$request->user()->sendEmailVerificationNotification();
return back()->with('message', '인증 링크를 재발송했습니다!');
})->middleware(['auth', 'throttle:6,1'])->name('verification.send');throttle:6,1 미들웨어를 적용하여 1분에 최대 6회까지만 요청을 허용하도록 제한하고 있습니다. 이를 통해 무분별한 이메일 발송을 방지할 수 있습니다.
라우트 보호
라우트 미들웨어를 사용하면 이메일 인증을 완료한 사용자만 특정 라우트에 접근할 수 있도록 제한할 수 있습니다. Laravel에는 Illuminate\Auth\Middleware\EnsureEmailIsVerified 클래스의 별칭인 verified 미들웨어가 내장되어 있으며, HTTP 커널에 이미 등록되어 있습니다. 라우트 정의에 이 미들웨어를 추가하기만 하면 됩니다. 일반적으로 auth 미들웨어와 함께 사용합니다.
Route::get('/profile', function () {
// 이메일 인증을 완료한 사용자만 접근 가능
})->middleware(['auth', 'verified']);이메일을 인증하지 않은 사용자가 이 라우트에 접근하려 하면 자동으로 verification.notice 네임드 라우트로 리다이렉트됩니다.
커스터마이징
인증 이메일 커스터마이징
기본 이메일 인증 알림으로도 대부분의 요구사항을 충족할 수 있지만, 필요에 따라 이메일 메시지 구성 방식을 커스터마이징할 수 있습니다.
Illuminate\Auth\Notifications\VerifyEmail 알림의 toMailUsing 메서드에 클로저를 전달하면 됩니다. 이 클로저는 알림을 수신하는 모델 인스턴스와 서명된 인증 URL을 인자로 받으며, Illuminate\Notifications\Messages\MailMessage 인스턴스를 반환해야 합니다. 이 설정은 일반적으로 App\Providers\AuthServiceProvider의 boot 메서드에서 호출합니다.
use Illuminate\Auth\Notifications\VerifyEmail;
use Illuminate\Notifications\Messages\MailMessage;
/**
* 인증/인가 서비스를 등록합니다.
*/
public function boot(): void
{
// ...
VerifyEmail::toMailUsing(function (object $notifiable, string $url) {
return (new MailMessage)
->subject('이메일 주소 인증')
->line('아래 버튼을 클릭하여 이메일 주소를 인증해 주세요.')
->action('이메일 인증하기', $url);
});
}NOTE
메일 알림에 대한 자세한 내용은 메일 알림 문서를 참고하세요.
이벤트
Laravel 스타터 킷을 사용하는 경우, Laravel은 이메일 인증 과정에서 자동으로 이벤트를 발송합니다. 이메일 인증을 직접 구현하는 경우에는 인증 완료 후 이벤트를 수동으로 발송해야 할 수 있습니다. EventServiceProvider에서 이벤트에 리스너를 등록할 수 있습니다.
use App\Listeners\LogVerifiedUser;
use Illuminate\Auth\Events\Verified;
/**
* 애플리케이션의 이벤트-리스너 매핑
*
* @var array
*/
protected $listen = [
Verified::class => [
LogVerifiedUser::class,
],
];