[DevCamp] 스프린트 프로젝트 2 - JWT 추가 및 try-catch

동건·2025년 3월 21일
0

DevCamp

목록 보기
33/85

스프린트 프로젝트 2 - JWT 추가 및 try-catch

오늘은 좋아요 기능에 body로 받던 userId 를 JWT를 이용해
header에 받는 기능으로 수정하였다.


1. JWT 만료? Token Expired Error

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('토큰이 만료되었습니다.');
  }
}

2. try-catch 구문 동작 원리

try 블록에서 발생한 에러는 catch 블록에서 잡을 수 있다.

try {
  let receivedJWT = req.headers["authorization"];
  let decodedJWT = jwt.verify(receivedJWT, process.env.PRIVATE_KEY);
} catch (error) {
  console.log('에러 처리:', error.message);
}

3. TokenExpiredError와 JsonWebTokenError 구분

JWT를 검증할 때 발생할 수 있는 주요 에러는 TokenExpiredErrorJsonWebTokenError다.

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('유효하지 않은 토큰입니다.');
  }
}

4. res를 두 번 보내면 생기는 문제

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: '서버 오류 발생' });
    }
};

5. 🔨 TIL

오늘 이후로 JWT의 TokenExpiredErrorJsonWebTokenError를 구분할 수 있을 것 같다.
또한 자주 사용하는 try-catch 구문도 학습해 JWT 검증 에러 처리도 할 수 있게 되었다.
그리고 res.send()를 두 번 호출하면 에러가 발생할 수 있다는 것을 알았다.

profile
배고픈 개발자

0개의 댓글