정말로 로그인 관련한 것은 다끝난 줄 알았는데...
미래 CTO 윤희언니가 알려줬다. 따흑... 주말에 분노의 베이킹 함 더 가야겠다.
세션을 삭제하면 로그아웃이 되긴 하지만, 브라우저에는 여전히 쿠키가 남아있는 문제가 발생하고 있었다.
어차피 로그아웃 시 세션이 만료되기 때문에 쿠키에 저장된 세션으로 요청한다고 해서 승인이 되진 않겠지만 그래도요...! 세션과 쿠키를 따로따로 없애줘야 한다는 사실을 알지 못했답니다.
기존 로그아웃 로직
if (!req.session.admin_name) {
console.log('NO SESSION DATA');
res.status(401).json({ message: ERROR_MESSAGE.NO_LOGIN });
} else {
// session.destroy() ; 생성 되어 있는 세션 정보를 삭제
req.session.destroy(() => {
res.json({ message: SUCCESS_MESSAGE.LOGOUT_SUCCESS });
});
}
원래 코드에서는 req.session.destroy()
를 통해서 세션을 삭제하고 끝이었다. 하지만 브라우저에 저장된 쿠키를 없애주기 위해서는 아래와 같이 코드를 추가하면 된다.
변경된 로그아웃 로직
if (!req.session.admin_name) {
console.log('NO SESSION DATA');
res.status(401).json({ message: ERROR_MESSAGE.NO_LOGIN });
} else {
// session.destroy() ; 생성 되어 있는 세션 정보를 삭제
req.session.destroy(() => {
res
.clearCookie('connect.sid', {
sameSite: 'lax',
secure: false,
httpOnly: true,
path: '/api',
})
.json({ message: SUCCESS_MESSAGE.LOGOUT_SUCCESS });
});
}
res.clearCookie
를 통해 쿠키를 삭제할 수 있다.
res.clearCookie()
/** Clear cookie `name`. */ clearCookie(name: string, options?: CookieOptions)
https://expressjs.com/en/5x/api.html#res.clearCookie 공식 문서 발췌 내용
Web browsers and other compliant clients will only clear the cookie if the given options is identical to those given to res.cookie(), excluding expires and maxAge.
필수 인자는 쿠키 이름 하나지만, 두 번째 인자로 오는 쿠키 옵션이 같은 쿠키만 삭제가 된다. (maxAge
, expires
제외)
🪄 때문에 삭제하고 싶은 쿠키의 이름과 옵션을 인자로 각각 넣어주면 브라우저에서도 깔끔하게 쿠키를 삭제할 수 있다.
참고한 곳
cookie 완전히 제거 하는법
[node.js, express] cookie 삭제시에 참고해야 할 점
공식문서