![[Node] 회원 가입, 비밀번호 암호화 [Node] 회원 가입, 비밀번호 암호화](http://t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png)
MongoDB 연동 및 회원 가입 기능 구현
https://tlseoqja.tistory.com/49
[Node] node.js 서버와 MongoDB 연동하기 (mongoose)
Mongoose란? Mongoose 라이브러리는 MongoDB란 NoSQL DB를 Node.js에서 사용할 수 있게 도와주는 라이브러리이다. 데이터를 만들고 관리하기 위해 스키마(Schema)를 만들고, 그 스키마로 모델(Model)을 만들어...
tlseoqja.tistory.com
BCrypt
1999년에 publish된 password-hasing function이다.
키(key) 방식의 대칭형 블록 암호(Blowfish 암호)에 기반을 둔 암호화 해시 함수이다.
OpenBSD에서 이 암호화 방식을 사용하고 있다.
.NET, JAVA 를 포함한 여러 플랫폼, 언어에서 사용할 수 있다.
반복 횟수를 늘려 연산속도를 늦출 수 있으므로 연산 능력이 증가하더라도 brute-forece 공격에 대비할 수 있다.
레인보우 테이블 공격에 대비하기 위해 솔팅(Salting)과 키(Key) 스트레칭을 적용한 대표적인 단방향 암호화 방식이다.
솔팅(Salting)
솔팅은 단방향 해시 함수 암호화를 진행할 때 본래 데이터에 추가적으로 랜덤한 데이터를 더하는 방식이다.
원래 데이터에 추가 데이터가 포함되었기 때문에 이전의 해시값과 달라진다.
키(Key) 스트레칭
단방향 해시값을 계산한 후 그 해시값을 해시하고 또 이를 반복하는 방식이다.
최근에는 일반적인 장비로 1초에 50억개 이상의 해시값을 비교할 수 있다.
하지만 키 스트레칭을 적용 동일한 장비에서 1초에 5번 정도만 비교할 수 있게 된다.
GPU를 사용하더라도 수백에서 수천번 정도만 비교할 수 있다.
회원 가입 시 비밀번호 암호화
bcrypt 라이브러리 설치
npm install bcrypt
비밀번호 암호화 함수 작성
비밀번호 암호화는 회원 가입 정보를 DB에 insert하기 전에 진행한다.
mongoose 라이브러리로 생성한 Schema의 pre() 함수를 사용하면
Model의 함수를 실행하기 전에 pre("모델함수", 동작함수)안에 작성된 함수를 먼저 동작한 후 함수를 실행하게 된다.
// User.js
...
userSchema.pre("save", function(next) {
console.log("Model의 save 함수보다 먼저 실행");
next();
});
// index.js
...
user.save()
User.js
User.js 파일 중간에 비밀번호 암호화 코드를 삽입해준다.
전체 코드는 다음과 같다.
import mongoose from "mongoose";
import bcrypt from "bcrypt";
const userSchema = mongoose.Schema({
email: {
type: String,
trim: true,
unique: true,
},
password: {
type: String,
max: 50,
},
name: {
type: String,
max: 50,
},
role: {
type: Number,
default: 0,
},
token: {
type: String,
},
tokenExp: {
type: Number,
},
});
// (추가) 비밀번호 암호화
// 회원 가입 정보를 DB에 등록하기 전 암호화를 진행한다.
userSchema.pre("save", function(next) {
// 1
const user = this;
// 비밀번호를 암호화한다.
bcrypt.genSalt(saltRounds, function(err, salt) {
if( err ) return next(err);
if( user.isModified("password")) {
bcrypt.hash(user.password, salt, function(err, hash) {
if( err ) return next(err);
user.password = hash;
next();
});
} else {
next();
}
});
});
const User = mongoose.model("User", userSchema);
export default User;
테스트
기존과 동일하게 포스트맨으로 회원 가입을 진행해본다.
※ success: false가 뜨는 경우, 기존 가입한 이메일과 동일한 이메일로 가입했는지 확인하자.
![[Node] 회원 가입, 비밀번호 암호화 - 테스트 [Node] 회원 가입, 비밀번호 암호화 - 테스트](https://blog.kakaocdn.net/dn/deTcmr/btsAYEnWMzl/doIaWZ1HGabevej1wFrffK/img.png)
비밀번호가 암호화된 상태로 DB에 등록되었다.
![[Node] 회원 가입, 비밀번호 암호화 - 테스트 [Node] 회원 가입, 비밀번호 암호화 - 테스트](https://blog.kakaocdn.net/dn/daBbiS/btsA3TxPtjd/aAo5jFG4Z0MFdg900JkT30/img.png)
'🖥️Frontend > Node' 카테고리의 다른 글
[Node] 페이지 접속 시 JWT 토큰 인증 (0) | 2023.11.30 |
---|---|
[Node] 회원 로그인, 비밀번호 복호화 및 JWT 토큰 생성 (0) | 2023.11.29 |
[Node] nodemon 설치 (자동 코드 반영) (1) | 2023.11.28 |
[Node] node.js 서버와 MongoDB 연동하기 (mongoose) (2) | 2023.11.23 |
[Node] node.js & express로 간단한 서버 구현 (1) | 2023.11.23 |
댓글