공부하는 히욤이

따라하며 배우는 노드, 리액트 시리즈 - 기본 강의 #10 Bcrypt로 비밀번호 암호화 하기 본문

Programming/React+Node

따라하며 배우는 노드, 리액트 시리즈 - 기본 강의 #10 Bcrypt로 비밀번호 암호화 하기

히욤이 2021. 8. 13. 03:27

Bcrypt 라이브러리

  • 데이터베이스에 저장된 비밀번호는 비밀번호가 그대로 드러나기 때문에 안전하지 않음
  • 그래서 비밀번호 같은 경우는 암호화하고 저장하기 위해 Bcrypt 라이브러리를 다운
C:\practices\react-node\boiler-plate> npm install bcrypt

 

Bcrypt로 비밀번호를 암호화

const mongoose = require('mongoose');
const bcrypt = require('bcrypt');
const saltRounds = 10; //10자리인 salt를 만든다
// salt를 이용해서 비밀번호를 암호화

// Schema 생성
const userSchema = mongoose.Schema({
    name : {
        type : String,
        maxlength : 50
    }, 
    email : {
        type : String,
        trim : true, //빈칸을 없애주는 역할
        unique : 1
    },
    password : {
        type : String,
        minlength :5
    },
    role : {
        type : Number,
        default : 0
    },
    image : String,
    token : {
        type : String
    },
    tokenExp : {
        type : Number
    }
})

// index에서 save하기 전에 실행하는 함수
userSchema.pre('save', function( next ){
    var user = this;
    if(user.isModified('password')) {
        // 비밀번호 암호화
        bcrypt.genSalt(saltRounds, function(err, salt){
            if(err) {
                return next(err);
            };
            
            bcrypt.hash(user.password, salt, function (err, hash){
                if(err) {
                    return next(err);
                } else {
                    user.password = hash;
                }
                // 일이 다 끝나면 next 함수로 index의 save로 보내버림
                next();
            });
        });
    }
});

const User = mongoose.model('User',userSchema); //schema를 model로 감싸줌

module.exports = { User }; //다른 곳에서도 쓸 수 있게 exports 해줌

비밀번호는 데이터베이스에 넣기 전에 암호화 되어야 하기 때문에 userSchema.pre('save') 함수를 사용한다.

이 함수는 express에서 제공하는 함수인데 userSchema의 save가 되기 전에 실행된다.

 

비밀번호가 바뀔때만 암호화가 되어야 하기때문에 user의 password가 수정되면 이라는 조건을 줘야한다.

 

 

postman으로 데이터를 넣어보고 database에 비밀번호가 암호화되어 들어갔는지 확인한다.

 

 

mongodb에 들어가서 Browse Collections를 클릭한다.

 

 

Collections에 quer를 확인한다.

password를 apeach123으로 줬지만 데이터베이스에는 암호화되어 다른 값이 저장된 것을 확인할 수 있다.