일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- node.js
- mongoose
- MongoDB
- Crawling
- typeorm
- Kotlin
- Express
- mysql
- OS
- Util
- docker
- macos
- OOAD
- HTML
- algorithm
- postman
- ubuntu
- wireshark
- TypeScript
- python
- React
- AWS
- css
- linux
- S3
- sequelize
- DATABASE
- Scheduling
- Android
- Network
- Today
- Total
Seongwon Lim
[node.js] Typescript에서 Bcrypt를 이용한 비밀번호 암호화 본문
서론
이번 글에서는 타입스크립트 환경에서 비밀번호 암호화를 하는 방법을 다뤄보고자 한다.
그리고 로그인을 할 때 사용자가 입력한 비밀번호와 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를 반환한다.
출처
'Node.js' 카테고리의 다른 글
[node.js] Koa framework 개념 정리 및 사용하기 (0) | 2022.05.09 |
---|---|
[node.js] Typescript를 이용하여 Express 환경 구성하기 (0) | 2022.05.08 |
[node.js] 타입스크립트 파일을 컴파일 후 자바스크립트로 실행하기 (0) | 2022.05.08 |
[node.js] Typescript 기반 라우터 적용하는 법 (0) | 2022.05.08 |
[node.js] TypeORM CRUD 예시를 통해 이해하기 (0) | 2022.05.07 |