관리자 글쓰기
[Node.js] bcrypt로 패스워드 암호화하기
2021. 10. 26. 22:24 - 프론트맨

유저가 계정을 생성할 때 비밀번호를 그대로 데이터베이스에 저장하면

사이트가 해킹당했을 때 유저의 정보까지 넘어가는 최악의 상황이 생길 것이다.

Hash를 사용하면 비밀번호를 암호화해서 유저의 데이터를 안전하게 보관할 수 있다.

 

 

Hash란?

Hash는 수학으로 만들어진 암호화 알고리즘이다.

만약 A라는 인풋을 Hash에 넣으면 항상 B라는 같은 아웃풋이 나온다.

그리고 Hash는 일방적이므로 B에서 거꾸로 A를 유추하는 것이 불가능하다.

 

해쉬 함수는 인풋이 비슷해도 아웃풋은 완전히 다르다.

예를 들어 HelloHello! 는 완전히 다른 결과를 나타낸다.

 

Hello

185f8db32271fe25f561a6fc938b2e264306ec304eda518007d1764826381969

 

Hello! →

334d016f755cd6dc58c53a86e183882f8ec14f52fb05345887c8a5edd42c87b7

 

 

사용방법

1. 유저가 계정을 생성하는 즉시 비밀번호를 암호화해서 데이터베이스에 저장한다.

 

2. 유저가 로그인할 때, 입력받은 비밀번호를 같은 방법으로 암호화한 다음 데이터베이스와 비교한다.

 

서버는 유저의 비밀번호가 뭔지 모른다. 

같은 인풋이면 항상 같은 아웃풋이 나오는 해쉬 함수의 원리를 이용해서

암호화된 비밀번호끼리 비교할 수 있다.

 

 

 

 

먼저 비밀번호를 암호화하는 방법이다.

Node.js에서는 bcrypt 라이브러리로 해쉬 함수를 쉽게 사용할 수 있다.

유저가 입력한 정보를 데이터베이스에 저장하기 직전에 

Mongoose의 미들웨어 함수를 사용해서 비밀번호를 암호화한다.

Mongoose와 MongoDB에 대해서 궁금하다면 아래의 글을 참조하기 바란다.

 

MongoDB 데이터 생성, 삭제하는 방법

웹 서버를 운영하려면 데이터베이스가 필요하다. 물론 단순한 웹페이지 같은 경우는 예외겠지만 로그인 같은 기본적인 기능만 넣으려 해도 필수적으로 있어야 하는 것이 데이터베이스다. MongoDB

squidcoding.tistory.com

 

 

 

유저의 계정을 생성하는 모델이다.

bcrypt.hash 메서드에는 두 개의 매개변수가 들어가는데 

첫째는 변환할 문자열

두 번째는 Salting 할 횟수이다.

 

Salting은 말 그대로 소금 친다는 의미인데,

문자열을 해쉬 함수에 넣기 전에 임의의 문자열을 덧붙여서

보안을 강화하는 방법이다.

 

터미널에서 암호화된 비밀번호가 데이터베이스에 저장된 것을 확인할 수 있다.

 

 

이제 입력받은 비밀번호를 데이터베이스의 비밀번호와 비교해야 한다.

 

const userId = "abc";
const userPW = "1234";

const checkPW = async () => {
  const user = await Account.findOne({ id: userId }); // 데이터베이스에서 Account 모델 찾기
  const checkPW = await bcrypt.compare(userPW, user.password); 
  console.log(checkPW);
};
checkPW();

 

먼저 입력받은 id로 Account 모델을 찾아서 user 변수에 저장한다.

그리고 bcrypt.compare 메서드에 매개변수로 (입력받은 PW, DB에 있는 PW) 를 넣으면 된다.

 

코드를 실행해보면 true가 출력된다.

만약 틀린 비밀번호를 입력하면 false가 출력된다.