본문 바로가기

데브코스/도서 판매 쇼핑몰

API 구현하기(8) : JWT

JWT 예외 처리

if / else => try/ catch 

 

1) TokenExpiredError

: 유효기간이 지난 토큰 = 만료된 토큰

 

2) JsonWebTokenError

: 문제 있는 토큰 

 

try ... catch

수많은 (개발자가 예상하지 못한) 에러(실수, 사용자가 입력을 잘못한 것, db 가 응답을 잘못 .. ) 를 처리하는 문법

try {
	// A 코드 실행
} catch (err) {
	// 에러 처리
}

✨ try 구문의 코드를 실행하다가 에러가 발생하면, try 코드를 "멈추고" => catch 로 err 와 함께 바로 빠져나간다. 

✨ try 구문에서 어떤 에러가 발생해도, 우리가 다 if 문 분기 처리를 해주던 내용들이 => 알아서 catch 에 잡힌다. (ex. SyntaxError, TypeError) 

 

throw 연산자

: 에러를 발생시키는 연산자

 

throw 에러 객체

ex. throw new SyntaxError(메세지);  


👩🏻‍💻 실습해보기

function ensureAuthorization(req, res) {
  try {
    let receivedJwt = req.headers["authorization"];
    console.log(receivedJwt);

    let decodedJwt = jwt.verify(receivedJwt, process.env.PRIVATE_KEY);
    console.log(decodedJwt);

    return decodedJwt;
  } catch (err) {
    console.log(err.name);
    console.log(err.message);

    return err;
  }
}

JWT 토큰을 검증하여, 유효한 경우 디코딩된 사용자 정보를 반환하고, 유효하지 않은 경우 오류를 처리하여 반환한다. 이를 통해 사용자가 인증된 상태에서 요청을 보냈는지 확인할 수 있다.

 

🛠️로그인이 필요한 부분 jwt 토큰 검증 추가하기

 

ex) 장바구니 아이템 목록 조회

const getCartItems = (req, res) => {
  const { selected } = req.body; //selected = [1,3]
  let authorization = ensureAuthorization(req, res);

  if (authorization instanceof jwt.TokenExpiredError) {
    return res.status(StatusCodes.UNAUTHORIZED).json({
      "message": "로그인 세션이 만료되었습니다. 다시 로그인 하세요."
    });
  }
  else if (authorization instanceof jwt.JsonWebTokenError) {
    return res.status(StatusCodes.BAD_REQUEST).json({
      "message": "잘못된 토큰입니다."
    });
  }
  else {
    let sql = `SELECT cartItems.id, book_id, title, summary, quantity, price 
    FROM cartItems 
    LEFT JOIN books 
    ON cartItems.book_id = books.id
    WHERE user_id=? AND cartItems.id IN (?)`;

    let values = [authorization.id, selected];
    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);
      }
    )
  }
}

토큰이 만료된 경우

 

토큰의 만료 시간이 경과된 경우 위와 같은 메시지가 출력된다.

잘못된 토큰이 입력된 경우

 

토큰의 값이 로그인한 사용자의 토큰과 다를 경우 위와 같은 메시지가 출력된다.

정상 출력

 

토큰이 만료되기 전에 올바른 토큰 값이 헤더에 입력되면, 정상적으로 장바구니 아이템 목록이 조회되는 것을 확인할 수 있다. 


🌟 배운 점

오늘은 JWT 토큰을 검증하는 방법을 배웠다. 실습을 하면서 내가 자주 사용하는 웹사이트들도 이와 같은 방식으로 사용자를 인증하겠구나 싶어 신기했다. 토큰 발행에 이어 검증까지 직접 해보니, 점점 실제 웹사이트의 모양새가 갖춰지는 것 같아 뿌듯했다. 또한, 그동안 try-catch 문을 들어보기만 하고 사용해본 적은 없었는데, 이번에 정확한 사용 방법과 이유를 알게 되어 유익했다. 앞으로 실무에서 잘 활용해야겠다.