해시란
해시(Hashing)란 비밀번호 같은 평문 데이터를 단방향 변환으로 고정 길이의 문자열로 변환하는 처리입니다. 같은 입력에서는 항상 같은 해시가 생성되지만, 해시에서 원래 평문을 복원할 수는 없습니다. Laravel의Hash 파사드는 안전한 비밀번호 저장을 위해 bcrypt와 Argon2 해시 알고리즘을 지원합니다.
알고리즘 비교
bcrypt의 “워크 팩터”는 해시 생성에 걸리는 시간을 제어합니다. 해시가 느릴수록 브루트포스 공격에 대한 내성이 높아집니다. 하드웨어가 빨라짐에 따라 워크 팩터를 올리면 보안을 유지할 수 있습니다.
해시화와 검증의 플로우
설정
기본적으로 Laravel은bcrypt 드라이버를 사용합니다. HASH_DRIVER 환경 변수로 변경할 수 있습니다.
config:publish로 설정 파일을 게시합니다.
config/hashing.php에서 기본 워크 팩터 등을 변경할 수 있습니다.
기본 사용법
비밀번호 해시화하기
Hash::make()에 비밀번호의 평문을 전달하면 해시 값이 반환됩니다. 이 해시 값을 데이터베이스에 저장합니다.
bcrypt의 워크 팩터 조정
rounds 옵션으로 해시 생성의 계산 비용을 조정할 수 있습니다. 값이 클수록 안전하지만 처리 시간도 늘어납니다.
기본값(12)은 대부분의 애플리케이션에서 적절합니다.
Argon2의 워크 팩터 조정
Argon2를 사용하는 경우,memory·time·threads 옵션으로 계산 비용을 조정할 수 있습니다.
비밀번호 검증
Hash::check()를 사용하면 평문 비밀번호가 저장된 해시와 일치하는지 확인할 수 있습니다.
로그인 처리에서 사용하는 전형적인 예입니다.
Auth::attempt()를 사용하는 경우에는 이 처리가 자동으로 이루어지므로 직접 호출할 필요는 없습니다.
Hash::check()가 유용한 경우는 현재 비밀번호 확인을 수동으로 수행할 때입니다.
재해시 판정
Hash::needsRehash()를 사용하면, 해시 생성 시의 워크 팩터가 현재 설정과 다른지 확인할 수 있습니다.
워크 팩터를 변경했을 때, 기존 해시를 새 설정으로 갱신하기 위해 사용합니다.
해시 알고리즘 검증
기본적으로Hash::check()는 해시가 현재 설정된 알고리즘으로 생성된 것인지를 검증합니다.
알고리즘이 다른 경우에는 RuntimeException이 던져집니다.
이를 통해 해시 알고리즘 변조에 의한 공격을 방지할 수 있습니다.
알고리즘을 이전하는 중 등, 여러 알고리즘을 동시에 지원해야 하는 경우에는 HASH_VERIFY를 false로 설정해 이 검증을 무효화할 수 있습니다.
정리
다음 단계
인증 입문
Hash::check()를 사용한 로그인 처리 구현 등 인증의 전체 그림을 배웁니다.