diff --git a/composables/useApi.ts b/composables/useApi.ts index a73e076..8c711ac 100644 --- a/composables/useApi.ts +++ b/composables/useApi.ts @@ -75,11 +75,26 @@ export const useApi = async ( ...(headers && { headers }), }; - return ($api as any)(path, apiOpts).catch((error: any) => { + return ($api as any)(path, apiOpts).catch(async (error: any) => { + const status = error.response?.status; + const message = error.response._data.message; + + if ( + status === 401 && + ["JWT_TOKEN_EXPIRED", "INVALID_CLIENT_IP", "JWT_TOKEN_NULL"].includes( + message + ) + ) { + const userStore = useUserStore(); + userStore.user = null; + userStore.isLoggedIn = false; + await navigateTo(`/auth-error?type=${message}`); + throw error; + } + // 사용자에게 알림 표시 if (showAlert) { - const status = error.response?.status; - let message = + let description = status === 404 ? "요청한 리소스를 찾을 수 없습니다." : status === 500 @@ -88,10 +103,10 @@ export const useApi = async ( // 서버에서 온 에러 메시지가 있으면 우선 사용 if (error.response?._data?.description) { - message = error.response._data.description; + description = error.response._data.description; } - alert(message); + alert(description); } // 에러 처리 방식에 따라 반환 diff --git a/middleware/auth.global.ts b/middleware/auth.global.ts index 5691463..9897b60 100644 --- a/middleware/auth.global.ts +++ b/middleware/auth.global.ts @@ -4,7 +4,7 @@ export default defineNuxtRouteMiddleware(async (to, _from) => { const { hasPagePermission } = usePermission(); // 공개 라우트 목록 (로그인 없이 접근 가능) - const publicRoutes = ["/login", "/register"]; + const publicRoutes = ["/login", "/register", "/auth-error"]; // 공개 라우트인지 확인 const isPublicRoute = publicRoutes.some(route => to.path === route); diff --git a/pages/auth-error.vue b/pages/auth-error.vue new file mode 100644 index 0000000..30ab3f0 --- /dev/null +++ b/pages/auth-error.vue @@ -0,0 +1,176 @@ + + + + + diff --git a/stores/user.ts b/stores/user.ts index 833296d..47f5cc6 100644 --- a/stores/user.ts +++ b/stores/user.ts @@ -54,13 +54,13 @@ export const useUserStore = defineStore( showAlert: false, }); - user.value = null; - isLoggedIn.value = false; + // user.value = null; + // isLoggedIn.value = false; - tabsStore.resetTabs(); - permissionsStore.clearPermissions(); + // tabsStore.resetTabs(); + // permissionsStore.clearPermissions(); - await navigateTo("/login"); + // await navigateTo("/login"); }; return {