본문 바로가기

이메일 인증

번역일: 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 대신 Laravel에서 제공하는 폼 리퀘스트입니다. URL의 idhash 파라미터 유효성 검사를 자동으로 처리해 줍니다.
  • $request->fulfill(): 인증된 사용자의 markEmailAsVerified() 메서드를 호출해 이메일 인증을 완료하고, Illuminate\Auth\Events\Verified 이벤트를 발생시킵니다. 이 메서드는 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 미들웨어를 기본으로 제공합니다. 별도 등록 없이 바로 사용할 수 있으며, 일반적으로 auth 미들웨어와 함께 적용합니다.

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

이메일 인증을 완료하지 않은 사용자가 이 라우트에 접근하려 하면, 자동으로 verification.notice 네임드 라우트로 리다이렉트됩니다.

커스터마이징

인증 이메일 커스터마이징

기본 이메일 인증 알림으로도 대부분의 요구사항을 충족할 수 있지만, 필요한 경우 인증 이메일의 내용을 직접 커스터마이징할 수 있습니다.

Illuminate\Auth\Notifications\VerifyEmail 알림의 toMailUsing 메서드에 클로저를 전달하면 됩니다. 클로저는 알림을 수신할 모델 인스턴스와 서명된 인증 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일