전 포스트에서 JWT에 관한 설명을 조금 했는데 이번엔 내가 어떻게 썻는지에 대해서 중점적으로 남겨보려한다.(나중에 까먹을까봐)
이 방법이 Best Practice인지는 잘 모르겠지만…
혹시 이것보다 더 좋은 방법이 있다면 댓글로 알려주세요!
프로젝트 생성
Express 프로젝트를 생성하고 npm install
을 해주자.
1 2
| $ express --ejs express-jwt $ cd express-jwt && npm install
|
일단 껍데기만 있는 Auth API를 만들어 두자.
app.js
에 다음과 같이 추가하자.
1 2 3 4 5
|
const auth = require('./routes/auth');
app.use('/auth', auth);
|
routes/auth.js
파일을 생성하자.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
|
const express = require('express'); const router = express.Router();
router.post('/signup', (req, res, next) => { res.send('ok'); });
router.post('/signin', (req, res, next) => { res.send('ok'); });
module.exports = router;
|
JWT 미들 웨어
그리고 jsonwebtoken
이라는 모듈을 설치하자
1
| $ npm i --save jsonwebtoken
|
그리고 Express에서 미들웨어처럼 사용하기 위해 utils/tokenHelper.js
라는 파일을 만들었다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
|
const jwt = require('jsonwebtoken');
const TOKEN_SECRET = 'secret';
const tokenGenerator = (data, callback) => { const token = jwt.sign(data, TOKEN_SECRET, { algorithm: 'HS256', expiresIn: 60 * 60 * 24 * 7 }) callback(token) }
const isValid = (token, callback) => { jwt.verify(token, TOKEN_SECRET, (err, decode) => { if (err) { callback({isValid: false}) } else { const exp = new Date(decode.exp * 1000) const now = Date.now() const day = (60 * 60 * 24 * 1000) if (exp < now) { callback({isValid: false}) } else if (exp < now + (5 * day)) { const newToken = module.exports.generateToken(decode.user.id) callback({isValid: true, token: newToken, userInfo:decode}) } else { callback({isValid: true, token: token, userInfo:decode})
} } }) }
const tokenHandler = (req, res, next) => { const { token } = req.query
if(token) { module.exports.isValid(token, (result) => { req.userInfo = result; next() }) } else { req.userInfo = {isValid: false} next() } }
export default { tokenGenerator, isValid, tokenHandler }
|