
오늘은 좋아요 기능에 body로 받던 userId 를 JWT를 이용해
header에 받는 기능으로 수정하였다.
JWT(JSON Web Token)는 일정 시간이 지나면 만료된다. 이를 확인하는 방법은 JWT를 검증할 때 TokenExpiredError가 발생하는지를 확인하는 것이다.
const jwt = require('jsonwebtoken');
const dotenv = require('dotenv');
dotenv.config();
try {
let receivedJWT = req.headers["authorization"];
let decodedJWT = jwt.verify(receivedJWT, process.env.PRIVATE_KEY);
console.log("decoded JWT : ", decodedJWT);
} catch (error) {
if (error instanceof jwt.TokenExpiredError) {
console.log('토큰이 만료되었습니다.');
}
}
try 블록에서 발생한 에러는 catch 블록에서 잡을 수 있다.
try {
let receivedJWT = req.headers["authorization"];
let decodedJWT = jwt.verify(receivedJWT, process.env.PRIVATE_KEY);
} catch (error) {
console.log('에러 처리:', error.message);
}
JWT를 검증할 때 발생할 수 있는 주요 에러는 TokenExpiredError와 JsonWebTokenError다.
try {
let decodedJWT = jwt.verify(receivedJWT, process.env.PRIVATE_KEY);
} catch (error) {
if (error instanceof jwt.TokenExpiredError) {
console.log('토큰이 만료되었습니다.');
} else if (error instanceof jwt.JsonWebTokenError) {
console.log('유효하지 않은 토큰입니다.');
}
}
Express에서 res.send()를 두 번 호출하면 에러가 발생한다.
const addLike = (req, res) => {
try {
const {bookId} = req.params;
let receivedJWT = req.headers["authorization"];
let decodedJWT = jwt.verify(receivedJWT, process.env.PRIVATE_KEY);
console.log("decoded JWT : ", decodedJWT);
const sql = "INSERT INTO likes (user_id, liked_book_id) VALUES (?, ?)";
const values = [decodedJWT.id, bookId];
conn.query(sql, values, (err, results) => {
if (err) {
console.log(err);
return res.status(StatusCodes.BAD_REQUEST).end();
}
return res.status(StatusCodes.OK).json(results);
});
} catch (error) {
if (error instanceof jwt.TokenExpiredError) {
return res.status(StatusCodes.UNAUTHORIZED).json({ message: '토큰이 만료되었습니다.' });
} else if (error instanceof jwt.JsonWebTokenError) {
return res.status(StatusCodes.UNAUTHORIZED).json({ message: '유효하지 않은 토큰입니다.' });
}
return res.status(StatusCodes.INTERNAL_SERVER_ERROR).json({ message: '서버 오류 발생' });
}
};
오늘 이후로 JWT의 TokenExpiredError와 JsonWebTokenError를 구분할 수 있을 것 같다.
또한 자주 사용하는 try-catch 구문도 학습해 JWT 검증 에러 처리도 할 수 있게 되었다.
그리고 res.send()를 두 번 호출하면 에러가 발생할 수 있다는 것을 알았다.