hmkim 03-31
250331 김혜민 세션로그인방식 수정
@3e28fa4596109c6964320ff1bc69ae498885de8d
client/views/index.js
--- client/views/index.js
+++ client/views/index.js
@@ -20,6 +20,11 @@
 import '../resources/scss/main.scss';
 
 async function initVueApp() {
+  const savedLoginMode = localStorage.getItem("loginMode");
+  if (savedLoginMode) {
+    store.commit("setLoginMode", savedLoginMode);
+  }
+
   const router = await createAppRouter()
   const vue = createApp(App)
     .use(router)
client/views/layout/UserMenu.vue
--- client/views/layout/UserMenu.vue
+++ client/views/layout/UserMenu.vue
@@ -148,13 +148,11 @@
           roles: this.roles,
           menuType: 'portal',
         };
-        console.log('params', params);
         const res = await findBySysMenu(params);
         if (res.status == 200) {
           this.menuList = res.data.data.menuList;
           // 전체 메뉴 트리 store에 저장
           this.$store.commit('setMenuList', this.menuList);
-          console.log('this.menuList', this.menuList);
           this.fnMenuActive(this.$route.path);
         }
       } catch (error) {
client/views/pages/App.vue
--- client/views/pages/App.vue
+++ client/views/pages/App.vue
@@ -30,7 +30,11 @@
       path: "",
     };
   },
-  created() {},
+  created() { 
+    const loginMode = localStorage.getItem("loginMode");
+  if (loginMode) {
+    this.$store.commit("setLoginMode", loginMode);
+  }},
   methods: {},
   watch: {
     $route(to, from) {
client/views/pages/AppRouter.js
--- client/views/pages/AppRouter.js
+++ client/views/pages/AppRouter.js
@@ -126,8 +126,26 @@
       next({ name: 'notfound' });
       return;
     }
-    // 접근 제어 확인(미확인 시 이전 페이지로 이동)
-    const accesCheck = await accessUrl(to.path);
+
+    // 로그인 모드 확인 (JWT 또는 SESSION)
+    const loginMode = store.state.loginMode || 'J'; // 기본값으로 JWT 설정
+    console.log('loginMode', loginMode)
+    // 로그인 상태 확인 (JWT 또는 SESSION)
+    const isLogin = loginMode === 'J' ? store.state.authorization : store.state.mbrId;
+    if (!isLogin && to.path !== '/login.page') {
+      next({ path: "/login.page" });
+      return;
+    }
+
+    // 접근 제어 확인
+    let accesCheck = false;
+    if (loginMode === 'J') {
+      // JWT 방식 접근 제어
+      accesCheck = await accessUrl(to.path);
+    } else if (loginMode === 'S') {
+      // 세션 방식 접근 제어 (세션이 유효한지 확인)
+      accesCheck = store.state.mbrId != null;
+    }
     console.log('accesCheck', accesCheck);
     const roleCheck = isValidRole();
     if (!accesCheck || !roleCheck) {
@@ -146,10 +164,10 @@
       next();
       return;
     }
-    const isLogin = store.state.authorization; // 토큰 정보 호출(로그인 유무 확인)
     const mbrAuth = store.state.roles.map(auth => auth.authority); // 사용자 권한 정보
     const pageAuth = mergeAuth(mbrAuth, to.meta);
     sessionStorage.setItem("redirect", to.fullPath);
+    
     // 메인 페이지 or 로그인 페이지
     if (to.path === '/' || to.path.includes('/login.page') || to.path.startsWith('/cmmn/') || to.path.includes('/searchId.page') || to.path.includes('/resetPswd.page')) {
       let path = to.path;
@@ -185,7 +203,7 @@
             return false;
           }
         });
-      });
+      }); 
       // 권한이 있고 접근 가능한 경우
       if (hasAcc) {
         if (to.path.includes('.page')) {
client/views/pages/AppStore.js
--- client/views/pages/AppStore.js
+++ client/views/pages/AppStore.js
@@ -66,7 +66,17 @@
         const res = await logOutProc();
         alert(res.data.message);
         if (res.status == 200) {
+           // 1. 상태 초기화
           commit("setStoreReset");
+          // 2. 로컬스토리지와 세션스토리지 초기화
+          localStorage.clear();
+          sessionStorage.clear();
+
+          // 3. 쿠키 삭제
+          document.cookie = "refresh=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;";
+          document.cookie = "Authorization=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;";
+          // 4. 로그인 페이지로 이동
+          window.location = "/login.page";
         }
       } catch(error) {
         const errorData = error.response.data;
client/views/pages/adm/system/LoginPolicy/LoginPolicy.vue
--- client/views/pages/adm/system/LoginPolicy/LoginPolicy.vue
+++ client/views/pages/adm/system/LoginPolicy/LoginPolicy.vue
@@ -16,33 +16,20 @@
               <div class="gd-12 pl0">
                   <label class="form-title">중복로그인 설정</label>
                   <div class="form-group">
-                    <div>
-                      <input type="checkbox" v-model="allowMultipleLogin" @change="saveByLoginPolicy" />
-                      <p>{{ allowMultipleLogin ? '중복 로그인을 허용하고 있습니다.' : '중복 로그인을 허용하지 않습니다.' }}</p>
-                    </div>
+                    <div class="check-area">
+                          <div class="form-check">
+                            <input type="radio" class="mr5" :value="true" v-model="allowMultipleLogin" @change="saveByLoginPolicy" /> 
+                            <label>허용</label>
+                          </div>
+                          <div class="form-check">
+                            <input type="radio" class="mr5" :value="false" v-model="allowMultipleLogin" @change="saveByLoginPolicy" /> 
+                            <label>비허용</label>
+                          </div>
+                      </div>
+                <!--    <p>{{ allowMultipleLogin ? '중복 로그인을 허용하고 있습니다.' : '중복 로그인을 허용하지 않습니다.' }}</p>-->  
                     <span style="color: red;"> ※ 로그인 방식을 변경하면 전체 사용자가 로그아웃됩니다.</span>
                   </div>
               </div>
-              <div>
-                    <label class="form-title">중복로그인 설정</label>
-                    <div class="form-group">
-                      <div>
-                        <input type="checkbox" v-model="allowMultipleLogin" @change="saveByLoginPolicy" />
-                        <p>{{ allowMultipleLogin ? '중복 로그인을 허용하고 있습니다.' : '중복 로그인을 허용하지 않습니다.' }}</p>
-                      </div>
-                      <span style="color: red;"> ※ 로그인 방식을 변경하면 전체 사용자가 로그아웃됩니다.</span>
-                    </div>
-                </div>
-                <div>
-                    <label class="form-title">중복로그인 설정</label>
-                    <div class="form-group">
-                      <div>
-                        <input type="checkbox" v-model="allowMultipleLogin" @change="saveByLoginPolicy" />
-                        <p>{{ allowMultipleLogin ? '중복 로그인을 허용하고 있습니다.' : '중복 로그인을 허용하지 않습니다.' }}</p>
-                      </div>
-                      <span style="color: red;"> ※ 로그인 방식을 변경하면 전체 사용자가 로그아웃됩니다.</span>
-                    </div>
-                </div>
                 <div> 
                     <label class="form-title">로그인 방식 설정</label>
                       <div class="form-group">
@@ -85,50 +72,51 @@
     },
     computed: {
       loginModeLabel() {
-        return this.loginMode === 'J' ? 'JWT' : 'SESSION';
+        return this.lgnMode === 'J' ? 'JWT' : 'SESSION';
       }
     },
     methods: {
-      async findAll() {
-        try {
-          const res1 = await findAllByLoginPolicy();
-          this.allowMultipleLogin = res1.data.data;
+        async findAll() {
+          try {
+            const res1 = await findAllByLoginPolicy();
+            this.allowMultipleLogin = res1.data.data;
 
-          const res2 = await findAllByLoginMode();
-          this.lgnMode = res2.data.data;
-          
-        } catch (err) {
-          alert('설정 정보를 불러오는 데 실패했습니다.');
-        }
+            const res2 = await findAllByLoginMode();
+            this.lgnMode = res2.data.data;
+            
+          } catch (err) {
+            alert('설정 정보를 불러오는 데 실패했습니다.');
+          }
+        },
+        saveByLoginPolicy() {
+          try {
+            console.log("this.allowMultipleLogin", this.allowMultipleLogin);
+            const loginPolicy = {};
+            loginPolicy.allowMultipleLogin = this.allowMultipleLogin ? "Y" : "N";
+      //      await saveByLoginPolicy(loginPolicy);
+            alert('중복 로그인 설정이 저장되었습니다.');
+          } catch (err) {
+            alert('중복 로그인 설정 저장 실패');
+          }
       },
-      async saveByLoginPolicy() {
-      try {
-        const loginPolicy = {};
-        loginPolicy.allowMultipleLogin = this.allowMultipleLogin ? "Y" : "N";
-  //      await saveByLoginPolicy(loginPolicy);
-        alert('중복 로그인 설정이 저장되었습니다.');
-      } catch (err) {
-        alert('중복 로그인 설정 저장 실패');
-      }
-    },
-    async saveByLoginMode() {
-      const confirmed = confirm(
-        '로그인 방식을 변경하면 전체 사용자가 로그아웃됩니다.\n계속하시겠습니까?'
-      );
-      if (!confirmed) return;
+      saveByLoginMode() {
+        const confirmed = confirm(
+          '로그인 방식을 변경하면 전체 사용자가 로그아웃됩니다.\n계속하시겠습니까?'
+        );
+        if (!confirmed) return;
 
-      try {
-        const loginMode = {};
-        loginMode.lgnMode = this.lgnMode;
- //       await saveByLoginMode(loginMode);
-        alert('로그인 방식이 변경되었습니다.\n다시 로그인해주세요.');
-        store.commit("setStoreReset");
-        window.location = '/login.page';
-        return Promise.reject(refreshError);
-      } catch (err) {
-        alert('로그인 방식 저장 실패', err);
+        try {
+          const loginMode = {};
+          loginMode.lgnMode = this.lgnMode;
+  //       await saveByLoginMode(loginMode);
+          alert('로그인 방식이 변경되었습니다.\n다시 로그인해주세요.');
+          store.commit("setStoreReset");
+          window.location = '/login.page';
+          return Promise.reject(refreshError);
+        } catch (err) {
+          alert('로그인 방식 저장 실패', err);
+        }
       }
-    }
     }
   }
   </script>
(파일 끝에 줄바꿈 문자 없음)
client/views/pages/login/Login.vue
--- client/views/pages/login/Login.vue
+++ client/views/pages/login/Login.vue
@@ -107,6 +107,7 @@
           if (loginType === 'J') {
               // JWT 방식
               store.commit("setAuthorization", res.headers.authorization);
+              store.commit("setLoginMode", "J");
               const base64String = store.state.authorization.split(".")[1];
               const base64 = base64String.replace(/-/g, "+").replace(/_/g, "/");
               const jsonPayload = decodeURIComponent(
@@ -120,6 +121,7 @@
               store.commit("setRoles", mbr.roles);
           } else if (loginType === 'S') {
               // 세션 방식 (서버에서 따로 body에 사용자 정보 내려줘야 함)
+              store.commit("setLoginMode", "S");
               const mbr = res.data;
               store.commit("setAuthorization", null);
               store.commit("setMbrId", mbr.mbrId);
@@ -139,6 +141,8 @@
           } else {
             this.$router.push({ path: "/" });
           }
+
+          
         }
       } catch (error) {
         alert(error.response.data.message);
Add a comment
List