.exp라는 메서드를 활용하여 현재의 시간과 비교하는 것으로 이해했다. (Date.now() / 1000 는 현재 시간을 초 단위로 변환하는 부분이라고 한다.)
문제점2. 여전히 내가 원하는 에러는 잡히지 않고 catch에서 에러가 잡혔다.
해결 역시나 검색과 GPT를 열심히 검색한 결과 ! 에러 메시지를 이용한 유효성 검사 방법이 있었다. 유효기간이 만료되었을 경우의 콘솔창 에러 메시지 !
에러 메시지 상단에 TokenExpiredError가 보이는가 !? jsonwebtoken에서는 유효기간이 만료되었을 때에 대한 별도의 에러가 지정되어 있었다 ! 이것을 활용해서 아래와 같이 코드를 만들어 보았다.
// try 문에서 토큰 만료기간 유효성 검사가 계속 안되어서.. 에러 이름으로 catch에서 실행함
if (error.name === 'TokenExpiredError') {
return res.status(401).json({ errorMessage: "토큰이 만료되었습니다." })
};
그 결과 내가 원했던 에러 코드와 메시지를 던질 수 있었다 !! 여기서 생각이 들었던 것은 다른 유효성 검사도 이런식으로 해볼 수 있지 않을까 생각이 들었다.
# 유효성 검사 통과 후 res.locals.user에 유저 정보 담기 !
const authenticate = async (req, res, next) => {
try {
const { Authorization } = req.cookies;
const [tokenType, token] = (Authorization ?? "").split(" ");
const decodedToken = jwt.verify(token, process.env.SECRET_KEY);
const id = decodedToken.userId;
const user = await Users.findOne({ where: { id } });
// 토큰 사용자가 존재하지 않을 경우
if (!user) {
res.clearCookie("Authorization");
return res.status(401).json({ errorMessage: "사용자가 존재하지 않습니다." });
};
// 토큰 타입이 불일치 할 경우 (Bearer 가 아닐경우)
if (tokenType !== "Bearer") {
return res.status(403).json({ errorMessage: "토큰 타입이 일치하지 않습니다." });
};
res.locals.user = user;
next();
} catch (error) {
console.error(error);
res.clearCookie("Authorization");
// try 문에서 토큰 만료기간 유효성 검사가 계속 안되어서.. 에러 이름으로 catch에서 실행함
if (error.name === 'TokenExpiredError') {
return res.status(403).json({ errorMessage: "토큰이 만료되었습니다." })
};
return res.status(401).json({ errorMessage: "로그인이 필요합니다." });
};
}
export default authenticate;
인증이 통과하게 되면 user의 정보를 로컬 환경에 저장하여 불필요한 로그인을 하지 않게 하였다.
따라서 이후에 진행하는 라우터들도 유저 정보를 불러올 때는 res.locals.user에서 유저 정보를 가져올 수 있다.
(로그인이 된 상태라면)
마지막으로 해당 미들웨어를 다른 파일에서도 사용하기 위하여 export를 해주었다.
다음에는 인증된 사용자가 상품을 등록, 조회, 수정, 삭제 할 수 있는 API를 만들어 보도록 하겠다.