Node.js 기초(8) - 로그인 기능 구현

2 minute read

[로그인 기능 구현하기]

이번에는 로그인 폼을 전달 받았을 때 DB에 해당 email이 존재하는지, 그리고 Password가 동일한지 확인하고 토큰을 발급하는 작업을 해보겠습니다.

Login 기능 구현하기

목차

Login Route 만들기

우선 index.js에 login route를 만듭니다.

app.post('/login', (req, res) => {	
  //1. 요청된 이메일을 데이터베이스에 있는지 찾는다.	
  //2. 요청된 이메일이 데이터베이스에 있다면 비밀번호가 맞는지 확인	
  //3. 비밀번호가 맞다면 토큰을 생성	
  })	
})	

Email과 Password 확인

입력된 이메일이 DB에 존재하는지 먼저 확인합니다.

app.post('/login', (req, res) => {	
  //1. 요청된 이메일을 데이터베이스에 있는지 찾는다.	
  User.findOne({ email: req.body.email }, (err, user) =>{	
    if(!user){	
      return res.json({	
        loginSuccess: false,	
        message: "해당 이메일이 존재하지 않습니다."	
      })	
    }	
    //2. 요청된 이메일이 데이터베이스에 있다면 비밀번호가 맞는지 확인	
      	
    })	
  })	
})	

DB에 존재한다면 Password가 맞는지 확인하는 ‘comparePassword’ 함수를 User.js에서 만듭니다.

userSchema.methods.comparePassword = function(plainPassword, cb){	
    	
    //plainPassword = 12345678 , 암호화된 비밀번호 = this.password	
    bcrypt.compare(plainPassword, this.password, function(err, isMatch) {	
        if(err) return cb(err)	
        cb(null, isMatch)	
    })	
}	

다시 index.js로 와서 수정해줍니다.

app.post('/login', (req, res) => {	
  //1. 요청된 이메일을 데이터베이스에 있는지 찾는다.	
  User.findOne({ email: req.body.email }, (err, user) =>{	
    if(!user){	
      return res.json({	
        loginSuccess: false,	
        message: "해당 이메일이 존재하지 않습니다."	
      })	
    }	
    //2. 요청된 이메일이 데이터베이스에 있다면 비밀번호가 맞는지 확인	
    user.comparePassword(req.body.password, (err, isMatch) =>{	
      if(!isMatch)	
          return res.json({	
            loginSuccess:false,	
            message:"비밀번호가 틀렸습니다."	
          })	
    })	
  //3. 비밀번호가 맞다면 토큰을 생성	
  })	

토큰 생성

마지막으로 DB에 이메일이 존재하고 비밀번호까지 같다면 유저를 위한 토큰을 생성합니다.

1) 라이브러리 설치

npm install jsonwebtoken --save	

2) generateToken 함수 만들기

User.js에 토큰을 생성하는 generateToken 함수를 구현합니다.

const jwt = require('jsonwebtoken');	
userSchema.methods.generateToken = function(cb) {	
    var user = this;	
    // jsonwebtoken을 이용해서 토큰 생성하기	
    var token = jwt.sign(user._id.toHexString(), 'scertToken'); 	
    // mongodb에 저장된 user의 id값은 '_id'로 표현	
    	
    user.token = token;	
    user.save(function(err, user){	
        if(err) return cb(err)	
        cb(null, user)	
    })	
}	

user._id + ‘secretToken’ 으로 token을 생성하게 됨.

token을 해석을 할 때 ‘secretToekn’를 넣으면 user._id를 알 수 있음

toHexString()로 하지 않으면 Error: Expected "payload" to be a plain object라는 에러가 생깁니다.

3) 토큰 저장

발급된 토큰을 로컬스토리지나 쿠키에 저장해야 합니다. 저는 쿠키에 저장하겠습니다.

쿠키에 저장하기 위해서는 cookie-parser를 설치해야합니다.

npm istall cookie-parser --save	

마지막으로 index.js를 수정합니다.

const cookieParser = require('cookie-parser');	
app.use(cookieParser());	
app.post('/login', (req, res) => {	
  //1. 요청된 이메일을 데이터베이스에 있는지 찾는다.	
  User.findOne({ email: req.body.email }, (err, user) =>{	
    if(!user){	
      return res.json({	
        loginSuccess: false,	
        message: "해당 이메일이 존재하지 않습니다."	
      })	
    }	
    //2. 요청된 이메일이 데이터베이스에 있다면 비밀번호가 맞는지 확인	
    user.comparePassword(req.body.password, (err, isMatch) =>{	
      if(!isMatch)	
        return res.json({	
          loginSuccess:false,	
          message:"비밀번호가 틀렸습니다."	
        })	
    })	
  //3. 비밀번호가 맞다면 토큰을 생성	
  user.generateToken((err,user) => {	
    if(err) return res.status(400).send(err);	
    // 토큰을 저장한다. 어디에? 쿠키, 로컬스토리지	
    res.cookie("x_auth", user.token)	
    .status(200)	
    .json({loginSuccess: true, userId: user_id})	
  })	
})	

결과

포스트맨

Categories:

Updated:

Comments