> ## Documentation Index
> Fetch the complete documentation index at: https://kawax.biz/llms.txt
> Use this file to discover all available pages before exploring further.

# 이메일 인증(Email Verification)

> Laravel의 이메일 인증 기능을 구현하는 절차를 설명합니다. 모델 준비, 세 개의 라우트 정의, verified 미들웨어, 커스터마이징, 이벤트를 배울 수 있습니다.

## 소개

이메일 인증(Email Verification)은 사용자가 등록한 이메일 주소를 실제로 소유하고 있는지 확인하는 구조입니다. Laravel은 확인 메일 전송과 검증 처리를 기본으로 제공하므로, 최소한의 구현으로 안전한 인증 플로우를 구축할 수 있습니다.

<Info>
  스타터 킷을 사용하는 경우, 인증 화면과 이메일 인증 플로우가 이미 포함되어 있습니다. 수동으로 구현하는 경우에는 이 페이지의 절차에 따라 모델·라우트·뷰를 직접 정의해 주세요.
</Info>

## 모델과 데이터베이스 준비

### MustVerifyEmail 구현하기

`App\Models\User`가 `Illuminate\Contracts\Auth\MustVerifyEmail`을 구현하고 있는지 확인해 주세요.

```php theme={null}
<?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;
}
```

이 인터페이스를 추가하면 신규 등록 사용자에게 확인 메일이 자동으로 전송됩니다. 스타터 킷을 사용하지 않고 등록 처리를 구현하는 경우, 등록 성공 후 `Registered` 이벤트를 발생시켜 주세요.

```php theme={null}
use Illuminate\Auth\Events\Registered;

event(new Registered($user));
```

### email\_verified\_at 컬럼 확인하기

`users` 테이블에 `email_verified_at` 컬럼이 필요합니다. 일반적으로 기본 `0001_01_01_000000_create_users_table.php`에 포함되어 있습니다.

## 라우팅(3개의 라우트)

이메일 인증에서는 `verification.notice`, `verification.verify`, `verification.send` 세 개의 라우트를 정의합니다.

<Steps>
  <Step title="인증 통지 표시 라우트(verification.notice)를 정의한다">
    미인증 사용자에게 "메일을 확인해 주세요"라고 표시하는 화면을 반환합니다.

    ```php theme={null}
    Route::get('/email/verify', function () {
        return view('auth.verify-email');
    })->middleware('auth')->name('verification.notice');
    ```
  </Step>

  <Step title="인증 핸들러 라우트(verification.verify)를 정의한다">
    메일 내 링크를 클릭했을 때 서명된 URL을 검증하여 인증을 완료합니다.

    ```php theme={null}
    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');
    ```
  </Step>

  <Step title="재전송 라우트(verification.send)를 정의한다">
    사용자가 확인 메일을 분실했을 때 다시 전송합니다.

    ```php theme={null}
    use Illuminate\Http\Request;

    Route::post('/email/verification-notification', function (Request $request) {
        $request->user()->sendEmailVerificationNotification();

        return back()->with('message', 'Verification link sent!');
    })->middleware(['auth', 'throttle:6,1'])->name('verification.send');
    ```
  </Step>
</Steps>

## 라우트 보호

인증된 사용자에게만 접근을 허용하려면 `verified` 미들웨어를 사용합니다. 일반적으로 `auth`와 조합해서 사용합니다.

```php theme={null}
Route::get('/profile', function () {
    // 인증된 사용자만 접근 가능
})->middleware(['auth', 'verified']);
```

미인증 사용자가 접근하면 Laravel은 자동으로 `verification.notice`로 리다이렉트합니다.

## 커스터마이징

확인 메일 본문을 커스터마이징하려면 `AppServiceProvider`의 `boot` 메서드에서 `VerifyEmail::toMailUsing`을 설정합니다.

```php theme={null}
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('Verify Email Address')
            ->line('Click the button below to verify your email address.')
            ->action('Verify Email Address', $url);
    });
}
```

## 이벤트

이메일 인증 시에는 `Illuminate\Auth\Events\Verified` 이벤트가 발생합니다. 스타터 킷에서는 자동으로 처리되지만, 수동 구현에서는 필요에 따라 이벤트 처리를 추가해 주세요.


## Related topics

- [인증 방식 비교 - Laravel Bluesky](/ko/packages/laravel-bluesky/authentication.md)
- [인증 입문](/ko/authentication.md)
- [Laravel Fortify와 스타터 킷](/ko/advanced/fortify.md)
- [스타터 킷](/ko/starter-kits.md)
- [Socialite - Laravel Bluesky](/ko/packages/laravel-bluesky/socialite.md)
