본문 바로가기
프로그래밍/Web

라라벨 Fortify

by 사악신 2023. 12. 21.

Introduction

라라벨 포티파이(Laravel Fortify)는 라라벨의 프론트엔드에 구애받지 않는 인증 백엔드 구현입니다. 포티파이는 로그인, 회원가입, 비밀번호 재설정, 이메일 인증 등 라라벨의 모든 인증 기능을 구현하기 위해 필요한 경로와 컨트롤러를 등록합니다. 포티파이를 설치한 후에는 Artisan 명령어 route:list 를 실행하여 포티파이가 등록한 경로를 확인할 수 있습니다.

포티파이는 자체 사용자 인터페이스를 제공하지 않기 때문에, 사용자의 인터페이스와 함께 사용되어야 합니다. 이 인터페이스는 포티파이가 등록한 경로에 요청을 보내는 방식으로 작동합니다. 이 문서의 나머지 부분에서 이러한 경로에 요청을 보내는 방법에 대해 자세히 논의할 것입니다.

 

기억하세요, 포티파이(Fortify)는 라라벨의 인증 기능을 구현하는 데 있어서 빠른 시작을 도와주는 패키지입니다. 이를 사용하는 것은 필수가 아닙니다. 라라벨의 인증 서비스들과 수동으로 상호 작용하는 것도 가능합니다. 이는 인증, 비밀번호 재설정, 이메일 인증 문서에 있는 문서를 따라 할 수 있습니다.

 

What Is Fortify?

라라벨 포티파이(Laravel Fortify)는 앞서 언급했듯이 라라벨의 프론트엔드에 구애받지 않는 인증 백엔드 구현입니다. 포티파이는 로그인, 회원가입, 비밀번호 재설정, 이메일 인증 등 라라벨의 모든 인증 기능을 구현하기 위해 필요한 경로와 컨트롤러를 등록합니다.

라라벨의 인증 기능을 사용하기 위해 반드시 포티파이를 사용할 필요는 없습니다. 인증, 비밀번호 재설정, 이메일 인증 문서에 있는 문서를 따라 라라벨의 인증 서비스와 수동으로 상호 작용할 수 있습니다.

라라벨에 처음 접근하는 경우, 라라벨 포티파이를 사용하기 전에 라라벨 브리즈(Laravel Breeze) 애플리케이션 스타터 키트를 먼저 탐색하는 것이 좋을 수 있습니다. 라라벨 브리즈는 Tailwind CSS로 구축된 사용자 인터페이스가 포함된 애플리케이션의 인증 구조를 제공합니다. 브리즈와 달리 포티파이는 경로와 컨트롤러를 애플리케이션에 직접 게시하지 않습니다. 이를 통해 라라벨의 인증 기능에 익숙해지고 나서 라라벨 포티파이가 이러한 기능을 대신 구현하도록 할 수 있습니다.

라라벨 포티파이는 본질적으로 라라벨 브리즈의 경로와 컨트롤러를 가져와 사용자 인터페이스가 포함되지 않은 패키지로 제공합니다. 이를 통해 특정 프론트엔드에 구애받지 않고 애플리케이션의 인증 계층 백엔드 구현을 신속하게 구축할 수 있습니다.

When Should I Use Fortify?

라라벨 포티파이(Laravel Fortify)를 언제 사용하는 것이 적절한지 궁금해하실 수 있습니다. 먼저, 라라벨의 애플리케이션 스타터 키트 중 하나를 사용하는 경우, 모든 라라벨 애플리케이션 스타터 키트가 이미 완전한 인증 구현을 제공하기 때문에 라라벨 포티파이를 설치할 필요가 없습니다.

애플리케이션 스타터 키트를 사용하지 않고 애플리케이션이 인증 기능을 필요로 하는 경우, 두 가지 옵션이 있습니다: 애플리케이션의 인증 기능을 수동으로 구현하거나 라라벨 포티파이를 사용하여 이러한 기능의 백엔드 구현을 제공합니다.

포티파이를 설치하기로 결정한 경우, 사용자 인터페이스는 사용자 인증 및 등록을 위해 이 문서에서 자세히 설명된 포티파이의 인증 경로로 요청을 보냅니다.

라라벨의 인증 서비스와 수동으로 상호 작용하기로 결정하고 포티파이를 사용하지 않는 경우, 인증, 비밀번호 재설정, 이메일 인증 문서에 있는 문서를 따라 이를 수행할 수 있습니다.

 

Laravel Fortify & Laravel Sanctum

라라벨 생텀(Laravel Sanctum)과 라라벨 포티파이(Laravel Fortify)의 차이점에 대해 혼란을 겪는 개발자들이 있습니다. 두 패키지는 서로 다른 문제를 해결하지만 관련이 있기 때문에, 라라벨 포티파이와 라라벨 생텀은 상호 배타적이거나 경쟁하는 패키지가 아닙니다.

라라벨 생텀은 API 토큰을 관리하고 세션 쿠키나 토큰을 사용하여 기존 사용자를 인증하는 것과 관련이 있습니다. 생텀은 사용자 등록, 비밀번호 재설정 등을 처리하는 경로를 제공하지 않습니다.

API를 제공하거나 싱글 페이지 애플리케이션의 백엔드로 사용되는 애플리케이션의 인증 계층을 수동으로 구축하려는 경우, 사용자 등록, 비밀번호 재설정 등을 위해 라라벨 포티파이와 API 토큰 관리, 세션 인증을 위한 라라벨 생텀을 모두 사용할 수 있습니다.

 

Installation

시작하려면, 컴포저(Composer) 패키지 매니저를 사용하여 포티파이(Fortify)를 설치합니다.

composer require laravel/fortify

 

다음으로, "vendor:publish" 명령어를 사용하여 포티파이(Fortify)의 리소스를 발행합니다.

php artisan vendor:publish --provider="Laravel\Fortify\FortifyServiceProvider"

 

이 명령어는 포티파이(Fortify)의 액션을 앱의 app/Actions 디렉토리로 발행합니다. 이 디렉토리는 존재하지 않을 경우 생성됩니다. 또한, FortifyServiceProvider, 설정 파일, 그리고 필요한 모든 데이터베이스 마이그레이션이 발행됩니다.

다음으로, 데이터베이스 마이그레이션을 수행해야 합니다.

php artisan migrate

 

The Fortify Service Provider

위에서 언급한 vendor:publish 명령어는 App\Providers\FortifyServiceProvider 클래스도 발행합니다. 이 클래스가 애플리케이션의 config/app.php 설정 파일 내의 providers 배열에 등록되었는지 확인해야 합니다.

포티파이 서비스 제공자(Fortify service provider)는 포티파이에 의해 발행된 액션을 등록하고, 포티파이가 각각의 작업이 수행될 때 이들을 사용하도록 지시합니다.

Fortify Features

포티파이(Fortify)의 설정 파일에는 기능 설정 배열이 포함되어 있습니다. 이 배열은 포티파이가 기본적으로 노출할 백엔드 경로/기능을 정의합니다. 라라벨 제트스트림(Laravel Jetstream)과 함께 포티파이를 사용하지 않는 경우, 대부분의 라라벨 애플리케이션에서 제공하는 기본 인증 기능만 활성화하는 것이 좋습니다:

'features' => [
    Features::registration(),
    Features::resetPasswords(),
    Features::emailVerification(),
],

 

Disabling Views

기본적으로 포티파이(Fortify)는 로그인 화면이나 등록 화면과 같은 뷰를 반환하도록 설계된 경로를 정의합니다. 그러나, 자바스크립트 기반의 싱글 페이지 애플리케이션을 구축하는 경우, 이러한 경로가 필요하지 않을 수 있습니다. 이러한 이유로, 애플리케이션의 config/fortify.php 설정 파일 내의 views 설정 값을 false로 설정하여 이러한 경로를 완전히 비활성화할 수 있습니다:

'views'  => false,

 

Disabling Views & Password Reset

포티파이(Fortify)의 뷰를 비활성화하기로 선택하고 애플리케이션에 비밀번호 재설정 기능을 구현할 경우, 여전히 password reset 뷰를 표시하는 password.reset이라는 이름의 경로를 정의해야 합니다. 이는 라라벨의 Illuminate\Auth\Notifications\ResetPassword 알림이 password.reset라는 이름의 경로를 통해 비밀번호 재설정 URL을 생성하기 때문에 필요합니다.

 

Authentication

시작하려면, 우리의 login 뷰를 반환하는 방법을 포티파이(Fortify)에 지시해야 합니다. 기억하세요, 포티파이는 헤드리스(Headless) 인증 라이브러리입니다. 라라벨의 인증 기능을 이미 완성된 프론트엔드 구현으로 사용하고 싶다면, 애플리케이션 스타터 키트를 사용해야 합니다.

인증 뷰의 렌더링 로직은 Laravel\Fortify\Fortify 클래스를 통해 사용할 수 있는 적절한 메소드를 사용하여 사용자 정의할 수 있습니다. 일반적으로, 이 메소드는 애플리케이션의 App\Providers\FortifyServiceProvider 클래스의 boot 메소드에서 호출해야 합니다. 포티파이는 이 뷰를 반환하는 /login 경로를 정의하는 작업을 처리할 것입니다:

use Laravel\Fortify\Fortify;
 
/**
 * Bootstrap any application services.
 */
public function boot(): void
{
    Fortify::loginView(function () {
        return view('auth.login');
    });
 
    // ...
}

 

로그인 템플릿은 /login으로 POST 요청을 보내는 양식을 포함해야 합니다. /login 엔드포인트는 문자열 이메일/사용자명과 비밀번호를 기대합니다. 이메일/사용자명 필드의 이름은 config/fortify.php 설정 파일 내의 username 값과 일치해야 합니다. 또한, 라라벨이 제공하는 remember 기능을 사용하고자 하는 경우, boolean 타입의 remember 필드를 제공할 수 있습니다.

로그인 시도가 성공적이라면, 포티파이는 애플리케이션의 포티파이 설정 파일 내 home 구성 옵션을 통해 구성된 URI로 리디렉션됩니다. 로그인 요청이 XHR 요청이었던 경우, 200 HTTP 응답이 반환됩니다.

요청이 성공적이지 않은 경우, 사용자는 로그인 화면으로 다시 리디렉션되고 검증 오류는 공유되는 Blade 템플릿 변수 $errors 를 통해 사용할 수 있습니다. 또는 XHR 요청의 경우, 검증 오류는 422 HTTP 응답과 함께 반환됩니다.

Customizing User Authentication

포티파이(Fortify)는 제공된 자격 증명과 애플리케이션에 구성된 인증 가드를 기반으로 자동적으로 사용자를 검색하고 인증합니다. 그러나 때로는 로그인 자격 증명이 인증되는 방식과 사용자가 검색되는 방식을 완전히 사용자 정의하고 싶을 수 있습니다. 다행히도, 포티파이는 Fortify::authenticateUsing 메소드를 사용하여 이를 쉽게 달성할 수 있도록 합니다.

이 메소드는 들어오는 HTTP 요청을 받는 클로저(Closure)를 허용합니다. 이 클로저는 요청에 첨부된 로그인 자격 증명을 검증하고 관련 사용자 인스턴스를 반환하는 책임이 있습니다. 자격 증명이 유효하지 않거나 사용자를 찾을 수 없는 경우, 클로저에 의해 null 또는 false가 반환되어야 합니다. 일반적으로 이 메소드는 FortifyServiceProvider의 boot 메소드에서 호출되어야 합니다:

use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Hash;
use Laravel\Fortify\Fortify;
 
/**
 * Bootstrap any application services.
 */
public function boot(): void
{
    Fortify::authenticateUsing(function (Request $request) {
        $user = User::where('email', $request->email)->first();
 
        if ($user &&
            Hash::check($request->password, $user->password)) {
            return $user;
        }
    });
 
    // ...
}

 

Authentication Guard

애플리케이션의 포티파이(Fortify) 설정 파일 내에서 포티파이가 사용하는 인증 가드를 사용자 정의할 수 있습니다. 그러나 구성된 가드가 Illuminate\Contracts\Auth\StatefulGuard의 구현체임을 확실히 해야 합니다. 싱글 페이지 애플리케이션(SPA)을 인증하기 위해 라라벨 포티파이를 사용하려는 경우, 라라벨의 기본 웹 가드를 라라벨 생텀(Laravel Sanctum)과 결합하여 사용해야 합니다.

Customizing The Authentication Pipeline

라라벨 포티파이(Laravel Fortify)는 로그인 요청을 호출 가능한 클래스의 파이프라인을 통해 인증합니다. 원한다면 로그인 요청이 통과해야 할 사용자 정의 클래스 파이프라인을 정의할 수 있습니다. 각 클래스는 들어오는 Illuminate\Http\Request 인스턴스를 받는 __invoke 메소드를 가져야 하며, 미들웨어처럼, 다음 클래스로 요청을 전달하기 위해 호출되는 $next 변수를 가지고 있어야 합니다.

사용자 정의 파이프라인을 정의하려면 Fortify::authenticateThrough 메소드를 사용할 수 있습니다. 이 메소드는 로그인 요청을 통과시킬 클래스 배열을 반환해야 하는 클로저를 허용합니다. 일반적으로 이 메소드는 App\Providers\FortifyServiceProvider 클래스의 boot 메소드에서 호출되어야 합니다.

아래 예시에는 사용자 정의 수정을 시작할 때 사용할 수 있는 기본 파이프라인 정의가 포함되어 있습니다:

 

use Laravel\Fortify\Actions\AttemptToAuthenticate;
use Laravel\Fortify\Actions\EnsureLoginIsNotThrottled;
use Laravel\Fortify\Actions\PrepareAuthenticatedSession;
use Laravel\Fortify\Actions\RedirectIfTwoFactorAuthenticatable;
use Laravel\Fortify\Fortify;
use Illuminate\Http\Request;
 
Fortify::authenticateThrough(function (Request $request) {
    return array_filter([
            config('fortify.limiters.login') ? null : EnsureLoginIsNotThrottled::class,
            Features::enabled(Features::twoFactorAuthentication()) ? RedirectIfTwoFactorAuthenticatable::class : null,
            AttemptToAuthenticate::class,
            PrepareAuthenticatedSession::class,
    ]);
});

Customizing Redirects

로그인 시도가 성공적이라면, 포티파이(Fortify)는 애플리케이션의 포티파이 설정 파일 내에서 구성된 home 구성 옵션을 통해 지정된 URI로 리디렉션됩니다. 로그인 요청이 XHR 요청이었던 경우, 200 HTTP 응답이 반환됩니다. 사용자가 애플리케이션에서 로그아웃 한 후에는 / URI로 리디렉션됩니다.

이 행동의 고급 사용자 정의가 필요한 경우, LoginResponse 및 LogoutResponse 계약의 구현을 라라벨 서비스 컨테이너에 바인딩할 수 있습니다. 일반적으로 이 작업은 애플리케이션의 App\Providers\FortifyServiceProvider 클래스 내의 register 메소드에서 수행되어야 합니다:

use Laravel\Fortify\Contracts\LogoutResponse;
 
/**
 * Register any application services.
 */
public function register(): void
{
    $this->app->instance(LogoutResponse::class, new class implements LogoutResponse {
        public function toResponse($request)
        {
            return redirect('/');
        }
    });
}

 

Two Factor Authentication

포티파이(Fortify)의 이중 인증 기능이 활성화되면, 사용자는 인증 과정 중에 6자리 숫자 토큰을 입력해야 합니다. 이 토큰은 구글 인증기(Google Authenticator)와 같은 TOTP(시간 기반 일회용 비밀번호) 호환 모바일 인증 애플리케이션에서 검색할 수 있는 TOTP를 사용하여 생성됩니다.

시작하기 전에, 먼저 애플리케이션의 App\Models\User 모델이 Laravel\Fortify\TwoFactorAuthenticatable 트레이트를 사용하고 있는지 확인해야 합니다:

<?php
 
namespace App\Models;
 
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Laravel\Fortify\TwoFactorAuthenticatable;
 
class User extends Authenticatable
{
    use Notifiable, TwoFactorAuthenticatable;
}

 

다음으로, 사용자가 이중 인증 설정을 관리할 수 있는 화면을 애플리케이션 내에 구축해야 합니다. 이 화면은 사용자가 이중 인증을 활성화하고 비활성화할 수 있게 해야 하며, 이중 인증 복구 코드를 재생성할 수 있도록 해야 합니다.

기본적으로 포티파이 설정 파일의 features 배열은 변경 전에 비밀번호 확인이 필요한 포티파이의 이중 인증 설정을 지시합니다. 따라서 애플리케이션은 계속하기 전에 포티파이의 비밀번호 확인 기능을 구현해야 합니다.

Enabling Two Factor Authentication

이중 인증을 활성화하기 시작하려면, 애플리케이션이 포티파이(Fortify)에 의해 정의된 /user/two-factor-authentication 엔드포인트로 POST 요청을 보내야 합니다. 요청이 성공적이면, 사용자는 이전 URL로 리디렉션되고 세션 변수의 상태가 two-factor-authentication-enabled 로 설정됩니다. 이 상태 세션 변수를 템플릿 내에서 감지하여 적절한 성공 메시지를 표시할 수 있습니다. 요청이 XHR 요청이었던 경우, 200 HTTP 응답이 반환됩니다.

이중 인증을 활성화하기로 선택한 후에는, 사용자가 유효한 이중 인증 코드를 제공함으로써 이중 인증 구성을 "confirm"해야 합니다. 따라서 "success" 메시지는 사용자에게 이중 인증 확인이 여전히 필요하다는 사실을 지시해야 합니다:

@if (session('status') == 'two-factor-authentication-enabled')
    <div class="mb-4 font-medium text-sm">
        Please finish configuring two factor authentication below.
    </div>
@endif

 

다음으로, 사용자가 인증 애플리케이션에 스캔할 수 있도록 이중 인증 QR 코드를 표시해야 합니다. 애플리케이션의 프론트엔드를 렌더링하기 위해 Blade를 사용하는 경우, 사용자 인스턴스에서 사용할 수 있는 twoFactorQrCodeSvg 메소드를 통해 QR 코드 SVG를 검색할 수 있습니다:

$request->user()->twoFactorQrCodeSvg();

자바스크립트 기반 프론트엔드를 구축하고 있다면, 사용자의 이중 인증 QR 코드를 검색하기 위해 /user/two-factor-qr-code 엔드포인트로 XHR GET 요청을 보낼 수 있습니다. 이 엔드포인트는 svg 키를 포함하는 JSON 객체를 반환할 것입니다.

 

Confirming Two Factor Authentication

사용자의 이중 인증 QR 코드를 표시하는 것 외에도, 사용자가 유효한 인증 코드를 제공하여 이중 인증 구성을 "confirm"할 수 있는 텍스트 입력란을 제공해야 합니다. 이 코드는 라라벨 애플리케이션으로 /user/confirmed-two-factor-authentication 엔드포인트를 통해 POST 요청을 보내서 제공되어야 합니다.

요청이 성공적이라면, 사용자는 이전 URL로 리디렉션되고 세션 변수의 상태는 two-factor-authentication-confirmed로 설정됩니다:

@if (session('status') == 'two-factor-authentication-confirmed')
    <div class="mb-4 font-medium text-sm">
        Two factor authentication confirmed and enabled successfully.
    </div>
@endif

이중 인증 확인 엔드포인트로의 요청이 XHR 요청을 통해 이루어진 경우, 200 HTTP 응답이 반환됩니다.

 

Displaying The Recovery Codes

또한 사용자의 이중 인증 복구 코드를 표시해야 합니다. 이 복구 코드들은 사용자가 모바일 기기에 대한 접근을 잃었을 때 인증할 수 있게 해줍니다. 애플리케이션의 프론트엔드를 렌더링하기 위해 Blade를 사용하는 경우, 인증된 사용자 인스턴스를 통해 복구 코드에 접근할 수 있습니다:

(array) $request->user()->recoveryCodes()

자바스크립트 기반 프론트엔드를 구축하고 있다면, /user/two-factor-recovery-codes 엔드포인트로 XHR GET 요청을 보내 사용자의 복구 코드를 받을 수 있습니다. 이 엔드포인트는 사용자의 복구 코드를 포함하는 JSON 배열을 반환할 것입니다.

사용자의 복구 코드를 재생성하기 위해, 애플리케이션은 /user/two-factor-recovery-codes 엔드포인트로 POST 요청을 보내야 합니다.

 

Authentication With Two Factor Authentication

인증 과정 중, 포티파이(Fortify)는 자동으로 사용자를 애플리케이션의 이중 인증 도전 화면으로 리디렉션합니다. 그러나 애플리케이션이 XHR 로그인 요청을 하고 있는 경우, 성공적인 인증 시도 후 반환되는 JSON 응답에는 two_factor라는 불리언 속성을 가진 JSON 객체가 포함될 것입니다. 이 값을 검사하여 애플리케이션의 이중 인증 도전 화면으로 리디렉션해야 할지 여부를 판단해야 합니다.

이중 인증 기능을 구현하기 시작하려면, 우리가 사용하는 이중 인증 도전 뷰를 반환하는 방법을 포티파이에 지시해야 합니다. 포티파이의 모든 인증 뷰 렌더링 로직은 Laravel\Fortify\Fortify 클래스를 통해 사용 가능한 적절한 메소드를 사용하여 사용자 정의할 수 있습니다. 일반적으로 이 메소드는 애플리케이션의 App\Providers\FortifyServiceProvider 클래스의 boot 메소드에서 호출해야 합니다:

use Laravel\Fortify\Fortify;
 
/**
 * Bootstrap any application services.
 */
public function boot(): void
{
    Fortify::twoFactorChallengeView(function () {
        return view('auth.two-factor-challenge');
    });
 
    // ...
}

 

포티파이(Fortify)는 이 뷰를 반환하는 /two-factor-challenge 경로를 정의하는 작업을 처리할 것입니다. two-factor-challenge 템플릿은 /two-factor-challenge 엔드포인트로 POST 요청을 보내는 양식을 포함해야 합니다. /two-factor-challenge 액션은 유효한 TOTP 토큰을 포함하는 code 필드 또는 사용자의 복구 코드 중 하나를 포함하는 recovery_code 필드를 기대합니다.

로그인 시도가 성공적이라면, 포티파이는 애플리케이션의 포티파이 설정 파일 내에서 구성된 home 구성 옵션을 통해 지정된 URI로 사용자를 리디렉션할 것입니다. 로그인 요청이 XHR 요청이었다면 204 HTTP 응답이 반환됩니다.

요청이 성공적이지 않았다면, 사용자는 이중 인증 도전 화면으로 다시 리디렉션되며, 검증 오류는 공유된  Blade 템플릿 변수 $errors 를 통해 사용할 수 있습니다. 또는 XHR 요청의 경우, 검증 오류는 422 HTTP 응답과 함께 반환됩니다.

Disabling Two Factor Authentication

이중 인증을 비활성화하려면, 애플리케이션이 /user/two-factor-authentication 엔드포인트로 DELETE 요청을 보내야 합니다. 기억하세요, 포티파이(Fortify)의 이중 인증 엔드포인트는 호출되기 전에 비밀번호 확인이 필요합니다.

 

Registration

애플리케이션의 등록 기능을 구현하기 시작하려면, "register" 뷰를 반환하는 방법을 포티파이(Fortify)에 지시해야 합니다. 포티파이는 헤드리스 인증 라이브러리입니다. 라라벨의 인증 기능을 이미 완성된 프론트엔드 구현으로 사용하고 싶다면, 애플리케이션 스타터 키트를 사용해야 합니다.

포티파이의 모든 뷰 렌더링 로직은 Laravel\Fortify\Fortify 클래스를 통해 사용 가능한 적절한 메소드를 사용하여 사용자 정의할 수 있습니다. 일반적으로 이 메소드는 애플리케이션의 App\Providers\FortifyServiceProvider 클래스의 boot 메소드에서 호출해야 합니다:

use Laravel\Fortify\Fortify;
 
/**
 * Bootstrap any application services.
 */
public function boot(): void
{
    Fortify::registerView(function () {
        return view('auth.register');
    });
 
    // ...
}

 

포티파이(Fortify)는 이 뷰를 반환하는 /register 경로를 정의하는 작업을 처리할 것입니다. 등록 템플릿은 포티파이에 의해 정의된 /register 엔드포인트로 POST 요청을 보내는 양식을 포함해야 합니다.

/register 엔드포인트는 문자열 이름, 문자열 이메일 주소/사용자명, 비밀번호, 그리고 비밀번호 확인 필드를 기대합니다. 이메일/사용자명 필드의 이름은 애플리케이션의 포티파이 설정 파일 내에 정의된 username 구성 값과 일치해야 합니다.

등록 시도가 성공적이라면, 포티파이는 애플리케이션의 포티파이 설정 파일 내에서 구성된 home 구성 옵션을 통해 지정된 URI로 사용자를 리디렉션할 것입니다. 요청이 XHR 요청이었다면 201 HTTP 응답이 반환됩니다.

요청이 성공적이지 않았다면, 사용자는 등록 화면으로 다시 리디렉션되며, 검증 오류는 공유된 Blade 템플릿 변수 $errors 를 통해 사용할 수 있습니다. 또는 XHR 요청의 경우, 검증 오류는 422 HTTP 응답과 함께 반환됩니다.

Customizing Registration

사용자 검증 및 생성 프로세스는 라라벨 포티파이(Laravel Fortify) 설치 시 생성된 App\Actions\Fortify\CreateNewUser 액션을 수정함으로써 사용자 정의할 수 있습니다.

 

Password Reset

Requesting A Password Reset Link

애플리케이션의 비밀번호 재설정 기능을 구현하기 시작하려면, "forgot password" 뷰를 반환하는 방법을 포티파이(Fortify)에 지시해야 합니다. 포티파이는 헤드리스 인증 라이브러리입니다. 라라벨의 인증 기능을 이미 완성된 프론트엔드 구현으로 사용하고 싶다면, 애플리케이션 스타터 키트를 사용해야 합니다.

포티파이의 모든 뷰 렌더링 로직은 Laravel\Fortify\Fortify 클래스를 통해 사용 가능한 적절한 메소드를 사용하여 사용자 정의할 수 있습니다. 일반적으로 이 메소드는 애플리케이션의 App\Providers\FortifyServiceProvider 클래스의 boot 메소드에서 호출해야 합니다:

use Laravel\Fortify\Fortify;
 
/**
 * Bootstrap any application services.
 */
public function boot(): void
{
    Fortify::requestPasswordResetLinkView(function () {
        return view('auth.forgot-password');
    });
 
    // ...
}

포티파이(Fortify)는 이 뷰를 반환하는 /forgot-password 엔드포인트를 정의하는 작업을 처리할 것입니다. forgot-password 템플릿은 /forgot-password 엔드포인트로 POST 요청을 보내는 양식을 포함해야 합니다.

/forgot-password 엔드포인트는 문자열 이메일 필드를 기대합니다. 이 필드/데이터베이스 열의 이름은 애플리케이션의 포티파이 설정 파일 내의 이메일 구성 값과 일치해야 합니다.

 

Handling The Password Reset Link Request Response

비밀번호 재설정 링크 요청이 성공적이었다면, 포티파이(Fortify)는 사용자를 /forgot-password 엔드포인트로 다시 리디렉션하고 사용자의 비밀번호를 재설정할 수 있는 안전한 링크가 포함된 이메일을 사용자에게 보낼 것입니다. 요청이 XHR 요청이었다면, 200 HTTP 응답이 반환됩니다.

성공적인 요청 후 /forgot-password 엔드포인트로 다시 리디렉션된 후에는, 세션 변수인 status를 사용하여 비밀번호 재설정 링크 요청 시도의 상태를 표시할 수 있습니다.

$status 세션 변수의 값은 애플리케이션의 passwords 언어 파일 내에 정의된 번역 문자열 중 하나와 일치할 것입니다. 이 값을 사용자 정의하고 싶고 라라벨의 언어 파일을 발행하지 않았다면, lang:publish 아티즌 명령을 통해 할 수 있습니다:

@if (session('status'))
    <div class="mb-4 font-medium text-sm text-green-600">
        {{ session('status') }}
    </div>
@endif

요청이 성공적이지 않았다면, 사용자는 비밀번호 재설정 링크 요청 화면으로 다시 리디렉션되며, 검증 오류는 공유된 Blade 템플릿 $errors 변수를 통해 확인할 수 있습니다. XHR 요청의 경우, 검증 오류는 422 HTTP 응답과 함께 반환됩니다.

 

Resetting The Password

애플리케이션의 비밀번호 재설정 기능을 완성하기 위해, "reset password" 뷰를 반환하는 방법을 포티파이(Fortify)에 지시해야 합니다.

포티파이의 모든 뷰 렌더링 로직은 Laravel\Fortify\Fortify 클래스를 통해 사용 가능한 적절한 메소드를 사용하여 사용자 정의할 수 있습니다. 일반적으로 이 메소드는 애플리케이션의 App\Providers\FortifyServiceProvider 클래스의 boot 메소드에서 호출해야 합니다.

use Laravel\Fortify\Fortify;
use Illuminate\Http\Request;
 
/**
 * Bootstrap any application services.
 */
public function boot(): void
{
    Fortify::resetPasswordView(function (Request $request) {
        return view('auth.reset-password', ['request' => $request]);
    });
 
    // ...
}

포티파이(Fortify)는 이 뷰를 표시하는 경로를 정의하는 작업을 처리할 것입니다. '비밀번호 재설정' 템플릿은 `/reset-password`로 POST 요청을 보내는 양식을 포함해야 합니다.

`/reset-password` 엔드포인트는 문자열 이메일 필드, 비밀번호 필드, 비밀번호 확인 필드, 그리고 `request()->route('token')`의 값을 포함하는 `token`이라는 이름의 숨겨진 필드를 기대합니다. "이메일" 필드/데이터베이스 열의 이름은 애플리케이션의 포티파이 설정 파일 내에 정의된 이메일 구성 값과 일치해야 합니다.

 

Handling The Password Reset Response

비밀번호 재설정 요청이 성공적이었다면, 포티파이(Fortify)는 `/login` 경로로 리디렉션하여 사용자가 새 비밀번호로 로그인할 수 있도록 할 것입니다. 또한, 세션 변수인 status가 설정되어 로그인 화면에서 재설정의 성공적인 상태를 표시할 수 있습니다.

@if (session('status'))
    <div class="mb-4 font-medium text-sm text-green-600">
        {{ session('status') }}
    </div>
@endif

 

요청이 XHR 요청이었다면, 200 HTTP 응답이 반환됩니다.

요청이 성공적이지 않았다면, 사용자는 비밀번호 재설정 화면으로 다시 리디렉션되며, 검증 오류는 공유된 Blade 템플릿 $errors 변수를 통해 확인할 수 있습니다. XHR 요청의 경우, 검증 오류는 422 HTTP 응답과 함께 반환됩니다.

 

Customizing Password Resets

비밀번호 재설정 프로세스는 라라벨 포티파이(Laravel Fortify) 설치 시 생성된 App\Actions\ResetUserPassword 액션을 수정함으로써 사용자 정의할 수 있습니다.

 

Email Verification

등록 후, 사용자가 애플리케이션에 계속 접근하기 전에 이메일 주소를 확인하도록 하고 싶을 수 있습니다. 시작하려면, 먼저 포티파이(Fortify) 설정 파일의 features 배열에서 emailVerification 기능이 활성화되어 있는지 확인해야 합니다. 다음으로, App\Models\User 클래스가 Illuminate\Contracts\Auth\MustVerifyEmail 인터페이스를 구현하고 있는지 확인해야 합니다.

이 두 설정 단계가 완료되면, 새로 등록된 사용자는 이메일 주소 소유권을 확인하라는 이메일을 받게 됩니다. 그러나 사용자에게 이메일에서 확인 링크를 클릭해야 한다는 사실을 알리는 이메일 확인 화면을 표시하는 방법을 포티파이에 알려줘야 합니다.

포티파이의 모든 뷰 렌더링 로직은 Laravel\Fortify\Fortify 클래스를 통해 사용 가능한 적절한 메소드를 사용하여 사용자 정의할 수 있습니다. 일반적으로 이 메소드는 애플리케이션의 App\Providers\FortifyServiceProvider 클래스의 boot 메소드에서 호출해야 합니다:

use Laravel\Fortify\Fortify;
 
/**
 * Bootstrap any application services.
 */
public function boot(): void
{
    Fortify::verifyEmailView(function () {
        return view('auth.verify-email');
    });
 
    // ...
}

 

포티파이(Fortify)는 사용자가 라라벨의 내장된 verified 미들웨어에 의해 /email/verify 엔드포인트로 리디렉션될 때 이 뷰를 표시하는 경로를 정의하는 작업을 처리할 것입니다.

verify-email 템플릿은 사용자에게 이메일 주소로 보낸 이메일 확인 링크를 클릭하라는 정보 메시지를 포함해야 합니다.

 

Resending Email Verification Links

원한다면, 애플리케이션의 verify-email 템플릿에 /email/verification-notification 엔드포인트로 POST 요청을 트리거하는 버튼을 추가할 수 있습니다. 이 엔드포인트가 요청을 받으면, 새로운 확인 이메일 링크가 사용자에게 이메일로 전송되어, 이전 링크가 실수로 삭제되었거나 분실된 경우 새로운 확인 링크를 얻을 수 있습니다.

확인 링크 이메일을 다시 보내는 요청이 성공적이라면, 포티파이(Fortify)는 사용자를 /email/verify 엔드포인트로 다시 리디렉션하고, status 세션 변수를 통해 사용자에게 작업이 성공적이었다는 정보 메시지를 표시할 수 있도록 할 것입니다. 요청이 XHR 요청이었다면, 202 HTTP 응답이 반환됩니다:

@if (session('status') == 'verification-link-sent')
    <div class="mb-4 font-medium text-sm text-green-600">
        A new email verification link has been emailed to you!
    </div>
@endif

 

Protecting Routes

사용자가 이메일 주소를 확인했는지를 요구하는 경로나 경로 그룹을 지정하려면, 라라벨의 내장된 verified 미들웨어를 해당 경로에 첨부해야 합니다. 이 미들웨어는 애플리케이션의 App\Http\Kernel 클래스 내에 등록됩니다:

Route::get('/dashboard', function () {
    // ...
})->middleware(['verified']);

Password Confirmation

애플리케이션을 구축하는 동안, 특정 행동을 수행하기 전에 사용자가 자신의 비밀번호를 확인해야 할 때가 있습니다. 일반적으로 이러한 경로는 라라벨의 내장된 password.confirm 미들웨어에 의해 보호됩니다.

비밀번호 확인 기능을 구현하기 시작하려면, 우리의 애플리케이션 "password comfirmation" 뷰를 반환하는 방법을 포티파이(Fortify)에 지시해야 합니다. 포티파이는 헤드리스 인증 라이브러리입니다. 라라벨의 인증 기능을 이미 완성된 프론트엔드 구현으로 사용하고 싶다면, 애플리케이션 스타터 키트를 사용해야 합니다.

포티파이의 모든 뷰 렌더링 로직은 Laravel\Fortify\Fortify 클래스를 통해 사용 가능한 적절한 메소드를 사용하여 사용자 정의할 수 있습니다. 일반적으로 이 메소드는 애플리케이션의 App\Providers\FortifyServiceProvider 클래스의 boot 메소드에서 호출해야 합니다:

 

use Laravel\Fortify\Fortify;
 
/**
 * Bootstrap any application services.
 */
public function boot(): void
{
    Fortify::confirmPasswordView(function () {
        return view('auth.confirm-password');
    });
 
    // ...
}

 

포티파이(Fortify)는 이 뷰를 반환하는 /user/confirm-password 엔드포인트를 정의하는 작업을 처리할 것입니다.  confirm-password 템플릿은 /user/confirm-password 엔드포인트로 POST 요청을 보내는 양식을 포함해야 합니다. /user/confirm-password 엔드포인트는 사용자의 현재 비밀번호를 포함하는 비밀번호 필드를 기대합니다.

비밀번호가 사용자의 현재 비밀번호와 일치한다면, 포티파이는 사용자를 그들이 접근하려고 했던 경로로 리디렉션할 것입니다. 요청이 XHR 요청이었다면, 201 HTTP 응답이 반환됩니다.

요청이 성공적이지 않았다면, 사용자는 비밀번호 확인 화면으로 다시 리디렉션되며, 검증 오류는 공유된 Blade 템플릿 $errors 변수를 통해 확인할 수 있습니다. XHR 요청의 경우, 검증 오류는 422 HTTP 응답과 함께 반환됩니다.

 

반응형

댓글