JWT(Jsonwebtoken)는 사용자 정보를 JSON에 담아 암호화하고 해싱작업을 하여 토큰을 생성하는 기술이다.

JWT를 이용하여 node js 에서 로그인 기능을 구현할 수 있다.

 

아래 사이트에서 토큰생성 방법을 확인할 수 있다.

https://www.npmjs.com/package/jsonwebtoken

 

 

JWT 설치
npm install jsonwebtoken --save

jwt를 사용하기 위해 라이브러리를 다운받아야 한다.

 

 

JWT 사용해보기
// index.js


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

  //요청된 이메일을 DB에서 확인
  User.findOne({ email: req.body.email }, (err, user) => {
    if (!user) {
      return res.json({
        loginSuccess: false,
        message: "이메일에 해당하는 유저가 없습니다."
      })
    }

    //요청된 이메일이 DB에 있다면 비번확인
    user.comparePassword(req.body.password, (err, isMatch) => {
      if (!isMatch)
        return res.json({ loginSuccess: false, message: "비밀번호가 틀립니다." })

      //비밀번호가 맞다면 토큰 생성
      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 })
      })
    })

  })
})

 

먼저 index.js 내용이다. 로그인 요청이 들어오면 이메일과 비밀번호를 확인하고

비밀번호가 맞다면 토큰을 생성하여 x_auth 이름으로 쿠키에 저장하게 된다.

 

 

// User.js

const bcrypt = require('bcrypt')
const jwt = require('jsonwebtoken');

userSchema.methods.comparePassword = function(plainPassowrd, cb) {
    bcrypt.compare(plainPassowrd, this.password, function (err, isMatch) {
        if (err) return cb(err)
        cb(null, isMatch)
    })
}

userSchema.methods.generateToken = function(cb) {
    var user = this;

    //jsonwebtoekn을 이용하여 토큰생성 => user._id + 'secretToken' = 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)
    })
}

User.js 에서는 비밀번호 확인 및 토큰생성을 하는 function 이 구현되어 있다.

 

comparePassword에서는 bcrypt.compare() 를 이용하여 비밀번호를 비교하게 되며

비밀번호가 맞다면 true를 리턴하게 된다.

 

generateToken에서는 jsonwebtoken을 이용하여 토큰이 생성된다.

jwt.sign()의 첫번째 인자에는 user정보가 들어간 object가 들어가며

두번째 인자에는 문자열로 되어있는 비밀키가 들어가게 된다.

Base64 문자열형식으로 토큰이 생성되게 된다.

 

 

 

 

 

github

+ Recent posts