본문 바로가기

프로그래머스/프로그래머스 Study

[프로그래머스 9-1] jwt/authorization/ try-catch/Throw

2024.04.22 이번 주간은 다시 과제 요약제출인가보다 'ㅅ' 

 

배운 내용 요약
- jwt API 구현(좋아요, 장바구니)
- authorization
- try-catch
- Throw
- TokenExpiredError
- instanceOf
- JsonWebTokenError

 

원래 user_id를 body로 받아서 포스트맨으로 실습하고있었는데,

드디어 좋아요나 장바구니에 jwt를 사용하여 로그인 시 cookie에 token을 발급받고,

그 token을 복호한 값으로 관련 행위를 할 수 있게 되었다. 

 

 

 

 

지금까지 짠 코드 중에서 JWT는 어디에 필요할까?

  • 좋아요 API
  • 장바구니 API
  • 결제(주문) API
좋아요 추가: 회원인 사람만 좋아요 가능하게 해야 함
좋아요 삭제: 회원인 사람만 좋아요 취소 가능
장바구니 담기: 당연히 회원만 가능
장바구니 목록 조회: 내가 가진 장바구니에서 전체조회하거나 or 주문서에서 내가 선택한것만 뿌려지게 하는거 =당연히 회원id 필요
장바구니 도서 삭제: 회원만 가능
결제하기: 당연히 회원만 가능(장바구니 전달 내용이니까)

그럼 JWT한번만 만들어놓으면 여러번 쓸 수 있지 않을까?
=맞음

 

 

 

좋아요 리팩토링

중복코드를 없애보자!
어떻게? → 함수로 빼내면 됨

 

  1. jwt꺼냄
  2. 복호화
  3. 복호화되어서 반환된 payload값 가지고 그안에 있는 id값 꺼냈었음

 

 

 

함수 위치는 어디에?

함수를 호출하는 위치가
함수 선언한 위치보다 위에 있으면 인간이 한번만 읽으면 된다.

 

 

 

 

jwt expired?

500에러는 나면 안되는데…token유효기간 지난거 보냈다고 지금 500이 찍힘
=500은 진짜 개 치명적인 에러임 (=다 백엔드탓이란 소리 ㅠ)

 

 

 

 

JWT예외처리(if/else → try/catch사용가능)

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

2) JsonWebTokenError
: 문제 있는 토큰

 

 

 

try catch 구문 동작 원리 제대로 파헤치기

try-catch: (개발자가 예상하지 못한)수많은 에러를 처리하는 문법

실수
사용자가 입력 잘못함
DB가 응답을 잘못…
⇒ 프로그램을 짤 때 에러가 발생하는 모든것들

- try구문의 코드를 실행하다 에러가 발생하면
  try코드를 멈추고 catch로 err와 함께 바로 빠져나감

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

 

 

 

 

에러 객체

 

⇒ 이 ReferenceError가 바로 error객체

1) 자바스크립트가 고대 개발자분들의 노고를 보고, 자주 일어나는 “내장” 에러 객체 만들어둠
2) JWT모듈에서도 제공하는 에러 객체도 있음
3) 직접 만들어 쓸 수도 O


try-catch먹이고 에러발생시 exited with code = 0

try-catch먹이고 에러발생시 exited with code = 1

 

 

 

 

Throw 연산자

에러를 발생시키는 연산자
e.g. throw new SyntaxError();

 

 

 

 

res를 두번 보내면 생기는 일 - instanceOf 등장

1. 에러 발생

2. 함수 try-catch에서 catch에 걸려서 response한번 보냄
(근데 return이라 장바구니아이템목록조회의 let authorization으로 에러난 값 돌려줌)

3. 장바구니 아이템 목록조회가 엉망진창으로 돌아감. 에러난값으로 sql돌리고 결과 반환함
    → let values에서 authorization.id값이 안들어옴(당연..id가 아니라 에러메세지 들어가겠지 ^_^)

4. 그래서 ERR_HTTP_HEADERS_SENT('set'); 가 발생
   ⇒ 왜냐면 response 2번보내서 그럼

 

 

 

암호화가 풀린 decodedJwt를 반환하던가, err를 반환하던가 둘중 하나!

이렇게 if-else문으로 걸러주면 됨