7. boilerplate - 해시 패스워드 with BCRYPT
IT/프로젝트

7. boilerplate - 해시 패스워드 with BCRYPT

반응형

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 가 적용된 패스워드가 저장된 것을 확인할 수 있다.

반응형