어마어마한 삽질과 함께 로그아웃 기능 구현에 성공했다. 아래 로그아웃 버튼을 누르면 쿠키가 삭제되고 로그인 페이지로 리다이렉트된다.
로그아웃 실행 시 서버에서 쿠키를 삭제하고, 클라이언트로 "로그아웃 완료"라는 메시지를 반환한다. 즉, 서버 로직에는 문제가 없다. 하지만 클라이언트에서 로그아웃이 정상적으로 실행되지 않는다. ProtectedRoute를 설정하였기 때문에 로그아웃을 하면 특정 페이지로 접속이 불가능하고 로그인 페이지로 리다이렉트되어야 하는데 특정 페이지 접속이 가능하다.
// MyPage.jsx
const logoutHandler = async () => {
try {
const responseData = await logout();
if (responseData) {
document.cookie = "MM=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/; domain=honeyitem.shop;";
navigate('/login');
}
} catch (error) {
console.error(error);
}
};
// MyPage.jsx
const logoutHandler = async () => {
try {
const responseData = await logout();
if (responseData) {
document.cookie = "MM=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/; domain=honeyitem.shop;";
window.location.reload(true);
}
} catch (error) {
console.error(error);
}
};
// MyPage.jsx
const logoutHandler = async () => {
try {
const responseData = await logout();
if (responseData) {
document.cookie = "MM=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/; domain=honeyitem.shop;";
localStorage.clear();
sessionStorage.clear();
window.location.reload(true);
}
} catch (error) {
console.error(error);
}
};
// MyPage.jsx
import { useCookies } from 'react-cookie';
const [cookies, setCookie, removeCookie] = useCookies(['MM']);
const logoutHandler = async () => {
try {
const responseData = await logout();
if (responseData) {
document.cookie = "MM=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/; domain=honeyitem.shop;";
localStorage.clear();
sessionStorage.clear();
removeCookie('MM');
window.location.reload(true);
}
} catch (error) {
console.error(error);
}
};
이 외에도 하루 종일 자잘한 삽질을 많이 했으나, 여기까지만 적는다...🥲
문제의 원인은 api 호출에 있었다!
"로그아웃 완료"라는 메시지를 받았기 때문에 api 호출에는 문제가 없을 줄 알았는데 아니었다.
export const logout = async () => {
const response = await api.post('/auth/logout', {
withCredentials: true,
});
return response.data;
};
서버로 아무런 데이터도 전송하지 않는 경우 빈 객체 {}
를 선언해줘야 한다!
// auth.js
export const logout = async () => {
const response = await api.post(
'/auth/logout',
{}, // 바로 이부분 추가
{
withCredentials: true,
}
);
return response.data;
};
axios
와 같은 라이브러리를 사용하는 경우,PUT
요청을 보낼 때 본문이 없으면 에러가 발생할 수 있습니다. 이런 경우에 빈 객체{}
를 본문으로 보내는 것은 에러를 방지하는 방법 중 하나입니다.
꼭 빈 객체를 보내야 하는지 여부는 사용하는 API 클라이언트 라이브러리와 서버의 설정에 따라 다릅니다. 문제가 발생하는 경우, 빈 객체를 추가해주는 것은 간단한 해결책이 될 수 있습니다.