JWT(Json Web Token)란 Json 포맷을 이용하여 사용자에 대한 속성을 저장하는 Claim 기반의 Web Token이다. JWT는 토큰 자체를 정보로 사용하는 Self-Contained 방식으로 정보를 안전하게 전달한다. 주로 회원 인증이나 정보 전달에 사용!!
📝 router/base.js
const jwt = require('jsonwebtoken');
const SECRET_KEY = 'MY-SECRET-KEY';
// POST /login 요청 body에 id와 password를 함께 실어서 요청으로 가정 (사실 id와 password는 암호화 되어있음)
router.post('/login', (req, res, next) => {
//받은 요청의 id와 password로 DB에서 프로필사진, 닉네임 등 로그인 정보를 가져온다.
const nickname = "CharmingKyu";
const profile = 'imageURL';
//jwt.sign(payload, secretOrPrivateKey, [options, callback])
token = jwt.sign({
type: 'JWT',
nickname: nickname,
profile: profile
}, SECRET_KEY, {
expiresIn: '15m', // 만료시간 15분
issuer: '토큰발급자',
});
//response
return res.status(200).json({
code: 200,
message: '토큰이 발급되었습니다.',
token: token
});
});
router에 존재하는 js 파일에 위 코드를 작성했다면 이제 미들웨어 파일인 jwt.js 파일을 작성해준다.
📝 jwt.js
const jwt = require('jsonwebtoken');
const SECRET_KEY = 'MY-SECRET-KEY';
exports.verifyToken = (req, res, next) => {
// 인증 완료
try {
// 요청 헤더에 저장된 토큰(req.headers.authorization)과 비밀키를 사용하여 토큰을 req.decoded에 반환
req.decoded = jwt.verify(req.headers.authorization, SECRET_KEY);
return next();
}
// 인증 실패
catch (error) {
// 유효시간이 초과된 경우
if (error.name === 'TokenExpiredError') {
return res.status(419).json({
code: 419,
message: '토큰이 만료되었습니다.'
});
}
// 토큰의 비밀키가 일치하지 않는 경우
if (error.name === 'JsonWebTokenError') {
return res.status(401).json({
code: 401,
message: '유효하지 않은 토큰입니다.'
});
}
}
}
token 값이 유요하다면 status 200이 출력되며 토큰이 유효하지 않다면 401, 만료됬다면 419가 출력된다.
postman에서는 authorization에 토큰값을 입력하여 확인이 가능하다.