노드숙련강의 3-5

·2022년 12월 20일
0

study

목록 보기
17/81
post-thumbnail

사용자 인증 미들웨어 구현하기

지금 구현된 프론트엔드는 로그인이 성공했을때 받아온 토큰을 HTTP header에 아래와 같이 넣어서 보내고 있어요!
Authorization: **Bearer** JWT토큰내용

위와 같은 양식으로 보내는 이유는 HTTP 인증 유형중, Bearer 타입을 사용하여 토큰을 전달하기 위함.

"Authorization" 헤더로 전달받는 토큰이 유효한지 검사하고, 만약 유효하다면 토큰 안에 있는 userId 데이터로 해당 사용자가 데이터베이스에 실제로 존재하는지 체크하면 됩니다.

사용자 인증 미들웨어 구현 예시

// middlewares/auth-middleware.js

//jwt와 모델의 user가져오기
const jwt = require("jsonwebtoken");
const User = require("../models/user.js");

module.exports = async (req, res, next) => {
  const { authorization } = req.headers;
  const [authType, authToken] = authorization.split(" ");
  //authType:Bearer, authToken:나머지 실제 jwt값

  //타입이 Bearer가 아닐떄와 authToken이 없을때 에러
  if (!authToken || authType !== "Bearer") {
    res.status(400).json({
      errorMessage: "로그인 후 이용 가능한 기능입니다.",
    });
    return;
  }

  try {
    //복호화 및 검증
    const { userId } = jwt.verify(authToken, "sparta-secret-key");
    const user = await User.findById(userId);
    res.locals.user = user;
    next();
  } catch (error) {
    res.status(400).json({
      errorMessage: "로그인 후 이용 가능한 기능입니다.",
    });
  }
  return;
};

추가설명

res.locals.user = user;

우리는 토큰에 담긴 userId로 해당 사용자가 실제로 존재하는지 확인했습니다.

이미 데이터베이스에서 사용자 정보를 가져온것이죠.
이 미들웨어를 사용하는 라우터에서는 굳이 데이터베이스에서 사용자 정보를 가져오지 않게 할 수 있도록 express가 제공하는 안전한 변수에 담아두고 언제나 꺼내서 사용할 수 있게 작성했습니다!

이렇게 담아둔 값은 정상적으로 응답 값을 보내고 나면 소멸하므로 해당 데이터가 어딘가에 남아있을 걱정의 여지를 남겨두지 않게 됩니다

profile
개발자 꿈나무

0개의 댓글