반응형
boilerplate 유튜브 강의 시리즈
Blog ReactJS NodeJS#12 HASH PASSWORD with BCRYPT
패스워드같은 보안 정보가 DB에 그대로 저장되면 안되기 때문에
암호화 기법 중 하나인 해싱 알고리즘 bcrypt를 적용하여 저장한다.
1. bcrypt 모듈 및 type definition 패키지 설치
npm i -S bcrypt
npm i -D @types/bcrypt
2. user.ts 수정
mongoose 스키마의 pre 함수는 어떤 작업을 하기 직전에 실행되는 함수이다.
여기서는 user정보를 저장하기 전에 호출한다.
password를 저장할 때만 bcrypt를 적용할 것이기 때문에 user.isModified('password') 의 조건일 경우에만 해시를 적용한다.
import { Schema, Model, model, Document, HookNextFunction } from 'mongoose';
import bcrypt from 'bcrypt';
const saltRounds = 10;
const UserSchema: Schema = new Schema({
name: {
type:String,
maxlength:50
},
email: {
type:String,
trim:true,
unique: 1
},
password: {
type:String,
minlength: 5
},
lastname: {
type:String,
maxlength: 50
},
role: {
type:Number,
default: 0
},
token: {
type:String,
},
tokenExp: {
type: Number
}
});
export interface IUser extends Document{
name: string;
email: string;
password: string;
lastname: string;
role: number;
token: string;
tokenExp: number;
}
UserSchema.pre<IUser>('save', function(next){
if(this.isModified('password')){
bcrypt.genSalt(saltRounds, (err:Error, salt:string)=>{
if(err) return next(err);
bcrypt.hash(this.password, salt, (err:Error, hash:string)=>{
if(err) return next(err);
this.password = hash;
next();
})
})
}else{
next();
}
});
export const User: Model<IUser> = model<IUser>('User', UserSchema);
3. 서버 시작
npm start
4. postman 테스트
몽고DB에 아래와 같이 bcrypt 가 적용된 패스워드가 저장된 것을 확인할 수 있다.
반응형
'IT > 프로젝트' 카테고리의 다른 글
9. boilerplate - 미들웨어에 authorization 추가하기 (0) | 2020.10.30 |
---|---|
8. boilerplate - 로그인 구현 with jsonwebtoken (0) | 2020.10.23 |
6. boilerplate - 보안 파일 with ENV file (0) | 2020.10.21 |
5. boilerplate - tsc-watch 설치 (0) | 2020.10.21 |
4. boilerplate - postman을 이용한 http 요청/응답 테스트 (4) | 2020.10.21 |