노래하듯 이야기하고, 춤추듯 정복하라.

[Node.js API 개발] JWT 토큰을 활용한 데이터 변조 및 탈취 방지 본문

프로그래밍/node.js

[Node.js API 개발] JWT 토큰을 활용한 데이터 변조 및 탈취 방지

hyeoke 2019. 5. 27. 16:47

# JWT 토큰을 활용하여 로그인된 사용자 확인하기

## jsonwebtoken 모듈 설치 및 middleware 개발

 

1. 모듈 install

sudo npm i jsonwebtoken

 

2. middlewares => exports.verifyToken

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

exports.verifyToken = (req, res, next) => {
    try {
        req.decoded = jwt.verify(req.headers.authorization, process.env.JWT_SECRET)
        return next();
    } catch (err) {
        if (err.name === 'TokenExpiredError') {
            return res.status(419).json({
                resultCode: 419,
                meesage: "토큰 만료"
            });
        }

        return res.status(401).json({
            resultCode: 401,
            message: "토큰이 유효하지 않습니다."
        })
    }   
}

 

3. 토큰 사용 => router

1). 로그인 시 토큰 발행 ( *만료 시간 정해줄 것* )

// routes/auth.js

const express = require('express');

const { User } = require('../models'); // 모델 임포트
const { verifyToken } = require('./middlewares'); // 미들웨어 임포트
const jwt = require('jsonwebtoken') // 모듈 임포트

const router = express.Router();

// 로그인 라우터
router.post('/login', async (req, res, next) => {
    const { email, password } = req.body;
    
    if (사용자 데이터 유효성 체크) {
    	const user = User.findOne({ where: { email: email } })
		const token = jwt.sign({
            user_id: user.id,
			email: user.email,
            nick: user.nick
        }, process.env.JWT_SECRET, {
            expiresIn: '15m', // 유효기간 15분 => 15분 이후 토큰이 재발급 됨
            issuer: 'nodebird',
        });
        
        return res.status(200).json({
            resultCode: 200,
            message: "토큰 발행, 로그인 성공",
            token, // 발행된 jwt 토큰
        })
	} else {
		res.status(404).json({
			resultCode: 404,
            message: "사용자 데이터가 유효하지 않습니다."
        })
	}
});

router.get('/confirm', verifyToken, (req, res, next) => {
    res.json(req.decoded);
});

module.exports = router; 

 

2) 사용자가 다른 라우터 접근시, 로그인 여부(유효한 사용자) 체크 하기

- verifyToken 미들웨어를 통하여 클라이언트에게 헤더로 전송받은 클라이언트의 토큰의 유효성을 체크한다.

< postman을 사용해서 클라이언트를 가정해 봄 - header에 사전에 전달 받은 토큰을 담아 서버에게 전달한다. >

- router

// verifyToken 미들웨어를 통하여 사전에 헤더로 전송받은 클라이언트의 토큰의 유효성을 체크한다.

router.get('/newPost', verifyToken, (req, res, next) => {
    const { user_id } = req.body; // 세션에 저장해 놓은 user_id 받기
    
    console.log(req.decoded);
    
    if (user_id == req.decoded.user_id) {
         res.status(200).json({
             resultCode: 200,
             message: "인증 성공"
         });
     }
});

 

Comments