고양이와 코딩

[웹 풀사이클 데브코스 TIL] 9주차 Day 5 - JWT 예외처리, 에러 본문

데브코스 TIL

[웹 풀사이클 데브코스 TIL] 9주차 Day 5 - JWT 예외처리, 에러

ovovvvvv 2024. 1. 13. 00:58
728x90

지금까지는 예외처리를 if/else.. if/else...ifelseifelse를 사용해서 처리해 왔는데요 ㅎㅎ

 

try/catch vs if/else

const generateToken = (user) => {
  const token = jwt.sign({ userId: user.id }, secretKey, { expiresIn: '1h' });
  if (!token) {
    // 토큰 발급 실패 처리
    return res.status(500).json({ error: 'Failed to generate token' });
  }
  // 토큰 발급 성공 처리
  return res.status(200).json({ token });
};

if/else 문을 사용해서 토큰 발급 처리를 한다면,

  • 토큰 발급이 성공했을 때와 실패했을 때의 처리를 나누는 것이 번거로움
  • 예외 처리 로직이 더 복잡한 상황에서 가독성 저하

 

위 내용을 try/catch로 작성한다면

const generateToken = (user) => {
  try {
    const token = jwt.sign({ userId: user.id }, secretKey, { expiresIn: '1h' });
    return res.status(200).json({ token });
  } catch (error) {
    // 토큰 발급 실패 처리
    return res.status(500).json({ error: 'Failed to generate token' });
  }
};
  • 토큰 발급 성공/실패 모두 간편하게 처리할 수 있음
  • 코드 가독성 향상

 

🍀 try 구문의 코드를 실행하는 도중에 에러가 발생하면, try 코드를 멈추고, catch로 err와 함께 빠져나갑니다! 🍀

🍀 try 구문에서 어떤 에러가 발생해도, 우리가 오류1..오류2... 이렇게 분기 처리 해주던 것들이 알아서 catch에 잡힙니다!
( SyntaxError, TypeError)🍀

 

 

 

TokenExpiredError 및 JsonWebTokenError

TokenExpriedError 

  • 토큰의 유호 기간(ExpiresIn)이 만료되었을 때 발생
  • 사용자의 인증이 만료되었음을 나타냄
try {
  const decoded = jwt.verify(token, secretKey);
  // 토큰이 유효한 경우의 로직
} catch (error) {
  if (error.name === 'TokenExpiredError') {
    // 토큰이 만료된 경우의 처리
    return res.status(401).json({ error: 'Token has expired' });
  }
  // 기타 에러 처리
  return res.status(500).json({ error: 'Internal Server Error' });
}

 

JsonWebTokenError

  • 잘못된 토큰 형식, 서명 오류 등의 이유로 토큰이 유효하지 않을 때 발생.
  • 사용자의 조작된 토큰을 나타냄
try {
  const decoded = jwt.verify(token, secretKey);
  // 토큰이 유효한 경우의 로직
} catch (error) {
  if (error.name === 'JsonWebTokenError') {
    // 토큰이 유효하지 않은 경우의 처리
    return res.status(401).json({ error: 'Invalid token' });
  }
  // 기타 에러 처리
  return res.status(500).json({ error: 'Internal Server Error' });
}

 

 

throw 연산자

throw 연산자는 예외 처리를 할때 아주 유용하게 사용됩니다!

일부러 예외를 생성해서 예외 상황을 명시할 수 있도록 도와줍니다 (*˙˘˙*)!

 

1. throw 연산자의 기본 구문

throw expression;
  • expression은 throw할 값 또는 객체입니다.
  • throw 문은 예외를 발생시키고 현재 함수의 실행을 중단합니다.

2. throw의 활용

`try/catch` 문과 함께 throw를 사용한 예시를 들어보겠습니다

const checkPositiveNumber = (num) => {
	try {
    	if(num <= 0){
        	throw new Error("입력된 숫자는 양수여야 합니다.");
        }
        console.log("양수 확인 완료!)";
    } catch (err) {
    	console.log("에러 발생 : " + err.message);
   }
}

위 코드의 try 블록 내에서 if문의 조건이 만족되면 throw new Error(...) 구문을 사용하여 새로운 에러를 발생시킵니다

그리고 'catch' 블록에서 해당 에러를 잡아서 처리합니다 !

 

또 `throw`문을 사용하여 에러를 생성할 때, Javascript에서는 `Error` 객체를 생성하게 됩니다.

이 Error 객체는 `name` 과 `message` 프로퍼티를 가지고 있기 때문에,

`err.name, err.message`를 자동으로 출력 해 줄 수 있습니다! (에러 객체를 따로 지정하지 않는다면 기본 이름은 'Error' 입니다)

 

따라서 위 코드에서 err.name은 Error 이며, err.message"입력된 숫자는 양수여야 합니다." 입니다!

 

 

 

 

지금까지 node로 백엔드를 해 본 결과 ,, 반복해서 작업하면 잘 이해가 안될지언정 머리속에 내용이 쏙쏙 들어오고
한번 API 구성하고 말면 금세 잊게 되더라구요 (당연함)
그와중에 API 명세, workbench, postman을 왔다 갔다 하면서 작성하니까 혼란스럽긴 하지만!!!
복습방학을 활용해서 다시 잘 복습하고 ㅎㅎ 스프린트2도 잘 마무리 해야겠다는 생각이 들었습니다!

시험을 잘 못봐도 좌절하지 않기 ~~ 꾸준히 지금처럼 하는것이 중요 !