passport-jwt 인증시 null 값 반환

오홍석·2022년 12월 15일
0

문제점

haru 프로젝트를 진행하면서 로그인시 발급받는 JWT를 활용하여 로그인 상태를 인증하는 할 때, JWTVerify 인증 전략을 통과하지않고 계속해서 null값을 반환하는 현상이 문제점이다.

해결과정

우선 해당 코드에서 문제가 있다고 예상되는 passport.authenticate("jwt", ~~) 라인과 JWTVerify 부분에 breakpoint를 설정하여 디버깅을 진행하였다. 그 결과 JWTVerify 인증 전략을 호출하자마자 함수로 들어가지않고, 빠져나오고 있음을 알 수 있었다.
위의 과정을 통해서 JWTVerify이 호출되었지만 바로 빠져오는 것으로 보아 JWTConfig, 즉 request의 header에서 JWT를 추출해주는 부분에서 문제가 발생하였다고 판단했다.
당시 JWTConfig에서는 JWT를 추출하는 방법으로
jwtFromRequest : ExtractJwt.fromAuthHeaderAsBearerToken() 를 사용하였다.
이는 header에 bearer 스키마에 담겨 온 token을 해석한다는 의미이다.
이를 통해서 찾은 문제점은 header에 담겨서 전송되는 토큰을 Bearer 타입으로 날려주지 않아서 헤더에서 토큰을 추출하는데 실패하는 것이였다.
PostMan을 통해서 Authorization header에 Bearer 타입으로 토큰을 보내주는 테스트를 진행하였고, 성공적으로 토큰을 추출하는 것을 확인하였다.
토큰을 Bearer타입으로 명시해줌으로 문제를 해결할 수 있었다.
후에는 cookie를 이용한 관리로 변경하여 주었다.

현재 코드

const JWTConfig = {
  jwtFromRequest: cookieExtractor,
  secretOrKey: process.env.JWT_KEY,
};

const JWTVerify = async (token: any, done: any) => {
  try {
    if (!token) {
      console.log("token이 없습니다.");
      return done(null, false, { reason: "token이 없습니다." });
    }

    const user = await DB.getRepository(User).findOneBy({ email: token.email });

    if (!user) {
      console.log("token과 맞는 user가 없습니다.");
      return done(null, false, { reason: "token과 맞는 user가 없습니다." });
    }

    return done(null, user);
  } catch (error) {
    console.error(error);
    done(error);
  }
};

반성

처음 접해보는 모듈의 충분한 이해없이 적용시키다 보니 어떠한 부분에서 에러를 발생시키는지 제대로 파악하지 못하였다.
이후에는 사용할 모듈에 대한 충분한 이해와 공부를 바탕으로 시작해야한다는 생각을 가질 수 있었다.

profile
기동코딩

0개의 댓글