jongviet

Aug 9, 2021 - nodejs 로그인 기능(bcrypt, saltRounds, cookie-parser, jsonWebToken) 본문

node, express, nestjs

Aug 9, 2021 - nodejs 로그인 기능(bcrypt, saltRounds, cookie-parser, jsonWebToken)

jongviet 2021. 8. 9. 23:16

*8월9일

 

 

*Bcrypt로 비밀번호 암호화 하기

-암호화 처리 후 DB 저장

 

npm install bcrypt --save

saltRounds //salt의 글자 수

myPlaintextPassword //암호화 전 비밀번호

 

//save 전 실행할 function;

userSchema.pre('save', function(next) {

    var user = this;  //user.js 가져옴

 

    //비밀번호 암호화

    if(user.isModified('password')) {

        bcrypt.genSalt(saltRounds, function(err, salt) {

            if(err) return next(err)

            //password가 변경되는 상황에서만 암호화 처리

            bcrypt.hash(user.password, salt, function(err, hash) {

                if(err) return next(err)

                user.password = hash   //plain pw를 hash pw로 변경

                next()

            });

        });

    }  else {   //비밀번호가 아니라 다른 것을 바꾸면 next처리

        next()

    }

})

 

쿠키 의존성 처리

npm install cookie-parser --save

const cookieParser = require('cookie-parser');

app.use(cookieParser());

 

라우터 처리

app.post('/login', (req, res) => {

 

  //요청 이메일을 DB에서 찾기

  User.findOne({email: req.body.email}, (err, user) => {

    if(!user) {

      return res.json({

        loginSuccess: false,

        message: "제공된 이메일에 해당하는 유저가 없습니다."

      })

    }

    //이메일과 비밀번호 일치 여부 확인

    user.comparePassword(req.body.password, (err, isMatch) => {

      if(!isMatch)

        return res.json({ loginSuccess:false, message:"비밀번호가 틀렸습니다."})

      

      //비번이 같다면 Token 생성

      user.generateToken((err, user) => {

        if(err) return res.status(400).send(err);

        

        //토큰 저장 : cookie

        res.cookie("x_auth", user.token)

        .status(200)

        .json({ loginSuccess:true, userId:user._id})

      })

    })

  })

})

 

userSchema.methods.comparePassword = function(plainPassword, cb) {

 

    bcrypt.compare(plainPassword, this.password, function(err, isMatch) {

        if(err) return cb(err)

        cb(null, isMatch)

    })

}

 

userSchema.methods.generateToken = function(cb) {

    var user = this;

 

    //jsonwebtoken(jwt)을 이용해서 token 생성

    var token = jwt.sign(user._id.toHexString(), 'secretToken')

 

    user.token = token

    user.save(function(err, user) {

        if(err) return cb(err)

        cb(null, user)

    })

}

 

Comments