본문 바로가기
타입스크립트로 함께하는 웹 풀 사이클 개발(React, Node.js)/TIL

데브코스 9주차 Day 5 - jwt, 예외처리 with) throw-catch

by 슈크림 붕어빵 2024. 1. 13.

구현한 부분

  • jwt 토큰으로 user 인증 및 user_id 사용
  • jwt 에러 처리

임시로 user_id를 받아서 사용했으나 jwt 토큰인증으로 user_id를 체크할 수 있게됨.

헷갈렸던 부분

  • 암호화는 crypto 모듈로 salt사용 - password
  • jwt는 jsonwebtoken 모듈로 process.env.priavatekey 사용 - 사용자 id 확인 / 로그인된 사용자

 

jwt 과정

1. 로그인시  jwt를 발급(user_id정보 넣어서) 해준다.

2. 이 jwt를 가지고 api를 날릴 때 header의 authorization에 jwt token을 넣어서 보낸다.

3. process.env에 있는 privatekey로 payload 확인후 userid 사용

4. 만료기한 지나면 폐기됨.

 

jwt를 어디에 넣었나

서버 => 클라이언트:  쿠키

클라이언트 => 서버: 헤더

 

 

jwt 에러

  • TokenExpiredError : 유효기간이 지난 토큰
  • JsonWebTokenError : 문제가 있는 토큰 - 예) 인증되지 않음

 

 

토큰 발급 - 로그인시 : jwt.sign(내용, 비밀키, 만료기한 및 만든이)

const crypto = require("crypto"); //내장 암호화 모듈
const jwt = require("jsonwebtoken"); //jwt 모듈

const token = jwt.sign(
        {
          email: loginUser.email,
          name: loginUser.name,
          id: loginUser.id,
        },
        process.env.PRIVATE_KEY,
        {
          expiresIn: "15m",
          issuer: "sungeun",
        }
      );
      console.log(token);

      res.cookie("token", token, {
        httpOnly: true,
      });
      return res
        .status(StatusCodes.OK)
        .json({ message: `${loginUser.name}님 환영합니다.` });

 

 

jwt 디코딩 - jwt.verify(토큰 , 비밀키)

const jwt = require("jsonwebtoken");
let dotenv = require("dotenv");
dotenv.config();

const authorization = (req) => {

  let token = req.headers["authorization"];
  let decoded = jwt.verify(token, process.env.PRIVATE_KEY);

  return decoded;
};

이후 payload에 id를 저장해두었다면 decoded.id로 사용 가능하다.

 

throw 연산자

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

 

사용법 with jwt

const authorization = (req) => {
  try {
    let token = req.headers["authorization"];
    let decoded = jwt.verify(token, process.env.PRIVATE_KEY);
    console.log(decoded);

    return decoded;
  } catch (err) {
    return err;
  }
};

 

=> 디코딩 과정을 try - catch 문에 넣어서  수행하여 decode된 값 반환 or 문제발생시 err를 반환

 

let decoded = authorization(req);

  if (decoded instanceof jwt.TokenExpiredError) {
    return res
      .status(StatusCodes.UNAUTHORIZED)
      .json({ message: "로그인 세션이 만료되었습니다." });
  } else if (decoded instanceof jwt.JsonWebTokenError) {
    return res
      .status(StatusCodes.BAD_REQUEST)
      .json({ message: "잘못된 토큰입니다." });
  } else {
  //수행할 내용
  }

 

=> 반환된 값이 err인 경우 케이스에 따른 에러처리