Seongwon Lim

[node.js] Typescript에서 Bcrypt를 이용한 비밀번호 암호화 본문

Node.js

[node.js] Typescript에서 Bcrypt를 이용한 비밀번호 암호화

limsw 2022. 5. 8. 16:10
반응형

서론

이번 글에서는 타입스크립트 환경에서 비밀번호 암호화를 하는 방법을 다뤄보고자 한다.
그리고 로그인을 할 때 사용자가 입력한 비밀번호와 DB에 저장된 암호화된 비밀번호가 일치하는지 알아보는 방법을 다룬다.

 

  • 자바스크립트 기반으로 Bcrypt를 다루는 법은 여기를 참고하면 좋을 것 같다.

모듈 설치하기

  • npm install @types/bcrypt --save

자바스크립트와 다르게 타입스크립트는 @types/bcrypt를 설치해주어야 한다.

사용 방법

설치한 모듈을 사용하려면 import bcrypt from "bcrypt"; 를 상단에 선언한다.

 

이제 회원가입의 경우를 예시로 들어 사용법을 살펴보기로 한다. 입력받은 비밀번호를 암호화 할 때에는 genSalt(), hash() 메서드를 이용한다. 예를 들어 입력받은 비밀번호가 1q2w3e4r 인 경우에는

const saltRound = 10; // 사용자 요구사항에 맞게 값 정의 가능

const salt = await bcrypt.genSalt(saltRound); // salt 생성
const hashedPW = await bcrypt.hash("1q2w3e4r", salt); // 암호화된 비밀번호 생성

// 실제로는 아래 코드처럼 사용자가 입력한 값을 이용해서 암호화 비밀번호를 생성
// const hashedPW = await bcrypt.hash(req.body.password, salt);

이와 같이 코드를 작성할 수 있다. 실제로 console.log(hashedPW)를 해보면

2b$10qXFmxZ4fXsk7Pv4sBz9Ri.dsIy611UxOGcj6xYUu5UTBAGghxEsJi

 

이런 형태의 암호화된 문자열을 결과로 받을 수 있다.

 

이렇게 암호화된 비밀번호를 데이터베이스에 저장해야 관리자 또한 유저의 비밀번호가 무엇인지 알 수 없게 된다. 암호화 기술을 사용하지 않는 경우 보안에 매우 취약할 수 있기 때문에 사용자 정보를 데이터베이스에 저장하는 경우에는 반드시 암호화 기술을 사용해야 한다.

비밀번호 비교를 통해 로그인 하는 법

로그인을 할 때에는 사용자가 입력한 원래 비밀번호와 데이터베이스에 저장되어 있는 암호화된 비밀번호를 비교해야 한다.

필자는 로그인 시 필요한 정보를 email, password로 가정한 뒤 비밀번호 비교 로직을 작성해보았다.

const {email, password} = req.body; // req.body로 받은 변수

// 먼저 데이터베이스에서 입력받은 이메일이 존재하는지 확인하여 있다면 데이터를 가져옴
const user = await User.find({
  email: email
});

// 가져온 데이터의 암호화된 비밀번호와 사용자가 입력한 비밀번호를 비교한다.
const check = await bcrypt.compare(password, user[0].password);

if(check) {
  // 입력한 비밀번호가 일치하는 경우 로직
  console.log("유효한 회원");
}
else {
  // 입력한 비밀번호가 일치하지 않는 경우 로직
  console.log("유효하지 않은 회원");
}

로직을 구성한다면 위와 같이 bcrypt에서 제공하는 compare() 메소드를 이용하여 구성할 수 있다.

우선 필자는 User라는 테이블에 입력으로 받은 이메일을 가진 유저가 존재하는지 확인 후, 해당 유저의 정보를 user변수에 담았다. console.log(user) 결과는 다음과 같다.

[
  User {
    id: 1,
    email: 'test@naver.com',
    password: '$2b$10$qXFmxZ4fXsk7Pv4sBz9Ri.dsIy611UxOGcj6xYUu5UTBAGghxEsJi',
  }
]

위와 같은 결과를 얻을 수 있었다.

 

그래서 user[0].password로 데이터베이스에 저장된 암호화된 비밀번호를 이용하기로 했다. 그 다음으로 compare() 메소드를 이용해서 입력으로 받은 비밀번호, 암호화된 비밀번호를 비교했다. 만약 두 개의 비밀번호가 일치한다면 check 변수는 true를 반환한다.


출처

Comments