반응형
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 |
댓글