본문 바로가기

이메일 인증

번역일: 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; // ... }

이 인터페이스를 추가하면, 새로 가입한 사용자에게 이메일 인증 링크가 포함된 메일이 자동으로 발송됩니다. Laravel이 Illuminate\Auth\Events\Registered 이벤트에 대해 Illuminate\Auth\Listeners\SendEmailVerificationNotification 리스너를 자동으로 등록하기 때문입니다.

스타터 키트를 사용하지 않고 회원가입 로직을 직접 구현하는 경우에는, 가입 완료 후 반드시 Illuminate\Auth\Events\Registered 이벤트를 직접 발생시켜야 합니다.

use Illuminate\Auth\Events\Registered; event(new Registered($user));

데이터베이스 준비

users 테이블에 email_verified_at 컬럼이 있어야 합니다. 이 컬럼에 이메일 인증이 완료된 일시가 저장됩니다. Laravel 기본 마이그레이션 파일인 0001_01_01_000000_create_users_table.php에 이미 해당 컬럼이 포함되어 있으므로, 별도로 추가할 필요가 없습니다.

라우팅

이메일 인증을 올바르게 구현하려면 세 가지 라우트가 필요합니다.

  1. 사용자에게 인증 이메일의 링크를 클릭하도록 안내하는 페이지를 표시하는 라우트
  2. 사용자가 이메일의 인증 링크를 클릭했을 때 요청을 처리하는 라우트
  3. 인증 이메일을 분실하거나 삭제한 경우 재발송을 요청하는 라우트

이메일 인증 안내 페이지

이 라우트는 사용자에게 인증 이메일의 링크를 클릭하라고 안내하는 뷰를 반환합니다. 이메일 인증 전에 보호된 페이지에 접근하려 하면 이 페이지로 이동하게 됩니다. App\Models\User 모델이 MustVerifyEmail 인터페이스를 구현하고 있는 한, 인증 링크는 자동으로 발송됩니다.

Route::get('/email/verify', function () { return view('auth.verify-email'); })->middleware('auth')->name('verification.notice');

이 라우트의 이름은 반드시 verification.notice로 지정해야 합니다. Laravel에 내장된 verified 미들웨어는 이메일 인증이 되지 않은 사용자를 이 이름의 라우트로 자동 리다이렉트하기 때문입니다. 이름이 다르면 정상 동작하지 않습니다.

NOTE

이메일 인증을 직접 구현하는 경우, 인증 안내 뷰의 내용도 직접 작성해야 합니다. 인증을 포함한 전체 인증 뷰 스캐폴딩이 필요하다면 Laravel 스타터 키트를 활용하세요.

이메일 인증 처리 라우트

다음으로, 사용자가 이메일의 인증 링크를 클릭했을 때 요청을 처리하는 라우트를 정의합니다. 이 라우트는 verification.verify라는 이름을 가져야 하며, authsigned 미들웨어를 함께 적용해야 합니다.

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 대신 사용합니다. 이 폼 리퀘스트는 URL의 idhash 파라미터 유효성 검사를 자동으로 처리합니다.
  • $request->fulfill(): 인증된 사용자에 대해 markEmailAsVerified() 메서드를 호출하고 Illuminate\Auth\Events\Verified 이벤트를 발생시킵니다. markEmailAsVerified()Illuminate\Foundation\Auth\User 기본 클래스를 통해 App\Models\User 모델에서 사용할 수 있습니다.
  • 인증이 완료되면 원하는 페이지로 자유롭게 리다이렉트할 수 있습니다.

인증 이메일 재발송

사용자가 인증 이메일을 실수로 삭제하거나 분실한 경우를 대비해, 재발송을 요청할 수 있는 라우트를 정의할 수 있습니다. 인증 안내 페이지에 간단한 재발송 버튼을 두고 이 라우트로 요청을 보내면 됩니다.

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 미들웨어 별칭을 내장하고 있습니다. 이 별칭은 Laravel이 자동으로 등록하므로, 라우트 정의에 verified 미들웨어를 추가하기만 하면 됩니다. 일반적으로 auth 미들웨어와 함께 사용합니다.

Route::get('/profile', function () { // 이메일 인증을 완료한 사용자만 접근 가능합니다. })->middleware(['auth', 'verified']);

인증되지 않은 사용자가 이 미들웨어가 적용된 라우트에 접근하면, 자동으로 verification.notice 이름이 지정된 라우트로 리다이렉트됩니다.

커스터마이징

인증 이메일 커스터마이징

기본 이메일 인증 알림은 대부분의 애플리케이션 요구사항을 충족하지만, Laravel은 인증 이메일의 내용을 자유롭게 커스터마이징할 수 있도록 지원합니다.

Illuminate\Auth\Notifications\VerifyEmail 알림의 toMailUsing 메서드에 클로저를 전달하면 됩니다. 이 클로저는 알림을 받는 notifiable 모델 인스턴스와 사용자가 이메일 인증을 위해 방문해야 하는 서명된 URL을 인자로 받습니다. 클로저는 Illuminate\Notifications\Messages\MailMessage 인스턴스를 반환해야 합니다. 보통 AppServiceProviderboot 메서드에서 호출합니다.

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은 이메일 인증 과정에서 Illuminate\Auth\Events\Verified 이벤트를 자동으로 발생시킵니다. 이메일 인증을 직접 구현하는 경우에는, 인증 완료 후 이 이벤트를 수동으로 발생시킬 수 있습니다.

이 문서는 Laravel 공식 문서(MIT)를 한국 개발자를 위해 번역·재구성한 것입니다.

번역일: 2026년 6월 20일