원래 기존 코드에서는 로그아웃 시 아래와 같이 쿠키를 삭제하는 방식으로 구현을 했었다.
logout = (req, res, next) => {
try {
res.clearCookie('accessToken');
res.status(200).send('로그아웃 완료');
} catch (error) {
next(error);
}
};
그런데 쿠키 삭제만으로는 완벽하게 처리되지 않는다는 것을 알게 되어 chat GPT와 함께 코드를 구현해봤다.
토큰에 대한 것을 db에 저장하고 관리하는게 가장 확실하다고는 하나 프로젝트 규모도 그렇고 현재 구현하기에는 적합하지 않다는 생각이 들어 고민하다가 배열을 이용하는 방법을 이용해보았다.
db를 대신할 블랙리스트 배열을 선언한다.
const tokenBlacklist = [];
토큰이 있는지 확인하고 검증 후 블랙리스트에 추가
try {
// 토큰이 있는지 확인
const { accessToken } = req.cookies;
// 토큰이 있디면 유효성 검증
if (accessToken) {
const decodedToken = jwt.verify(accessToken,"token-secret");
const { id } = decodedToken;
// 유효성 검증 통과시 해당 토큰 블랙리스트에 추가
if(id) {
tokenBlacklist.push(accessToken);
}
} else {
throw new Error('로그인 정보가 없습니다.');
}
} catch (error) {
throw new Error('유효하지 않은 토큰입니다.');
}
이후 인증이 필요한 요청 시 토큰의 유효성을 검증하면서 동시에 블랙리스트에 있는 토큰인지를 함께 확인하여 유효성 확인 되고 블랙리스트에 없는 토큰이라면 성공 응답을 유효하지 않거나 블랙리스트에 포함되어 있는 토큰이라면 실패에 대한 오류처리를 하는 방식으로 가는 것을 생각해봤다.
이후 구현을 더 해보고 알게되는 내용이 있으면 추가로 작성해야겠다.