Skip to content

라라벨 Fortify

소개

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

Fortify는 자체 사용자 인터페이스를 제공하지 않으므로, 등록된 라우트에 요청을 보내는 자체 사용자 인터페이스와 함께 사용하도록 설계되었습니다. 이 문서의 나머지 부분에서 이러한 라우트에 요청을 보내는 방법을 정확하게 설명하겠습니다.

lightbulb

Fortify는 라라벨의 인증 기능 구현을 시작하는 데 도움이 되는 패키지입니다. 반드시 사용해야 하는 것은 아닙니다. 인증, 비밀번호 재설정이메일 확인 문서에서 제공되는 설명에 따라 언제든지 라라벨의 인증 서비스와 수동으로 상호 작용할 수 있습니다.

Fortify란 무엇인가?

앞서 언급했듯이, Laravel Fortify는 라라벨용 프런트엔드에 구애받지 않는 인증 백엔드 구현입니다. Fortify는 로그인, 등록, 비밀번호 재설정, 이메일 확인 등 라라벨의 모든 인증 기능을 구현하는 데 필요한 라우트와 컨트롤러를 등록합니다.

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

라라벨을 처음 사용하는 경우, Laravel Fortify를 사용하기 전에 Laravel Breeze 애플리케이션 스타터 키트를 살펴보는 것이 좋습니다. Laravel Breeze는 Tailwind CSS로 빌드된 사용자 인터페이스를 포함하여 애플리케이션에 대한 인증 스캐폴딩을 제공합니다. Fortify와 달리 Breeze는 라우트와 컨트롤러를 애플리케이션에 직접 게시합니다. 이를 통해 라라벨 Fortify가 이러한 기능을 구현하도록 하기 전에 라라벨의 인증 기능을 연구하고 익숙해질 수 있습니다.

Laravel Fortify는 기본적으로 Laravel Breeze의 라우트와 컨트롤러를 가져와 사용자 인터페이스를 포함하지 않는 패키지로 제공합니다. 이를 통해 특정 프런트엔드 의견에 얽매이지 않고도 애플리케이션 인증 계층의 백엔드 구현을 빠르게 스캐폴딩할 수 있습니다.

언제 Fortify를 사용해야 할까?

Laravel Fortify를 사용하는 것이 적절한 시기가 궁금할 수 있습니다. 먼저, 라라벨의 애플리케이션 스타터 키트 중 하나를 사용하고 있는 경우, 라라벨의 모든 애플리케이션 스타터 키트가 이미 완전한 인증 구현을 제공하므로 Laravel Fortify를 설치할 필요가 없습니다.

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

Fortify를 설치하기로 선택한 경우, 사용자 인터페이스는 사용자를 인증하고 등록하기 위해 이 문서에 자세히 설명된 Fortify의 인증 라우트에 요청을 보냅니다.

Fortify를 사용하는 대신 라라벨의 인증 서비스와 수동으로 상호 작용하기로 선택한 경우, 인증, 비밀번호 재설정이메일 확인 문서에서 제공되는 설명에 따라 그렇게 할 수 있습니다.

Laravel Fortify와 Laravel Sanctum

일부 개발자는 Laravel Sanctum과 Laravel Fortify의 차이점에 대해 혼란스러워합니다. 두 패키지가 서로 다르고 관련성이 있는 문제를 해결하기 때문에 Laravel Fortify와 Laravel Sanctum은 상호 배타적이거나 경쟁하는 패키지가 아닙니다.

Laravel Sanctum은 API 토큰 관리와 세션 쿠키 또는 토큰을 사용한 기존 사용자 인증에만 관여합니다. Sanctum은 사용자 등록, 비밀번호 재설정 등을 처리하는 라우트를 제공하지 않습니다.

API를 제공하거나 단일 페이지 애플리케이션의 백엔드 역할을 하는 애플리케이션의 인증 계층을 수동으로 빌드하려는 경우, Laravel Fortify(사용자 등록, 비밀번호 재설정 등)와 Laravel Sanctum(API 토큰 관리, 세션 인증)을 모두 활용할 수 있습니다.

설치

시작하려면 Composer 패키지 관리자를 사용하여 Fortify를 설치하세요.

composer require laravel/fortify

다음으로, fortify:install Artisan 명령어를 사용하여 Fortify의 리소스를 게시합니다:

php artisan fortify:install

이 명령어는 Fortify의 액션을 app/Actions 디렉토리에 게시합니다. 해당 디렉토리가 존재하지 않으면 생성됩니다. 또한, FortifyServiceProvider, 설정 파일 및 필요한 모든 데이터베이스 마이그레이션 파일이 게시됩니다.

다음으로, 데이터베이스를 마이그레이션해야 합니다:

php artisan migrate

Fortify 기능

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

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

뷰 비활성화

기본적으로 Fortify는 로그인 화면 또는 등록 화면과 같은 뷰를 반환하기 위한 라우트를 정의합니다. 하지만 JavaScript 기반 싱글 페이지 애플리케이션을 구축하는 경우 이러한 라우트가 필요하지 않을 수 있습니다. 이러한 이유로, 애플리케이션의 config/fortify.php 설정 파일 내에서 views 설정 값을 false로 설정하여 이러한 라우트를 완전히 비활성화할 수 있습니다:

'views' => false,

뷰 및 비밀번호 재설정 비활성화

Fortify의 뷰를 비활성화하고 애플리케이션에 대한 비밀번호 재설정 기능을 구현하는 경우, 애플리케이션의 "비밀번호 재설정" 뷰를 표시하는 역할을 하는 password.reset이라는 이름의 라우트를 정의해야 합니다. 이는 Laravel의 Illuminate\Auth\Notifications\ResetPassword 알림이 password.reset 이름의 라우트를 통해 비밀번호 재설정 URL을 생성하기 때문에 필요합니다.

인증

시작하려면 Fortify에게 "로그인" 뷰를 반환하는 방법을 알려줘야 합니다. Fortify는 헤드리스 인증 라이브러리입니다. Laravel의 인증 기능이 이미 완료된 프런트엔드 구현을 원하시면 애플리케이션 스타터 키트를 사용해야 합니다.

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

use Laravel\Fortify\Fortify;
 
/**
* 모든 애플리케이션 서비스 부트스트랩
*/
public function boot(): void
{
Fortify::loginView(function () {
return view('auth.login');
});
 
// ...
}

로그인 템플릿에는 /login으로 POST 요청을 보내는 양식이 포함되어야 합니다. /login 엔드포인트는 문자열 email/usernamepassword를 필요로 합니다. 이메일/사용자 이름 필드의 이름은 config/fortify.php 구성 파일 내의 username 값과 일치해야 합니다. 또한 사용자가 Laravel에서 제공하는 "나를 기억하기" 기능을 사용하고 싶다는 것을 나타내기 위해 부울 값 remember 필드를 제공할 수도 있습니다.

로그인 시도가 성공하면 Fortify는 애플리케이션의 fortify 구성 파일 내의 home 구성 옵션을 통해 구성된 URI로 사용자를 리디렉션합니다. 로그인 요청이 XHR 요청인 경우, 200 HTTP 응답이 반환됩니다.

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

사용자 인증 사용자 지정

Fortify는 제공된 자격 증명과 애플리케이션에 구성된 인증 가드를 기반으로 사용자를 자동으로 검색하고 인증합니다. 그러나 때로는 로그인 자격 증명이 인증되고 사용자가 검색되는 방법에 대한 전체 사용자 지정을 원할 수도 있습니다. 다행히 Fortify를 사용하면 Fortify::authenticateUsing 메서드를 사용하여 이를 쉽게 수행할 수 있습니다.

이 메서드는 들어오는 HTTP 요청을 받는 클로저를 허용합니다. 클로저는 요청에 첨부된 로그인 자격 증명을 확인하고 관련 사용자 인스턴스를 반환하는 역할을 합니다. 자격 증명이 유효하지 않거나 사용자를 찾을 수 없는 경우 클로저에서 null 또는 false를 반환해야 합니다. 일반적으로 이 메서드는 FortifyServiceProviderboot 메서드에서 호출해야 합니다.

use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Hash;
use Laravel\Fortify\Fortify;
 
/**
* 모든 애플리케이션 서비스를 부트스트랩합니다.
*/
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;
}
});
 
// ...
}

인증 가드

애플리케이션의 fortify 설정 파일에서 Fortify가 사용하는 인증 가드를 사용자 정의할 수 있습니다. 그러나 구성된 가드가 Illuminate\Contracts\Auth\StatefulGuard의 구현인지 확인해야 합니다. Laravel Fortify를 사용하여 SPA를 인증하려는 경우 Laravel Sanctum과 함께 Laravel의 기본 web 가드를 사용해야 합니다.

인증 파이프라인 사용자 정의

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

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

아래 예제는 사용자 정의 수정 시 시작점으로 사용할 수 있는 기본 파이프라인 정의를 포함합니다.

use Laravel\Fortify\Actions\AttemptToAuthenticate;
use Laravel\Fortify\Actions\CanonicalizeUsername;
use Laravel\Fortify\Actions\EnsureLoginIsNotThrottled;
use Laravel\Fortify\Actions\PrepareAuthenticatedSession;
use Laravel\Fortify\Actions\RedirectIfTwoFactorAuthenticatable;
use Laravel\Fortify\Features;
use Laravel\Fortify\Fortify;
use Illuminate\Http\Request;
 
Fortify::authenticateThrough(function (Request $request) {
return array_filter([
// fortify.limiters.login 설정이 되어있으면 null, 아니면 EnsureLoginIsNotThrottled 클래스를 사용합니다.
config('fortify.limiters.login') ? null : EnsureLoginIsNotThrottled::class,
// fortify.lowercase_usernames 설정이 되어있으면 CanonicalizeUsername 클래스를 사용하고, 아니면 null을 사용합니다.
config('fortify.lowercase_usernames') ? CanonicalizeUsername::class : null,
// 2단계 인증 기능이 활성화되어 있으면 RedirectIfTwoFactorAuthenticatable 클래스를 사용하고, 아니면 null을 사용합니다.
Features::enabled(Features::twoFactorAuthentication()) ? RedirectIfTwoFactorAuthenticatable::class : null,
AttemptToAuthenticate::class,
PrepareAuthenticatedSession::class,
]);
});

인증 스로틀링

기본적으로 Fortify는 EnsureLoginIsNotThrottled 미들웨어를 사용하여 인증 시도를 스로틀링합니다. 이 미들웨어는 사용자 이름과 IP 주소 조합에 고유한 시도를 스로틀링합니다.

일부 애플리케이션에서는 IP 주소만으로 스로틀링하는 것과 같이 인증 시도를 스로틀링하는 다른 접근 방식이 필요할 수 있습니다. 따라서 Fortify를 사용하면 fortify.limiters.login 구성 옵션을 통해 자체 속도 제한기를 지정할 수 있습니다. 물론 이 구성 옵션은 애플리케이션의 config/fortify.php 구성 파일에 있습니다.

lightbulb

스로틀링, 2단계 인증 및 외부 웹 애플리케이션 방화벽(WAF)을 혼합하여 사용하면 합법적인 애플리케이션 사용자에게 가장 강력한 방어를 제공할 수 있습니다.

리디렉션 사용자 정의

로그인 시도가 성공하면 Fortify는 애플리케이션의 fortify 구성 파일 내의 home 구성 옵션을 통해 구성된 URI로 리디렉션합니다. 로그인 요청이 XHR 요청인 경우 200 HTTP 응답이 반환됩니다. 사용자가 애플리케이션에서 로그아웃하면 사용자는 / URI로 리디렉션됩니다.

이 동작에 대한 고급 사용자 정의가 필요한 경우 LoginResponseLogoutResponse 계약의 구현을 Laravel 서비스 컨테이너에 바인딩할 수 있습니다. 일반적으로 이 작업은 애플리케이션의 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('/');
}
});
}

2단계 인증

Fortify의 2단계 인증 기능이 활성화되면, 사용자는 인증 과정에서 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;
}

다음으로, 애플리케이션 내에서 사용자가 2단계 인증 설정을 관리할 수 있는 화면을 만들어야 합니다. 이 화면에서는 사용자가 2단계 인증을 활성화 및 비활성화하고 2단계 인증 복구 코드를 재생성할 수 있어야 합니다.

기본적으로 fortify 구성 파일의 features 배열은 Fortify의 2단계 인증 설정이 수정 전에 비밀번호 확인을 요구하도록 지시합니다. 따라서 애플리케이션은 계속하기 전에 Fortify의 비밀번호 확인 기능을 구현해야 합니다.

2단계 인증 활성화

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

2단계 인증을 활성화하도록 선택한 후에도 사용자는 유효한 2단계 인증 코드를 제공하여 2단계 인증 구성을 "확인"해야 합니다. 따라서 "성공" 메시지는 사용자에게 2단계 인증 확인이 여전히 필요함을 알려야 합니다.

@if (session('status') == 'two-factor-authentication-enabled')
<div class="mb-4 font-medium text-sm">
아래에서 2단계 인증 구성을 완료하세요.
</div>
@endif

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

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

만약 JavaScript로 구동되는 프론트엔드를 구축 중이라면, /user/two-factor-qr-code 엔드포인트에 XHR GET 요청을 보내 사용자의 2단계 인증 QR 코드를 가져올 수 있습니다. 이 엔드포인트는 svg 키를 포함하는 JSON 객체를 반환합니다.

2단계 인증 확인

사용자의 2단계 인증 QR 코드를 표시하는 것 외에도, 사용자가 2단계 인증 구성을 "확인"하기 위해 유효한 인증 코드를 제공할 수 있는 텍스트 입력란을 제공해야 합니다. 이 코드는 Fortify에 의해 정의된 /user/confirmed-two-factor-authentication 엔드포인트로 POST 요청을 통해 Laravel 애플리케이션에 제공되어야 합니다.

요청이 성공하면 사용자는 이전 URL로 리디렉션되고 status 세션 변수는 two-factor-authentication-confirmed로 설정됩니다.

@if (session('status') == 'two-factor-authentication-confirmed')
<div class="mb-4 font-medium text-sm">
2단계 인증이 확인되었고 성공적으로 활성화되었습니다.
</div>
@endif

만약 2단계 인증 확인 엔드포인트에 대한 요청이 XHR 요청을 통해 이루어졌다면, 200 HTTP 응답이 반환될 것입니다.

복구 코드 표시

사용자의 2단계 복구 코드도 표시해야 합니다. 이러한 복구 코드는 사용자가 모바일 장치에 대한 접근 권한을 잃은 경우 인증할 수 있도록 합니다. Blade를 사용하여 애플리케이션의 프론트엔드를 렌더링하는 경우, 인증된 사용자 인스턴스를 통해 복구 코드에 접근할 수 있습니다.

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

만약 JavaScript 기반 프론트엔드를 구축하고 있다면, /user/two-factor-recovery-codes 엔드포인트로 XHR GET 요청을 보낼 수 있습니다. 이 엔드포인트는 사용자의 복구 코드를 담은 JSON 배열을 반환합니다.

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

2단계 인증으로 인증하기

인증 과정에서 Fortify는 자동으로 사용자를 애플리케이션의 2단계 인증 챌린지 화면으로 리디렉션합니다. 그러나 애플리케이션에서 XHR 로그인 요청을 보내는 경우, 성공적인 인증 시도 후 반환되는 JSON 응답에는 two_factor 부울 속성을 가진 JSON 객체가 포함됩니다. 이 값을 검사하여 애플리케이션의 2단계 인증 챌린지 화면으로 리디렉션해야 하는지 여부를 알아야 합니다.

2단계 인증 기능을 구현하기 시작하려면 Fortify에 2단계 인증 챌린지 뷰를 반환하는 방법을 알려줘야 합니다. Fortify의 모든 인증 뷰 렌더링 로직은 Laravel\Fortify\Fortify 클래스를 통해 제공되는 적절한 메서드를 사용하여 사용자 정의할 수 있습니다. 일반적으로 애플리케이션의 App\Providers\FortifyServiceProvider 클래스의 boot 메서드에서 이 메서드를 호출해야 합니다.

use Laravel\Fortify\Fortify;
 
/**
* 애플리케이션 서비스 부트스트랩.
*/
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 필드를 예상합니다.

로그인 시도가 성공하면 Fortify는 애플리케이션의 fortify 구성 파일 내의 home 구성 옵션을 통해 구성된 URI로 사용자를 리디렉션합니다. 로그인 요청이 XHR 요청인 경우 204 HTTP 응답이 반환됩니다.

요청이 성공하지 못하면 사용자는 2단계 인증 챌린지 화면으로 다시 리디렉션되며 유효성 검사 오류는 공유된 $errors Blade 템플릿 변수를 통해 사용할 수 있습니다. 또는 XHR 요청의 경우 유효성 검사 오류가 422 HTTP 응답으로 반환됩니다.

2단계 인증 비활성화

2단계 인증을 비활성화하려면 애플리케이션에서 /user/two-factor-authentication 엔드포인트에 DELETE 요청을 보내야 합니다. Fortify의 2단계 인증 엔드포인트는 호출되기 전에 비밀번호 확인이 필요하다는 점을 기억하십시오.

등록

애플리케이션의 등록 기능을 구현하기 시작하려면 먼저 Fortify에 "등록" 뷰를 반환하는 방법을 지시해야 합니다. Fortify는 헤드리스 인증 라이브러리라는 점을 기억하십시오. 이미 완료된 Laravel의 인증 기능의 프런트엔드 구현을 원하면 애플리케이션 스타터 키트를 사용해야 합니다.

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

use Laravel\Fortify\Fortify;
 
/**
* 애플리케이션 서비스들을 부트스트랩합니다.
*/
public function boot(): void
{
Fortify::registerView(function () {
return view('auth.register');
});
 
// ...
}

Fortify는 이 뷰를 반환하는 /register 경로를 정의하는 것을 처리합니다. register 템플릿에는 Fortify에서 정의한 /register 엔드포인트로 POST 요청을 보내는 폼이 포함되어야 합니다.

/register 엔드포인트는 문자열 name, 문자열 이메일 주소/사용자 이름, passwordpassword_confirmation 필드를 필요로 합니다. 이메일/사용자 이름 필드의 이름은 애플리케이션의 fortify 구성 파일 내에 정의된 username 구성 값과 일치해야 합니다.

등록 시도가 성공하면 Fortify는 사용자를 애플리케이션의 fortify 구성 파일 내에 home 구성 옵션을 통해 구성된 URI로 리디렉션합니다. 요청이 XHR 요청인 경우 201 HTTP 응답이 반환됩니다.

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

등록 사용자 정의하기

사용자 유효성 검사 및 생성 프로세스는 Laravel Fortify를 설치했을 때 생성된 App\Actions\Fortify\CreateNewUser 액션을 수정하여 사용자 정의할 수 있습니다.

비밀번호 재설정

애플리케이션의 비밀번호 재설정 기능을 구현하기 시작하려면 먼저 Fortify에 "비밀번호 찾기" 뷰를 반환하는 방법을 지시해야 합니다. Fortify는 헤드리스 인증 라이브러리라는 점을 기억하십시오. Laravel의 인증 기능이 이미 완료된 프런트엔드 구현을 원하시면 애플리케이션 스타터 키트를 사용해야 합니다.

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

use Laravel\Fortify\Fortify;
 
/**
* 모든 애플리케이션 서비스를 부트스트랩합니다.
*/
public function boot(): void
{
Fortify::requestPasswordResetLinkView(function () {
return view('auth.forgot-password');
});
 
// ...
}

Fortify는 이 뷰를 반환하는 /forgot-password 엔드포인트를 정의하는 것을 처리합니다. forgot-password 템플릿에는 /forgot-password 엔드포인트로 POST 요청을 보내는 폼이 포함되어야 합니다.

/forgot-password 엔드포인트는 문자열 email 필드를 예상합니다. 이 필드/데이터베이스 컬럼의 이름은 애플리케이션의 fortify 구성 파일 내의 email 구성 값과 일치해야 합니다.

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

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

$status 세션 변수의 값은 애플리케이션의 passwords 언어 파일 내에 정의된 번역 문자열 중 하나와 일치합니다. 이 값을 사용자 정의하고 Laravel의 언어 파일을 게시하지 않은 경우 lang:publish Artisan 명령을 통해 수행할 수 있습니다:

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

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

비밀번호 재설정

애플리케이션의 비밀번호 재설정 기능을 구현하려면 Fortify에 "비밀번호 재설정" 뷰를 반환하는 방법을 알려줘야 합니다.

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 템플릿에는 /reset-password에 POST 요청을 보내는 폼이 포함되어야 합니다.

/reset-password 엔드포인트는 문자열 email 필드, password 필드, password_confirmation 필드 및 request()->route('token') 값을 포함하는 token 이라는 숨겨진 필드를 예상합니다. "email" 필드/데이터베이스 열의 이름은 애플리케이션의 fortify 구성 파일 내에 정의된 email 구성 값과 일치해야 합니다.

비밀번호 재설정 응답 처리

비밀번호 재설정 요청이 성공하면 Fortify는 사용자가 새 비밀번호로 로그인할 수 있도록 /login 경로로 다시 리디렉션합니다. 또한 로그인 화면에서 재설정 성공 상태를 표시할 수 있도록 status 세션 변수가 설정됩니다.

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

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

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

비밀번호 재설정 사용자 정의

비밀번호 재설정 과정은 Laravel Fortify를 설치할 때 생성된 App\Actions\ResetUserPassword 액션을 수정하여 사용자 정의할 수 있습니다.

이메일 인증

등록 후, 사용자가 애플리케이션에 계속 액세스하기 전에 이메일 주소를 인증하도록 할 수 있습니다. 시작하려면, fortify 구성 파일의 features 배열에서 emailVerification 기능이 활성화되어 있는지 확인하십시오. 다음으로, App\Models\User 클래스가 Illuminate\Contracts\Auth\MustVerifyEmail 인터페이스를 구현해야 합니다.

이 두 가지 설정 단계가 완료되면, 새로 등록된 사용자는 자신의 이메일 주소 소유권을 확인하도록 요청하는 이메일을 받게 됩니다. 그러나 이메일에서 인증 링크를 클릭해야 한다는 것을 사용자에게 알리는 이메일 인증 화면을 Fortify가 표시하는 방법을 알려야 합니다.

Fortify의 모든 뷰 렌더링 로직은 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는 사용자가 Laravel의 내장된 verified 미들웨어에 의해 /email/verify 엔드포인트로 리디렉션될 때 이 뷰를 표시하는 라우트를 정의합니다.

verify-email 템플릿에는 사용자에게 이메일 주소로 전송된 이메일 확인 링크를 클릭하라는 안내 메시지가 포함되어야 합니다.

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

확인 링크 이메일을 재전송하는 요청이 성공하면 Fortify는 status 세션 변수와 함께 사용자를 다시 /email/verify 엔드포인트로 리디렉션하여 사용자에게 작업이 성공했음을 알리는 정보 메시지를 표시할 수 있습니다. 요청이 XHR 요청인 경우 202 HTTP 응답이 반환됩니다.

@if (session('status') == 'verification-link-sent')
<div class="mb-4 font-medium text-sm text-green-600">
새 이메일 확인 링크가 이메일로 전송되었습니다!
</div>
@endif

라우트 보호

라우트 또는 라우트 그룹에서 사용자가 이메일 주소를 확인했는지 요구하려면 Laravel의 내장된 verified 미들웨어를 라우트에 연결해야 합니다. verified 미들웨어 별칭은 Laravel에 의해 자동으로 등록되며 Illuminate\Auth\Middleware\EnsureEmailIsVerified 미들웨어의 별칭 역할을 합니다.

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

비밀번호 확인

애플리케이션을 개발하는 동안, 때때로 사용자에게 작업을 수행하기 전에 비밀번호를 확인하도록 요구해야 하는 경우가 있습니다. 일반적으로 이러한 경로는 Laravel의 내장 password.confirm 미들웨어에 의해 보호됩니다.

비밀번호 확인 기능을 구현하려면 Fortify에게 애플리케이션의 "비밀번호 확인" 뷰를 반환하는 방법을 알려주어야 합니다. Fortify는 헤드리스 인증 라이브러리라는 점을 기억하세요. 이미 완료된 Laravel 인증 기능의 프런트엔드 구현을 원한다면 애플리케이션 스타터 키트를 사용해야 합니다.

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

use Laravel\Fortify\Fortify;
 
/**
* 모든 애플리케이션 서비스 부트스트랩.
*/
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 엔드포인트는 사용자의 현재 비밀번호를 담고 있는 password 필드를 필요로 합니다.

비밀번호가 사용자의 현재 비밀번호와 일치하면, Fortify는 사용자를 접근하려고 시도했던 경로로 리디렉션합니다. 요청이 XHR 요청인 경우, 201 HTTP 응답이 반환됩니다.

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