TheHeader.vue
<script setup>
.
.
.
import { ref, watch } from "vue";
import { useRouter } from "vue-router";
import { useAuthStore } from "@/store/auth";
const store = useAuthStore();
const router = useRouter();
const move = (path) => {
let moveTo = { name: path };
switch (path) {
case 'login': // 로그인
if (store.isAuthenticated) {
alert('이미 로그인 중입니다!');
return;
}
break;
case 'logout': // 로그아웃. 토큰과 인증 정보를 초기화
console.log('로그아웃 클릭됨');
store.getLogout(); // 액션 호출
console.log('isAuthenticated 상태: ', store.isAuthenticated.value);
console.log('token 상태: ', store.token.value);
moveTo = { name: 'logout' }
break;
}
// 페이지 이동 시 열려있는 메뉴 전부 닫기
showUserMenu.value = false;
showSidebar.value = false;
router.push(moveTo);
};
.
.
.
</script>
LogoutPage.vue
<template>
<div>
로그아웃 페이지
<p>3초 뒤 메인 페이지로 이동합니다.</p>
<p>{{ timerCount }}</p>
</div>
</template>
<script setup>
import { onMounted, watch, ref } from 'vue';
import { useRouter } from 'vue-router';
import { useAuthStore } from "@/store/auth";
const store = useAuthStore();
const router = useRouter();
const timerCount = ref(3);
onMounted(() => {
console.log("토큰이랑 인증정보 : ", store.token, store.isAuthenticated)
const countdown = setInterval(() => {
timerCount.value--;
if (timerCount.value === 0) {
clearInterval(countdown);
router.push({ name: 'main' });
}
}, 1000);
});
</script>
<style scoped></style>
<style lang="scss" scoped></style>
// src/store/auth.js
import { defineStore } from "pinia";
import { login } from "@/auth/login.js";
import { ref } from "vue";
export const useAuthStore = defineStore("auth", () => {
const isAuthenticated = ref(false);
const token = ref("");
const userEmail = ref("");
const password = ref("");
const getToken = async () => {
token.value = await login(userEmail.value, password.value);
if (token.value !== "") {
// 로그인 성공시
isAuthenticated.value = true;
} else {
// 로그인 실패
token.value = "";
isAuthenticated.value = false;
}
};
const getLogout = () => {
token.value = "";
isAuthenticated.value = false;
userEmail.value = "";
password.value = "";
};
return { getLogout, getToken, isAuthenticated, token, userEmail, password };
});

로그아웃 버튼을 클릭하면 페이지 이동과 함께 pinia의 auth Store에 있는 [isAuthenticated] 와 [token]을 초기화 하는 코드를 작성하였다.
store의 action으로
두 함수를 정의해, vue 컴포넌트에서 action을 호출해 사용하도록 정의하였다.
로그인의 경우 문제없이 잘 잘동했지만, 로그아웃이 안되는 문제가 발생했다.
로그인/로그아웃 여부에 따라 메인페이지의 요소가 달라지는데, 로그아웃이 안되니 많은 문제가 발생했다.
문제 해결을 위한 시도로 아래와 같은 방법을 시도해보았다.