로그인 api를 구현한 후 테스트만을 위해 비밀번호를 임의로 11111111
로 db에 저장하고 테스트해보았는데, 비밀번호를 제대로 입력했음에도 자꾸 틀린 비밀번호라는 오류가 발생했습니다.
bcrypt
를 사용함으로써 발생한 문제였는데, 이 문제 해결에 대해 정리해보았습니다.
로그인 시도 중 Invalid password
라는 오류가 발생했습니다. 데이터베이스에 저장된 비밀번호가 명백하게 11111111
인 것을 확인했음에도 불구하고 오류가 발생했죠. 로그인 로직은 아래와 같았습니다.
const isPasswordValid = await bcrypt.compare(password, user.password);
비밀번호 검증에는 bcrypt.compare
메서드를 사용했는데, 이는 해시된 비밀번호와 평문 비밀번호를 비교하는 방식입니다. 문제는 데이터베이스에 비밀번호가 평문으로 저장되어 있었기 때문에, bcrypt
는 이 값을 해시로 인식하지 못하고 오류를 일으킨 것이었습니다.
로그인에 사용될 모든 비밀번호는 데이터베이스에 저장하기 전에 반드시 해싱해야 합니다.
테스트용 비밀번호 11111111
을 다음과 같이 bcrypt
로 해싱했습니다.
const bcrypt = require('bcrypt');
(async () => {
const hashedPassword = await bcrypt.hash('11111111', 10);
console.log(hashedPassword); // 이 해시된 값을 DB에 직접 저장
})();
회원가입 기능이 있다면, 비밀번호를 데이터베이스에 저장하기 전에 아래와 같이 해싱을 추가해주어야 합니다.
const hashedPassword = await bcrypt.hash(password, 10);
// 이후 hashedPassword를 DB에 저장
비밀번호를 검증할 때에는 평문 비밀번호가 아닌 해시된 비밀번호를 사용해야 합니다. 만약 해싱을 잊으면, bcrypt
는 Invalid password
오류를 반환합니다.