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

해싱 (Hashing)

소개

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

Bcrypt는 비밀번호 해싱을 위한 훌륭한 선택지입니다. 그 이유는 "작업 인자(work factor)"를 조정할 수 있어서 하드웨어 성능이 향상될수록 해시 생성에 필요한 시간을 늘릴 수 있기 때문입니다. 비밀번호를 해싱할 때는 느릴수록 더 안전합니다. 알고리즘이 비밀번호 해시에 더 많은 시간을 소요할수록, 악의적인 사용자가 일명 "레인보우 테이블"이라고 불리는 모든 가능한 문자열 해시 값을 생성해서 애플리케이션을 무차별 대입 공격(brute force attack)하는 시간이 길어집니다.

설정

애플리케이션에서 기본적으로 사용할 해싱 드라이버는 config/hashing.php 설정 파일에서 지정할 수 있습니다. 현재 여러 종류의 드라이버를 지원하며, BcryptArgon2 (Argon2i와 Argon2id 변종)를 사용할 수 있습니다.

기본 사용법

비밀번호 해싱

비밀번호를 해싱하려면 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 작업 인자(work factor) 조정

Bcrypt 알고리즘을 사용하는 경우, make 메서드에서 rounds 옵션을 사용해 알고리즘의 작업 인자(work factor)를 조정할 수 있습니다. 하지만 대부분의 애플리케이션에는 라라벨이 기본적으로 제공하는 값이면 충분합니다.

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

Argon2 작업 인자(work factor) 조정

Argon2 알고리즘을 사용하는 경우, make 메서드에서 memory, time, threads 옵션을 설정해 작업 인자를 조정할 수 있습니다. 대부분의 애플리케이션에서는 라라벨이 제공하는 기본 값이면 충분합니다.

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

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

비밀번호와 해시 값의 일치 여부 확인

Hash 파사드에서 제공하는 check 메서드를 사용하면, 주어진 평문 문자열이 저장된 해시 값과 일치하는지 확인할 수 있습니다.

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

비밀번호 재해싱 필요 여부 판단

Hash 파사드의 needsRehash 메서드를 사용하면, 비밀번호가 해싱될 당시 사용된 작업 인자가 이후 변경되었는지, 즉 비밀번호를 다시 해싱해야 할 필요가 있는지 확인할 수 있습니다. 일부 애플리케이션에서는 인증 과정에서 이 검사를 수행하기도 합니다.

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