Skip to content

비밀번호 재설정

소개

대부분의 웹 애플리케이션은 사용자가 잊어버린 비밀번호를 재설정하는 방법을 제공합니다. 모든 애플리케이션을 만들 때마다 수동으로 이를 다시 구현하도록 강요하는 대신, Laravel은 비밀번호 재설정 링크를 보내고 안전하게 비밀번호를 재설정하는 편리한 서비스를 제공합니다.

lightbulb

빠르게 시작하고 싶으신가요? 새로운 Laravel 애플리케이션에 Laravel 애플리케이션 스타터 키트를 설치하세요. Laravel의 스타터 키트는 잊어버린 비밀번호 재설정을 포함하여 전체 인증 시스템의 스캐폴딩을 처리합니다.

모델 준비

Laravel의 비밀번호 재설정 기능을 사용하기 전에 애플리케이션의 App\Models\User 모델은 Illuminate\Notifications\Notifiable 트레이트를 사용해야 합니다. 일반적으로 이 트레이트는 새로운 Laravel 애플리케이션으로 생성되는 기본 App\Models\User 모델에 이미 포함되어 있습니다.

다음으로, App\Models\User 모델이 Illuminate\Contracts\Auth\CanResetPassword 계약을 구현하는지 확인합니다. 프레임워크에 포함된 App\Models\User 모델은 이미 이 인터페이스를 구현하고 있으며, Illuminate\Auth\Passwords\CanResetPassword 트레이트를 사용하여 인터페이스를 구현하는 데 필요한 메서드를 포함합니다.

데이터베이스 준비

애플리케이션의 비밀번호 재설정 토큰을 저장하기 위한 테이블을 생성해야 합니다. 일반적으로 이는 Laravel의 기본 0001_01_01_000000_create_users_table.php 데이터베이스 마이그레이션에 포함됩니다.

신뢰할 수 있는 호스트 구성

기본적으로 Laravel은 HTTP 요청의 Host 헤더 내용에 관계없이 수신하는 모든 요청에 응답합니다. 또한 웹 요청 중에 애플리케이션에 대한 절대 URL을 생성할 때 Host 헤더의 값이 사용됩니다.

일반적으로 Nginx 또는 Apache와 같은 웹 서버를 구성하여 주어진 호스트 이름과 일치하는 요청만 애플리케이션으로 보내야 합니다. 그러나 웹 서버를 직접 사용자 지정할 수 없고 특정 호스트 이름에만 응답하도록 Laravel에 지시해야 하는 경우 애플리케이션의 bootstrap/app.php 파일에서 trustHosts 미들웨어 메서드를 사용하여 이를 수행할 수 있습니다. 이는 애플리케이션이 비밀번호 재설정 기능을 제공할 때 특히 중요합니다.

이 미들웨어 메서드에 대해 자세히 알아보려면 TrustHosts 미들웨어 문서를 참조하십시오.

라우팅

사용자가 비밀번호를 재설정할 수 있도록 지원하려면 여러 경로를 정의해야 합니다. 먼저, 사용자가 이메일 주소를 통해 비밀번호 재설정 링크를 요청할 수 있도록 처리하는 한 쌍의 경로가 필요합니다. 둘째, 사용자가 이메일로 전송된 비밀번호 재설정 링크를 방문하여 비밀번호 재설정 양식을 완료한 후 실제로 비밀번호를 재설정하는 데 필요한 한 쌍의 경로가 필요합니다.

먼저, 비밀번호 재설정 링크를 요청하는 데 필요한 경로를 정의합니다. 시작하려면 비밀번호 재설정 링크 요청 양식으로 보기를 반환하는 경로를 정의합니다.

Route::get('/forgot-password', function () {
return view('auth.forgot-password');
})->middleware('guest')->name('password.request');

이 경로에서 반환되는 보기에는 주어진 이메일 주소에 대한 비밀번호 재설정 링크를 요청할 수 있도록 하는 email 필드가 포함된 양식이 있어야 합니다.

다음으로, "비밀번호 찾기" 보기에서 양식 제출 요청을 처리하는 경로를 정의합니다. 이 경로는 이메일 주소의 유효성을 검사하고 해당 사용자에게 비밀번호 재설정 요청을 보내는 역할을 합니다.

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Password;
 
Route::post('/forgot-password', function (Request $request) {
$request->validate(['email' => 'required|email']);
 
$status = Password::sendResetLink(
$request->only('email')
);
 
return $status === Password::RESET_LINK_SENT
? back()->with(['status' => __($status)])
: back()->withErrors(['email' => __($status)]);
})->middleware('guest')->name('password.email');

계속 진행하기 전에 이 경로를 자세히 살펴보겠습니다. 먼저 요청의 email 속성의 유효성이 검사됩니다. 다음으로, Laravel의 내장된 "비밀번호 브로커"( Password 파사드를 통해)를 사용하여 사용자에게 비밀번호 재설정 링크를 보냅니다. 비밀번호 브로커는 주어진 필드(이 경우 이메일 주소)로 사용자를 검색하고 Laravel의 내장된 알림 시스템을 통해 사용자에게 비밀번호 재설정 링크를 보내는 작업을 처리합니다.

sendResetLink 메서드는 "상태" 슬러그를 반환합니다. 이 상태는 Laravel의 지역화 도우미를 사용하여 번역하여 요청 상태와 관련된 사용자 친화적인 메시지를 사용자에게 표시할 수 있습니다. 비밀번호 재설정 상태의 번역은 애플리케이션의 lang/{lang}/passwords.php 언어 파일에 의해 결정됩니다. 상태 슬러그의 각 가능한 값에 대한 항목은 passwords 언어 파일 내에 있습니다.

lightbulb

기본적으로 Laravel 애플리케이션 스켈레톤에는 lang 디렉터리가 포함되어 있지 않습니다. Laravel의 언어 파일을 사용자 지정하려면 lang:publish Artisan 명령을 통해 게시할 수 있습니다.

Password 파사드의 sendResetLink 메서드를 호출할 때 Laravel이 애플리케이션의 데이터베이스에서 사용자 레코드를 검색하는 방법을 궁금해할 수 있습니다. Laravel 비밀번호 브로커는 인증 시스템의 "사용자 공급자"를 활용하여 데이터베이스 레코드를 검색합니다. 비밀번호 브로커에서 사용하는 사용자 공급자는 config/auth.php 구성 파일의 passwords 구성 배열 내에서 구성됩니다. 사용자 지정 사용자 공급자를 작성하는 방법에 대해 자세히 알아보려면 인증 문서를 참조하십시오.

lightbulb

비밀번호 재설정을 수동으로 구현하는 경우 보기 및 경로의 내용을 직접 정의해야 합니다. 필요한 모든 인증 및 검증 로직을 포함하는 스캐폴딩을 원하시면 Laravel 애플리케이션 스타터 키트를 확인하세요.

비밀번호 재설정

비밀번호 재설정 양식

다음으로, 사용자가 이메일로 전송된 비밀번호 재설정 링크를 클릭하고 새 비밀번호를 제공한 후 실제로 비밀번호를 재설정하는 데 필요한 경로를 정의합니다. 먼저, 사용자가 비밀번호 재설정 링크를 클릭할 때 표시되는 비밀번호 재설정 양식을 표시하는 경로를 정의해 보겠습니다. 이 경로는 나중에 비밀번호 재설정 요청을 확인하는 데 사용할 token 매개변수를 받습니다.

Route::get('/reset-password/{token}', function (string $token) {
return view('auth.reset-password', ['token' => $token]);
})->middleware('guest')->name('password.reset');

이 경로에서 반환되는 보기에는 email 필드, password 필드, password_confirmation 필드 및 경로에서 받은 비밀 $token 값이 포함된 숨겨진 token 필드가 포함된 양식이 표시되어야 합니다.

양식 제출 처리

물론 비밀번호 재설정 양식 제출을 실제로 처리하는 경로를 정의해야 합니다. 이 경로는 들어오는 요청의 유효성을 검사하고 데이터베이스에서 사용자의 비밀번호를 업데이트하는 역할을 합니다.

use App\Models\User;
use Illuminate\Auth\Events\PasswordReset;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Password;
use Illuminate\Support\Str;
 
Route::post('/reset-password', function (Request $request) {
$request->validate([
'token' => 'required',
'email' => 'required|email',
'password' => 'required|min:8|confirmed',
]);
 
$status = Password::reset(
$request->only('email', 'password', 'password_confirmation', 'token'),
function (User $user, string $password) {
$user->forceFill([
'password' => Hash::make($password)
])->setRememberToken(Str::random(60));
 
$user->save();
 
event(new PasswordReset($user));
}
);
 
return $status === Password::PASSWORD_RESET
? redirect()->route('login')->with('status', __($status))
: back()->withErrors(['email' => [__($status)]]);
})->middleware('guest')->name('password.update');

계속 진행하기 전에 이 경로를 자세히 살펴보겠습니다. 먼저 요청의 token, emailpassword 속성의 유효성이 검사됩니다. 다음으로, Laravel의 내장된 "비밀번호 브로커"( Password 파사드를 통해)를 사용하여 비밀번호 재설정 요청 자격 증명의 유효성을 검사합니다.

비밀번호 브로커에 제공된 토큰, 이메일 주소 및 비밀번호가 유효하면 reset 메서드에 전달된 클로저가 호출됩니다. 사용자 인스턴스와 비밀번호 재설정 양식에 제공된 일반 텍스트 비밀번호를 받는 이 클로저 내에서 데이터베이스에서 사용자의 비밀번호를 업데이트할 수 있습니다.

reset 메서드는 "상태" 슬러그를 반환합니다. 이 상태는 Laravel의 지역화 도우미를 사용하여 번역하여 요청 상태와 관련된 사용자 친화적인 메시지를 사용자에게 표시할 수 있습니다. 비밀번호 재설정 상태의 번역은 애플리케이션의 lang/{lang}/passwords.php 언어 파일에 의해 결정됩니다. 상태 슬러그의 각 가능한 값에 대한 항목은 passwords 언어 파일 내에 있습니다. 애플리케이션에 lang 디렉터리가 없는 경우 lang:publish Artisan 명령을 사용하여 만들 수 있습니다.

계속 진행하기 전에 Password 파사드의 reset 메서드를 호출할 때 Laravel이 애플리케이션의 데이터베이스에서 사용자 레코드를 검색하는 방법을 궁금해할 수 있습니다. Laravel 비밀번호 브로커는 인증 시스템의 "사용자 공급자"를 활용하여 데이터베이스 레코드를 검색합니다. 비밀번호 브로커에서 사용하는 사용자 공급자는 config/auth.php 구성 파일의 passwords 구성 배열 내에서 구성됩니다. 사용자 지정 사용자 공급자를 작성하는 방법에 대해 자세히 알아보려면 인증 문서를 참조하십시오.

만료된 토큰 삭제

만료된 비밀번호 재설정 토큰은 여전히 데이터베이스에 존재합니다. 그러나 auth:clear-resets Artisan 명령을 사용하여 이러한 레코드를 쉽게 삭제할 수 있습니다.

php artisan auth:clear-resets

이 프로세스를 자동화하려면 애플리케이션의 스케줄러에 명령어를 추가하는 것을 고려해 보세요.

use Illuminate\Support\Facades\Schedule;
 
Schedule::command('auth:clear-resets')->everyFifteenMinutes();

커스터마이징

ResetPassword 알림 클래스에서 제공하는 createUrlUsing 메서드를 사용하여 비밀번호 재설정 링크 URL을 커스터마이징할 수 있습니다. 이 메서드는 알림을 받는 사용자 인스턴스와 비밀번호 재설정 링크 토큰을 받는 클로저를 허용합니다. 일반적으로 App\Providers\AppServiceProvider 서비스 프로바이더의 boot 메서드에서 이 메서드를 호출해야 합니다.

use App\Models\User;
use Illuminate\Auth\Notifications\ResetPassword;
 
/**
* 모든 애플리케이션 서비스 부트스트랩.
*/
public function boot(): void
{
ResetPassword::createUrlUsing(function (User $user, string $token) {
return 'https://example.com/reset-password?token='.$token;
});
}

재설정 이메일 커스터마이징

사용자에게 비밀번호 재설정 링크를 보내는 데 사용되는 알림 클래스를 쉽게 수정할 수 있습니다. 시작하려면 App\Models\User 모델에서 sendPasswordResetNotification 메서드를 재정의하십시오. 이 메서드 내에서 직접 만든 알림 클래스를 사용하여 알림을 보낼 수 있습니다. 비밀번호 재설정 $token은 메서드가 받는 첫 번째 인자입니다. 이 $token을 사용하여 선택한 비밀번호 재설정 URL을 만들고 사용자에게 알림을 보낼 수 있습니다.

use App\Notifications\ResetPasswordNotification;
 
/**
* 사용자에게 비밀번호 재설정 알림을 보냅니다.
*
* @param string $token
*/
public function sendPasswordResetNotification($token): void
{
$url = 'https://example.com/reset-password?token='.$token;
 
$this->notify(new ResetPasswordNotification($url));
}