해싱
번역일: 2026년 6월 20일
해싱
소개
Laravel의 Hash 파사드는 사용자 비밀번호를 안전하게 저장하기 위해 Bcrypt와 Argon2 해싱 알고리즘을 제공합니다. Laravel 스타터 킷을 사용하고 있다면, 회원가입과 인증에는 기본적으로 Bcrypt가 사용됩니다.
Bcrypt가 비밀번호 해싱에 적합한 이유는 "작업 계수(work factor)"를 조정할 수 있기 때문입니다. 하드웨어 성능이 향상될수록 해시 생성에 걸리는 시간을 늘려 보안 수준을 유지할 수 있습니다. 비밀번호 해싱에서는 느릴수록 좋습니다. 해싱 속도가 느릴수록, 공격자가 무차별 대입 공격에 쓰이는 "레인보우 테이블"을 생성하는 데 더 오랜 시간이 걸리기 때문입니다.
설정
애플리케이션의 기본 해싱 드라이버는 config/hashing.php 설정 파일에서 지정합니다. 현재 지원되는 드라이버는 Bcrypt와 Argon2(Argon2i 및 Argon2id 변형)입니다.
기본 사용법
비밀번호 해싱
Hash 파사드의 make 메서드를 호출하여 비밀번호를 해싱할 수 있습니다.
<?php
namespace App\Http\Controllers;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Hash;
class PasswordController extends Controller
{
/**
* 사용자의 비밀번호를 변경합니다.
*/
public function update(Request $request): RedirectResponse
{
// 새 비밀번호 길이 등 유효성 검사...
$request->user()->fill([
'password' => Hash::make($request->newPassword)
])->save();
return redirect('/profile');
}
}Bcrypt 작업 계수 조정
Bcrypt 알고리즘을 사용하는 경우, make 메서드의 rounds 옵션으로 작업 계수를 조정할 수 있습니다. 다만 Laravel의 기본값은 대부분의 애플리케이션에 충분합니다.
$hashed = Hash::make('비밀번호', [
'rounds' => 12,
]);Argon2 작업 계수 조정
Argon2 알고리즘을 사용하는 경우, make 메서드에서 memory, time, threads 옵션으로 작업 계수를 조정할 수 있습니다. 마찬가지로 Laravel의 기본값은 대부분의 애플리케이션에 적합합니다.
$hashed = Hash::make('비밀번호', [
'memory' => 1024,
'time' => 2,
'threads' => 2,
]);NOTE
각 옵션에 대한 자세한 내용은 Argon 해싱에 관한 공식 PHP 문서를 참고하세요.
비밀번호와 해시 값 비교
Hash 파사드의 check 메서드를 사용하면 주어진 평문 문자열이 특정 해시 값과 일치하는지 확인할 수 있습니다.
if (Hash::check('평문-비밀번호', $hashedPassword)) {
// 비밀번호가 일치합니다...
}재해싱 필요 여부 확인
Hash 파사드의 needsRehash 메서드를 사용하면, 비밀번호가 해싱된 이후 작업 계수가 변경되었는지 확인할 수 있습니다. 일부 애플리케이션은 사용자가 로그인할 때 이 검사를 수행하여, 설정이 변경된 경우 비밀번호를 자동으로 재해싱합니다.
if (Hash::needsRehash($hashed)) {
$hashed = Hash::make('평문-비밀번호');
}NOTE
재해싱 검사는 보통 로그인 성공 직후, 사용자의 평문 비밀번호에 접근할 수 있는 시점에 수행하는 것이 좋습니다. 이미 해시된 값만 저장되어 있다면 평문을 다시 얻을 수 없으므로, 재해싱 기회를 놓치게 됩니다.