Node.js/[챕터1]

#10 Bcrypt로 비밀번호 암호화 하기

Dev갱이 2021. 6. 7. 22:41
728x90

[1]Bcrypt 라이브러리 다운

npm install bcrypt --save

[2] 비밀번호 암호화 부분

//index.js
app.post('/register', (req, res) => {

    const user = new User(req.body)
    //userSchema.pre('save', function() { User 모델에 있는 이게 실행됨 여기부분!!
    user.save((err, userInfo) =>{
      if(err) return res.json({ success: false, err})
      return res.status(200).json({
        success:true
      })
    })

})

[3] 모델에서 로직추가

models/User.js

const bcrypt = require('bcrypt');
const saltRounds = 10; //10자리의 salt

userSchema.pre('save', ( next )=> {
    let user = this;

    if(user.isModified('password')){ //비밀번호 수정일 때만!!
        //비밀번호를 암호화 시킨다.
        bcrypt.genSalt(saltRounds, (err, salt) => {
            if(err) return next(err);

            bcrypt.hash(user.password, salt, (err, hash) => {
                if(err) return next(err);
                user.password = hash;
                next();
            })
        })
    }

})

10자리를 가지는 saltRounds로 비밀번호를 암호화 시킨다 라는 뜻

 

ps) 오류발생

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);
                user.password = hash;
                next();
            })
        })
    }
})

화살표 함수가 아닌 일반 함수로 해야 된다 ㅠㅠ 왜그럴까?

 

[해결]

userSchema.pre('save', function( next ) {
    let user = this;

    if(user.isModified('password')){ //비밀번호 수정일 때만!!
        //비밀번호를 암호화 시킨다.
        bcrypt.genSalt(saltRounds, (err, salt) => {
            if(err) return next(err);

            bcrypt.hash(user.password, salt, (err, hash)  => {
                if(err) return next(err);
                user.password = hash;
                next();
            })
        })
    } else { //비밀번호 변경이 아닐경우!!
    	next();
    }
})

1. this

  • 일반 함수와 화살표 함수의 가장 큰 차이점은 this 입니다.
  • 화살표 함수와 일반 함수는 this가 다른 곳을 가리킵니다.
  • 화살표 함수의 this는 바로 상위 스코프의 this와 같습니다.
  • 일반 함수는 this가 동적으로 바인딩 됩니다. 일반 함수의 this는 내부 함수, 콜백 함수: 전역 객체, 객체의 메소드, 생성자 함수 입니다.

userSchema.pre('save', 함수와 화살표 함수에서

let user = this; 

여기서 this가 가르키는게 다르기 떄문에 안됨!!! req 값이 없음!!!

728x90