하관우 하관우 03-24
2025-03-24 하관우 새로고침시 토큰 재발급
@54b9f41c8d0f41732f8d197c223b18b5a1bf2b46
client/views/App.vue
--- client/views/App.vue
+++ client/views/App.vue
@@ -18,7 +18,45 @@
     Header: Header,
     Footer: Footer,
   },
+  async mounted() {
+    // Access Token이 없거나 만료된 경우 새로 발급 요청
+    const token = this.$store.state.authorization; // Vuex 스토어에서 직접 가져오기
+    if (!token) {
+      await this.refreshToken();
+    }
+  },
   methods: {
+    async refreshToken() {
+      try {
+        const res = await apiClient.post("/refresh/tknReissue.json", {}, {
+          headers: {
+            "Content-Type": "application/json; charset=UTF-8",
+          },
+        });
+
+        if (res.status === 200) {
+          // 새로 발급 받은 AccessToken 저장
+          store.commit('setAuthorization', res.headers.authorization);
+          // JWT 토큰 디코딩
+          const base64String = res.headers.authorization.split('.')[1];
+          const base64 = base64String.replace(/-/g, '+').replace(/_/g, '/');
+          const jsonPayload = decodeURIComponent(atob(base64).split('').map(c => {
+            return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2);
+          }).join(''));
+          const mbr = JSON.parse(jsonPayload);
+          store.commit("setUserNm", mbr.userNm); // 사용자 이름 저장
+          store.commit('setRoles', mbr.roles); // 사용자 역할 저장
+        } else {
+          alert('토큰 재발급 요청 실패');
+          this.$router.push('/login.page');
+        }
+      } catch (error) {
+        console.error("Refresh token error:", error);
+        alert('세션이 종료되었습니다.\n로그인을 새로 해주세요.');
+        store.commit("setStoreReset");
+        this.$router.push('/login.page'); // 로그인 페이지로 리다이렉트
+      }
+    },
     scrollToTop() {
       window.scrollTo({
         top: 0,
Add a comment
List