ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • #10 Bcrypt로 비밀번호 암호화 하기
    Node.js/[챕터1] 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
Designed by Tistory.