본문으로 건너뛰기

비밀번호 검증 오류 해결기

· 약 3분

🔐 비밀번호 검증 오류 해결기​

로그인 api를 구현한 후 테스트만을 위해 비밀번호를 임의로 11111111로 db에 저장하고 테스트해보았는데, 비밀번호를 제대로 입력했음에도 자꾸 틀린 비밀번호라는 오류가 발생했습니다. bcrypt를 사용함으로써 발생한 문제였는데, 이 문제 해결에 대해 정리해보았습니다.


1. 문제 상황​

로그인 시도 중 Invalid password라는 오류가 발생했습니다. 데이터베이스에 저장된 비밀번호가 명백하게 11111111인 것을 확인했음에도 불구하고 오류가 발생했죠. 로그인 로직은 아래와 같았습니다.

const isPasswordValid = await bcrypt.compare(password, user.password);

2. 원인 분석​

비밀번호 검증에는 bcrypt.compare 메서드를 사용했는데, 이는 해시된 비밀번호와 평문 비밀번호를 비교하는 방식입니다. 문제는 데이터베이스에 비밀번호가 평문으로 저장되어 있었기 때문에, bcrypt는 이 값을 해시로 인식하지 못하고 오류를 일으킨 것이었습니다.

3. 해결 방법​

로그인에 사용될 모든 비밀번호는 데이터베이스에 저장하기 전에 반드시 해싱해야 합니다.

1) 테스트용 비밀번호를 수동으로 해싱​

테스트용 비밀번호 11111111을 다음과 같이 bcrypt로 해싱했습니다.

const bcrypt = require('bcrypt');
(async () => {
const hashedPassword = await bcrypt.hash('11111111', 10);
console.log(hashedPassword); // 이 해시된 값을 DB에 직접 저장
})();

2) 회원가입 로직에서 비밀번호 해싱 추가​

회원가입 기능이 있다면, 비밀번호를 데이터베이스에 저장하기 전에 아래와 같이 해싱을 추가해주어야 합니다.

const hashedPassword = await bcrypt.hash(password, 10);
// 이후 hashedPassword를 DB에 저장

4. 결론​

비밀번호를 검증할 때에는 평문 비밀번호가 아닌 해시된 비밀번호를 사용해야 합니다. 만약 해싱을 잊으면, bcrypt는 Invalid password 오류를 반환합니다.