본문 바로가기
개발/node.js

[node.js] 작업전에 JWT토큰 검증하기!!

by 상용최 2020. 5. 30.
반응형

JWT란 ?

  • Json 포맷을 이용하여 속성을 저장하는 Claim 기반의 Web Token
  • 토큰 자체를 정보로 사용하는 Self-Contained방식

 

JWT를 알아보는 게시물이 아니므로 정의정도만 알아보도록 하겠습니다.

JWT가 무엇인지 어떤용도로 사용되는지 궁금하신분은 google에 검색하면 많이 나옵니다.

 

 

작성할 로직

  • 로그인에 성공하면 JWT토큰을 만들어서 사용자에게 반환한다
  • 요청이 있을때 JWT토큰이 있는지, 있으면 유효한 토큰인지 검사후에 요청을 실행한다.

 

우선 jwt module이 필요합니다

npm i jsonwebtoken 을 실행해 jwt module을 설치하도록 합니다.

 

 

주요로직 설명

  • jsonwebtoken module을 사용하여 데이터부분, 시크릿키, 만료시간을 설정한다.
const jwt = require('jsonwebtoken')

module.exports.generate = (payload) => {
    try {
        return jwt.sign(
            payload,
            process.env.JWT_SECRET,
            {
                expiresIn: process.env.JWT_TTL
            }
        )
    } catch (err) {
        throw err
    }
}


module.exports.check = (token) => {
    try {
        return jwt.verify(token, process.env.JWT_SECRET);
    } catch (err) {
        console.log(err);
        throw err
    }
}

주요로직 설명

  • const jwt = require('../utils/jwt') : 위에서 작성한 jsonwebtoken을 활용해 만든 모듈을 가져온다.
  • const token = jwt.generate({user_id,user_name}); : jwt에 필요하다고 생각하는 데이터를 담는다.
const jwt = require('../utils/jwt')
const bcrypt = require('bcrypt');
const logger = require('../utils/logger')
const cookieParser = require('cookie-parser');
const v1Models = require('../models')

const login = async (req, res) => {
    const user_id = req.body.user_id;

    if (!user_id) { return res.status(400).end() }

    const user_pw = req.body.user_pw;
    if (!user_pw) { return res.status(400).end() }

    try {
        const findUser = await v1Models.users.findOne({
            where: {
                user_id: user_id
            }
        })

        if (findUser) {
            if (bcrypt.compareSync(user_pw, findUser['user_pw'])) {
                const user_name = findUser['user_name'];
                const token = jwt.generate({ user_id, user_name });

                logger.info(user_id + 'Login');
                res.cookie('jwt', token);

                return res.status(200).json({ jwt: token });
            } else {
                logger.info(user_id + '정보불일치');
                return res.status(400).end();
            }
        } else {
            return res.status(400).end();
        }
    } catch (err) {
        return res.status(500).json({ err }).end();
    }
}

 

위와같이 작성한 후 로그인에 성공한다면 토큰이 쿠키에 세팅될것이다.

그렇다면 요청을 할때 쿠키에 있는 jwt를 아래와 같은 형식으로 같이 보내주면된다.

header에 Authrication : Bearer 받은토큰 

 

 

 

주요로직설명

  • 받은 요청에 jwt가 없다면 권한이 없다는 메세지와 함께 return 해준다.
  • jwt가 있다면 분리후 권한이 유효한지 체크한다.
  • 유효하다면 next를 통해 다음 미들웨어를 실행시킨다.
const jwt = require('../utils/jwt')

// header > Authrization : Bearer Token

module.exports.check = async (req, res, next) => {
    try {
        console.log(req.headers.authorization)
        if (!req.headers.authorization) {
            return res.status(403)
                .json({ message: '권한이 없습니다' })
        }
        const token = req.headers.authorization.split(' ')[1]


        let payload
        try {
            payload = jwt.check(token)
        } catch (err) {
            return res.status(403)
                .json({ message: 'JWT 권한이 없습니다' })
        }

        req.payload = payload

        next()
    } catch (err) {
        next(err)
    }
}

 

주요로직 설명

  • 요청에 알맞는 function (예시 : controller.create) 를 실행하기전에 우리가 만들어둔 check를 실행한다.
  • 유효하다면 다음 미들웨어인 create를 실행할것이고 유효하지않다면 요청하기전에 403을 return 할것이다.
const express = require('express');
const router = express.Router();
const controller = require('../../controller/board.controller');
const jwtVerify = require('../../middlewares/jwtVerify')

router.route('/').post(jwtVerify.check, controller.create)
router.get('/', controller.get)
router.route('/').delete(jwtVerify.check, controller.destory)

module.exports = router;

 

 

반응형

'개발 > node.js' 카테고리의 다른 글

[node.js] 페이지 이동  (0) 2020.05.23
should.have.property가 제대로 동작 안할 때  (0) 2020.05.03
node.js TDD에 필요한 모듈  (0) 2020.05.01
node.js 란 ?  (0) 2020.04.30

댓글