본문으로 건너뛰기
버전: 8.x

해싱 (Hashing)

소개

라라벨의 Hash 파사드는 사용자 비밀번호를 안전하게 저장하기 위해 Bcrypt와 Argon2 해싱 방식을 제공합니다. 라라벨 애플리케이션 스타터 키트 중 하나를 사용한다면, 기본적으로 회원가입과 인증 과정에 Bcrypt가 사용됩니다.

Bcrypt는 비밀번호 해싱을 위한 훌륭한 선택인데, 해싱에 소요되는 "워크 팩터(work factor, 연산 횟수)"를 조절할 수 있기 때문입니다. 즉, 하드웨어 성능이 높아지면 해시 생성 시간이 더 오래 걸리도록 조정할 수 있습니다. 비밀번호 해싱에 있어서는 느릴수록 좋습니다. 알고리즘이 비밀번호를 해시하는 데 오래 걸릴수록, 악의적인 사용자가 무차별 대입 공격(브루트 포스)에 쓸 수 있는 "레인보우 테이블"(모든 가능한 문자열의 해시값 목록)을 생성하는 데도 그만큼 시간이 더 들기 때문입니다.

설정

애플리케이션의 기본 해싱 드라이버는 config/hashing.php 설정 파일에서 지정할 수 있습니다. 현재 지원되는 드라이버는 BcryptArgon2 (Argon2i, Argon2id 변종 포함)입니다.

[!NOTE] Argon2i 드라이버를 사용하려면 PHP 7.2.0 이상, Argon2id 드라이버를 사용하려면 PHP 7.3.0 이상이 필요합니다.

기본 사용법

비밀번호 해싱

Hash 파사드의 make 메서드를 사용하여 비밀번호를 해싱할 수 있습니다.

<?php

namespace App\Http\Controllers;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Hash;

class PasswordController extends Controller
{
/**
* Update the password for the user.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function update(Request $request)
{
// Validate the new password length...

$request->user()->fill([
'password' => Hash::make($request->newPassword)
])->save();
}
}

Bcrypt 워크 팩터 조정

Bcrypt 알고리즘을 사용할 때는 make 메서드의 rounds 옵션을 통해 워크 팩터를 조정할 수 있습니다. 다만, 라라벨에서 관리하는 기본 값으로도 대부분의 애플리케이션에서 충분합니다.

$hashed = Hash::make('password', [
'rounds' => 12,
]);

Argon2 워크 팩터 조정

Argon2 알고리즘을 사용할 때는 make 메서드의 memory, time, threads 옵션을 통해 워크 팩터를 조정할 수 있습니다. 하지만, 라라벨의 기본 값도 대부분의 애플리케이션에서 적합하게 설정되어 있습니다.

$hashed = Hash::make('password', [
'memory' => 1024,
'time' => 2,
'threads' => 2,
]);

[!TIP] 각 옵션에 대한 자세한 설명은 공식 PHP Argon 해싱 문서를 참고하시기 바랍니다.

비밀번호가 해시와 일치하는지 검증하기

Hash 파사드의 check 메서드를 통해 입력된 평문 비밀번호가 저장된 해시와 일치하는지 검증할 수 있습니다.

if (Hash::check('plain-text', $hashedPassword)) {
// The passwords match...
}

비밀번호가 재해싱이 필요한지 확인하기

Hash 파사드의 needsRehash 메서드를 사용하면, 비밀번호가 저장된 후 해싱 알고리즘의 워크 팩터(설정)가 변경되었는지 확인할 수 있습니다. 일부 애플리케이션에서는 인증 과정 중에 이 작업을 수행하기도 합니다.

if (Hash::needsRehash($hashed)) {
$hashed = Hash::make('plain-text');
}