hmkim 06-13
250613 김혜민 컬럼 행안부표준화 변경
@f46fb28acb970c5b81ebfb75d8df19d98920d4fa
client/resources/api/loginPolicy.js
--- client/resources/api/loginPolicy.js
+++ client/resources/api/loginPolicy.js
@@ -32,6 +32,11 @@
     return apiClient.post(`/admin/loginPolicy/saveStorageMode.json`, storageMode);
 }
 
+// 전체 사용자 로그아웃 API 추가
+export const logoutAllUsers = () => {
+    return apiClient.post(`/mbr/logoutAll.json`);
+}
+
 /** 초기 세팅용 */
 export const getLoginMode = () => {
     return apiClient.post(`/sys/loginPolicy/getLoginMode.json`);
client/resources/js/defaultMenuSatisfactionParams.js
--- client/resources/js/defaultMenuSatisfactionParams.js
+++ client/resources/js/defaultMenuSatisfactionParams.js
@@ -1,11 +1,11 @@
 // 관리자 정보 객체
 const defaultMenuDgstfnParams = {
   menuId: '',
-  rspnsFive: 'N',
-  rspnsFour: 'N',
-  rspnsThree: 'N',
-  rspnsTwo: 'N',
-  rspnsOne: 'N',
+  rspns5: 'N',
+  rspns4: 'N',
+  rspns3: 'N',
+  rspns2: 'N',
+  rspns1: 'N',
   opnn: '',
 };
 
client/views/layout/AdminHeader.vue
--- client/views/layout/AdminHeader.vue
+++ client/views/layout/AdminHeader.vue
@@ -83,7 +83,7 @@
                 }
 
                 // if (route.meta.typeId.includes("BBS_MNG")) {
-                //     const matchedMenu = store.state.flatMenuList.find(menu => menu.menuTypeCtgry === route.meta.typeId);
+                //     const matchedMenu = store.state.flatMenuList.find(menu => menu.menuTypeArtcl === route.meta.typeId);
                 //     if (matchedMenu) {
                 //         return matchedMenu.menuNm;
                 //     }
client/views/layout/menuSatisfaction.vue
--- client/views/layout/menuSatisfaction.vue
+++ client/views/layout/menuSatisfaction.vue
@@ -6,27 +6,27 @@
                     <label class="form-title">{{ pgNm }} 만족도 조사</label>
                     <div class="check-area">
                         <div class="form-check">
-                            <input type="radio" name="rspns" id="rspnsFive" class="mr5" v-model="checkRspns"
+                            <input type="radio" name="rspns" id="rspns5" class="mr5" v-model="checkRspns"
                                 value="5" />
-                            <label for="rspnsFive">매우 만족</label>
+                            <label for="rspns5">매우 만족</label>
                         </div>
                         <div class="form-check">
-                            <input type="radio" name="rspns" id="rspnsFour" class="mr5" v-model="checkRspns"
+                            <input type="radio" name="rspns" id="rspns4" class="mr5" v-model="checkRspns"
                                 value="4" />
-                            <label for="rspnsFour">만족</label>
+                            <label for="rspns4">만족</label>
                         </div>
                         <div class="form-check">
-                            <input type="radio" name="rspns" id="rspnsThree" class="mr5" v-model="checkRspns"
+                            <input type="radio" name="rspns" id="rspns3" class="mr5" v-model="checkRspns"
                                 value="3" />
-                            <label for="rspnsThree">보통</label>
+                            <label for="rspns3">보통</label>
                         </div>
                         <div class="form-check">
-                            <input type="radio" name="rspns" id="rspnsTwo" class="mr5" v-model="checkRspns" value="2" />
-                            <label for="rspnsTwo">불만족</label>
+                            <input type="radio" name="rspns" id="rspns2" class="mr5" v-model="checkRspns" value="2" />
+                            <label for="rspns2">불만족</label>
                         </div>
                         <div class="form-check">
-                            <input type="radio" name="rspns" id="rspnsOne" class="mr5" v-model="checkRspns" value="1" />
-                            <label for="rspnsOne">매우 불만족</label>
+                            <input type="radio" name="rspns" id="rspns1" class="mr5" v-model="checkRspns" value="1" />
+                            <label for="rspns1">매우 불만족</label>
                         </div>
                     </div>
                 </div>
@@ -135,11 +135,11 @@
                 }
             }
             const rspnsVal = this.checkRspns;
-            this.menuDgstfn.rspnsFive = rspnsVal === '5' ? 'Y' : 'N';
-            this.menuDgstfn.rspnsFour = rspnsVal === '4' ? 'Y' : 'N';
-            this.menuDgstfn.rspnsThree = rspnsVal === '3' ? 'Y' : 'N';
-            this.menuDgstfn.rspnsTwo = rspnsVal === '2' ? 'Y' : 'N';
-            this.menuDgstfn.rspnsOne = rspnsVal === '1' ? 'Y' : 'N';
+            this.menuDgstfn.rspns5 = rspnsVal === '5' ? 'Y' : 'N';
+            this.menuDgstfn.rspns4 = rspnsVal === '4' ? 'Y' : 'N';
+            this.menuDgstfn.rspns3 = rspnsVal === '3' ? 'Y' : 'N';
+            this.menuDgstfn.rspns2 = rspnsVal === '2' ? 'Y' : 'N';
+            this.menuDgstfn.rspns1 = rspnsVal === '1' ? 'Y' : 'N';
             return true;
         }
 
client/views/pages/AppRouter.js
--- client/views/pages/AppRouter.js
+++ client/views/pages/AppRouter.js
@@ -57,10 +57,10 @@
     const res = await findAll();
     if (res.status == 200) {
       const newRoutes = res.data.data.map(route => ({
-        path: route.pageCrs,
+        path: route.userPagePath,
         name: route.contsEngNm,
         korName: route.contsKornNm,
-        component: () => import(`${route.compnCrs}`),
+        component: () => import(`${route.compnPath}`),
         meta: { authrt: route.authrtList, typeId: route.contsId, korName: route.contsKornNm }
       }));
       return newRoutes;
client/views/pages/adm/boardManagement/boardManagement/BoardManagementInsert.vue
--- client/views/pages/adm/boardManagement/boardManagement/BoardManagementInsert.vue
+++ client/views/pages/adm/boardManagement/boardManagement/BoardManagementInsert.vue
@@ -15,7 +15,7 @@
                         </div>
                         <div class="layout">
                             <label class="form-title">게시판 상단 정보</label>
-                            <input type="text" class="form-control sm" v-model="bbsMng.bbsUpInfo"
+                            <input type="text" class="form-control sm" v-model="bbsMng.bbsUpendInfo"
                                 placeholder="게시판 상단에 표기될 정보를 입력해주세요." />
                         </div>
                         <div class="layout">
@@ -41,7 +41,7 @@
                         </div>
                         <div class="layout">
                             <label class="form-title"><span>*</span>페이지 유형</label>
-                            <select name="" id="" class="form-select sm" v-model="bbsMng.cd">
+                            <select name="" id="" class="form-select sm" v-model="bbsMng.pageType">
                                 <option :value="null" disabled>선택하세요</option>
                                 <option v-for="(item, idx) in pageTypeList" :value="item.cd" :key="idx">
                                     {{ item.cdNm }}
@@ -346,7 +346,7 @@
                 alert("목록 개수는 1 이상을 입력하세요.");
                 return false;
             }
-            if (this.bbsMng.cd == null || this.bbsMng.cd == "") {
+            if (this.bbsMng.pageType == null || this.bbsMng.pageType == "") {
                 alert("페이지 유형을 선택하세요.");
                 return false;
             }
client/views/pages/adm/boardManagement/boardManagement/BoardManagementSelectListOne.vue
--- client/views/pages/adm/boardManagement/boardManagement/BoardManagementSelectListOne.vue
+++ client/views/pages/adm/boardManagement/boardManagement/BoardManagementSelectListOne.vue
@@ -21,11 +21,11 @@
               </div>
               <div class="layout">
                 <p class="form-title">게시판 상단 정보</p>
-                <p>{{bbsMng.bbsUpInfo}}</p>
+                <p>{{bbsMng.bbsUpendInfo}}</p>
                 <!-- <input
                   type="text"
                   class="full-input"
-                  v-model="bbsMng.bbsUpInfo"
+                  v-model="bbsMng.bbsUpendInfo"
                   disabled
                 /> -->
               </div>
@@ -78,7 +78,7 @@
                   name=""
                   id=""
                   class="full-select"
-                  v-model="bbsMng.cd"
+                  v-model="bbsMng.pageType"
                   disabled
                 >
                   <option :value="null" disabled>선택해주세요</option>
@@ -378,8 +378,8 @@
   watch: {},
   computed: {
     pageTypeName() {
-      const match = this.pageTypeList.find(item => item.cd === this.bbsMng.cd);
-      return match ? match.cdNm : this.bbsMng.cd;
+      const match = this.pageTypeList.find(item => item.cd === this.bbsMng.pageType);
+      return match ? match.cdNm : this.bbsMng.pageType;
     }
   },
   components: {},
client/views/pages/adm/boardManagement/wordsManagement/WordsManagementSelectList.vue
--- client/views/pages/adm/boardManagement/wordsManagement/WordsManagementSelectList.vue
+++ client/views/pages/adm/boardManagement/wordsManagement/WordsManagementSelectList.vue
@@ -177,11 +177,11 @@
         },
         // 삭제할 워드 선택
         handleSelect(row, idx) {
-            let cntrlNmId = this.list[idx]["cntrlNmId"];
-            if (this.delWords.includes(cntrlNmId)) {
-                this.delWords = this.delWords.filter((word) => word !== cntrlNmId);
+            let phwrdId = this.list[idx]["phwrdId"];
+            if (this.delWords.includes(phwrdId)) {
+                this.delWords = this.delWords.filter((word) => word !== phwrdId);
             } else {
-                this.delWords.push(cntrlNmId);
+                this.delWords.push(phwrdId);
             }
         },
         // 삭제 버튼 로직
@@ -228,7 +228,7 @@
             this.tbody = this.list.map((word, idx) => ({
                 // id: this.getNotice(bbsMng, idx), // 번호
                 id: this.listCnt - idx - (this.search.currentPage - 1) * this.search.recordSize, // 번호
-                bbsNm: word.cntrlNm, // 제목
+                bbsNm: word.phwrd, // 제목
                 wrtrNm: word.rgtrNm, // 작성자
                 wrtDt: word.regDt, // 작성일
             }));
client/views/pages/adm/log/LoginLog.vue
--- client/views/pages/adm/log/LoginLog.vue
+++ client/views/pages/adm/log/LoginLog.vue
@@ -139,7 +139,7 @@
             : null,
         lgnId: lgnHstry.lgnId,
         cntnIp: lgnHstry.cntnIp,
-        cntnOperSys: lgnHstry.cntnOperSys,
+        cntnOperSysm: lgnHstry.cntnOperSysm,
       }));
     },
 
client/views/pages/adm/main/Main.vue
--- client/views/pages/adm/main/Main.vue
+++ client/views/pages/adm/main/Main.vue
@@ -201,7 +201,7 @@
           let newData = {};
           newData["date"] = data["dates"];
           for (let i = 0; i < data["authrt_nm"].length; i++) {
-            newData[data["authrt_nm"][i]] = data["cntn_nope"][i];
+            newData[data["authrt_nm"][i]] = data["acsr_cnt"][i];
           }
           datas.push(newData);
         }
@@ -266,7 +266,7 @@
       let depth1 = this.findMenu(this.menuList, "MENU_000000000000010");
       this.$store.commit("setMenu", depth1);
       for (let menu of depth1.childList) {
-        if (menu.menuTypeCtgry == this.bbsCnList[idx]["id"]) {
+        if (menu.menuTypeArtcl == this.bbsCnList[idx]["id"]) {
           await this.cntnStatsSave(menu.menuId);
         }
       }
client/views/pages/adm/member/userManagement/UserManagementSelectList.vue
--- client/views/pages/adm/member/userManagement/UserManagementSelectList.vue
+++ client/views/pages/adm/member/userManagement/UserManagementSelectList.vue
@@ -137,7 +137,7 @@
         inqTrprId: null,
         inqRsn: null,
         inqIp: null,
-        rdr: null,
+        inqpr: null,
         inqDt: null,
       },
     };
@@ -226,7 +226,7 @@
         inqTrprId: null,
         inqRsn: null,
         inqIp: null,
-        rdr: null,
+        inqpr: null,
         inqDt: null,
       };
     },
client/views/pages/adm/menuManagement/menuManagement/MenuManagement.vue
--- client/views/pages/adm/menuManagement/menuManagement/MenuManagement.vue
+++ client/views/pages/adm/menuManagement/menuManagement/MenuManagement.vue
@@ -53,7 +53,7 @@
                     <template v-if="viewMenu.menuType == 'bbs' ||
                       viewMenu.menuType == 'conts'
                       ">
-                      <select class="form-select sm" ref="menuTypeCtgry" v-model="viewMenu.menuTypeCtgry"
+                      <select class="form-select sm" ref="menuTypeArtcl" v-model="viewMenu.menuTypeArtcl"
                         :disabled="!editMode || viewMenu.sysPvsnYn == 0">
                         <option value="">선택</option>
                         <option v-for="(ctgry, index) of ctgryList" :key="index" :value="ctgry.id">
@@ -209,11 +209,11 @@
       newMenu: {}, // 신규 메뉴
       viewMenu: {
         menuType: "",
-        menuTypeCtgry: "",
+        menuTypeArtcl: "",
       }, // 사용자에게 보여질 메뉴 목록
       originMenu: {
         menuType: "",
-        menuTypeCtgry: "",
+        menuTypeArtcl: "",
       }, // 변경 전 메뉴 목록
 
       selectedMenuId: null, // 선택된 메뉴
@@ -243,12 +243,12 @@
       let data = cloneDeep(this.viewMenu);
       if (data["menuType"] == "") {
         data.menuType = "";
-        data.menuTypeCtgry = "";
+        data.menuTypeArtcl = "";
         data.linkUrl = "";
       } else if (data["menuType"] == "bbs" || data["menuType"] == "conts") {
         data["linkUrl"] == null;
       } else if (data["menuType"] == "link") {
-        data["menuTypeCtgry"] == null;
+        data["menuTypeArtcl"] == null;
       }
       if (this.selectedMenuId == null) {
         this.axiosInsert(data);
@@ -346,9 +346,9 @@
       // }
       // 메뉴 타입 하위 입력 여부
       if (this.viewMenu["menuType"] == "bbs" || this.viewMenu["menuType"] == "conts") {
-        if (!this.viewMenu["menuTypeCtgry"]) {
+        if (!this.viewMenu["menuTypeArtcl"]) {
           alert("메뉴 타입 항목을 선택하세요.");
-          this.$refs.menuTypeCtgry.focus();
+          this.$refs.menuTypeArtcl.focus();
           return false;
         }
       } else if (this.viewMenu["menuType"] == "link") {
@@ -414,7 +414,7 @@
           this.newMenu.dgstfnExmnUseYn = "Y"; // 만족도 조사 사용 여부
           this.newMenu.menuExpsrYn = "Y"; // 메뉴 노출 여부
           this.newMenu.menuType = "";
-          this.newMenu.menuTypeCtgry = "";
+          this.newMenu.menuTypeArtcl = "";
           this.newMenu.linkUrl = "";
           this.newMenu.menuUser = "A"
         }
@@ -598,7 +598,7 @@
       const menuType = this.viewMenu["menuType"];
       // 초기화
       this.ctgryList = [];
-      this.viewMenu["menuTypeCtgry"] == "";
+      this.viewMenu["menuTypeArtcl"] == "";
       this.viewMenu["linkUrl"] == null;
       this.originMenu = cloneDeep(this.viewMenu);
       // 데이터 삽입
client/views/pages/adm/menuManagement/menuSatisfactionManagement/MenuSatisfactionSelectList.vue
--- client/views/pages/adm/menuManagement/menuSatisfactionManagement/MenuSatisfactionSelectList.vue
+++ client/views/pages/adm/menuManagement/menuSatisfactionManagement/MenuSatisfactionSelectList.vue
@@ -149,11 +149,11 @@
       this.tbody = this.menuList.map((menu) => ({
         menuNm: menu.menuNm, // 메뉴명
         rspnsTotCnt: menu.rspnsTotCnt, // 응답 총 개수
-        rspnsFiveCnt: menu.rspnsFiveCnt, // 매우만족
-        rspnsFourCnt: menu.rspnsFourCnt, // 만족
-        rspnsThreeCnt: menu.rspnsThreeCnt, // 보통
-        rspnsTwoCnt: menu.rspnsTwoCnt, // 불만족
-        rspnsOneCnt: menu.rspnsOneCnt, // 매우불만족
+        rspns5Cnt: menu.rspns5Cnt, // 매우만족
+        rspns4Cnt: menu.rspns4Cnt, // 만족
+        rspns3Cnt: menu.rspns3Cnt, // 보통
+        rspns2Cnt: menu.rspns2Cnt, // 불만족
+        rspns1Cnt: menu.rspns1Cnt, // 매우불만족
         avrgRspnsScore: menu.avrgRspnsScore, // 점수 평균
       }));
     },
@@ -164,11 +164,11 @@
       this.stfndgTbody = this.menuStfndgList.map((menuStfndg, idx) => ({
         no: idx + (this.menuStfndgList.length - (2 * idx)), // 번호
         // regIp: menuStfndg.regIp, // 등록IP
-        rspnsFive: menuStfndg.rspnsFive, // 매우만족
-        rspnsFour: menuStfndg.rspnsFour, // 만족
-        rspnsThree: menuStfndg.rspnsThree, // 보통
-        rspnsTwo: menuStfndg.rspnsTwo, // 불만족
-        rspnsOne: menuStfndg.rspnsOne, // 매우불만족
+        rspns5: menuStfndg.rspns5, // 매우만족
+        rspns4: menuStfndg.rspns4, // 만족
+        rspns3: menuStfndg.rspns3, // 보통
+        rspns2: menuStfndg.rspns2, // 불만족
+        rspns1: menuStfndg.rspns1, // 매우불만족
         opnn: menuStfndg.opnn, // 의견
       }));
     },
client/views/pages/adm/preferences/contentTypeManagement/ContentTypeManagementInsert.vue
--- client/views/pages/adm/preferences/contentTypeManagement/ContentTypeManagementInsert.vue
+++ client/views/pages/adm/preferences/contentTypeManagement/ContentTypeManagementInsert.vue
@@ -40,8 +40,8 @@
                   <input
                     type="text"
                     class="form-control sm"
-                    v-model="contsTypeVO.mngrPageCrs"
-                    ref="mngrPageCrs"
+                    v-model="contsTypeVO.mngrPagePath"
+                    ref="mngrPagePath"
                     placeholder="관리자 path를 입력하세요."
                   />
                   <span><strong>관리자 PATH</strong> 또는 <strong>사용자 PATH</strong> 중 하나는 필수입니다.</span>
@@ -54,8 +54,8 @@
                 <input
                   type="text"
                   class="form-control sm"
-                  v-model="contsTypeVO.pageCrs"
-                  ref="pageCrs"
+                  v-model="contsTypeVO.userPagePath"
+                  ref="userPagePath"
                   placeholder="사용자 path를 입력하세요."
                 />
               </div>
@@ -66,8 +66,8 @@
                 <input
                   type="text"
                   class="form-control sm"
-                  v-model="contsTypeVO.compnCrs"
-                  ref="compnCrs"
+                  v-model="contsTypeVO.compnPath"
+                  ref="compnPath"
                   placeholder="COMPONENT URL을 입력하세요."
                 />
               </div>
@@ -212,50 +212,50 @@
       this.contsTypeVO.contsEngNm = contsEngNm;
 
       // 관리자 PATH 혹은 사용자 PATH 중 최소 1개 이상 작성 여부
-      let mngrPageCrs = this.contsTypeVO.mngrPageCrs?.trim();
-      let pageCrs = this.contsTypeVO.pageCrs?.trim();
-      if (this.isEmpty(mngrPageCrs) && this.isEmpty(pageCrs)) {
+      let mngrPagePath = this.contsTypeVO.mngrPagePath?.trim();
+      let userPagePath = this.contsTypeVO.userPagePath?.trim();
+      if (this.isEmpty(mngrPagePath) && this.isEmpty(userPagePath)) {
         alert("관리자 PATH 혹은 사용자 PATH를 입력하세요.");
         return false;
       }
-      this.contsTypeVO.mngrPageCrs = mngrPageCrs;
-      this.contsTypeVO.pageCrs = pageCrs;
+      this.contsTypeVO.mngrPagePath = mngrPagePath;
+      this.contsTypeVO.userPagePath = userPagePath;
 
       const pageCrsRegex = /^\/(?:[a-zA-Z0-9_\-]+\/)*[a-zA-Z0-9_\-]+\.[a-zA-Z0-9]+$/;
       const notFound = '/cmmn/notfound.page';
-      if (!this.isEmpty(mngrPageCrs)) {
-        if (!pageCrsRegex.test(this.contsTypeVO.mngrPageCrs)) {
+      if (!this.isEmpty(mngrPagePath)) {
+        if (!pageCrsRegex.test(this.contsTypeVO.mngrPagePath)) {
           alert("관리자 PATH는 /로 시작하고, 마지막에 확장자가 포함되어야 합니다.");
-          this.$refs.mngrPageCrs.focus();
+          this.$refs.mngrPagePath.focus();
           return false;
         }
-        if(this.contsTypeVO.mngrPageCrs.toLowerCase() == notFound) {
+        if(this.contsTypeVO.mngrPagePath.toLowerCase() == notFound) {
           alert("사용할 수 없는 경로입니다.");
-          this.$refs.mngrPageCrs.focus();
+          this.$refs.mngrPagePath.focus();
           return false;
         }
       }
-      if (!this.isEmpty(pageCrs)) {
-        if (!pageCrsRegex.test(this.contsTypeVO.pageCrs)) {
+      if (!this.isEmpty(userPagePath)) {
+        if (!pageCrsRegex.test(this.contsTypeVO.userPagePath)) {
           alert("사용자 PATH는 /로 시작하고, 마지막에 확장자가 포함되어야 합니다.");
-          this.$refs.pageCrs.focus();
+          this.$refs.userPagePath.focus();
           return false;
         }
-        if(this.contsTypeVO.pageCrs.toLowerCase() == notFound) {
+        if(this.contsTypeVO.userPagePath.toLowerCase() == notFound) {
           alert("사용할 수 없는 경로입니다.");
-          this.$refs.pageCrs.focus();
+          this.$refs.userPagePath.focus();
           return false;
         }
       }
 
       // COMPONENT_URL
-      let compnCrs = this.contsTypeVO.compnCrs?.trim();
-      if (this.isEmpty(compnCrs)) {
+      let compnPath = this.contsTypeVO.compnPath?.trim();
+      if (this.isEmpty(compnPath)) {
         alert("COMPONENT_URL을 입력하세요.");
-        this.$refs.compnCrs.focus();
+        this.$refs.compnPath.focus();
         return false;
       }
-      this.contsTypeVO.compnCrs = compnCrs;
+      this.contsTypeVO.compnPath = compnPath;
 
       // 메뉴노출
       if (this.isEmpty(this.contsTypeVO.expsrYn)) {
client/views/pages/adm/preferences/contentTypeManagement/ContentTypeManagementSelectListOne.vue
--- client/views/pages/adm/preferences/contentTypeManagement/ContentTypeManagementSelectListOne.vue
+++ client/views/pages/adm/preferences/contentTypeManagement/ContentTypeManagementSelectListOne.vue
@@ -29,31 +29,31 @@
             </div>
             <div class="layout">
               <p class="form-title">관리자 PATH</p>
-              <p>{{ contsTypeVO.mngrPageCrs }}</p>
+              <p>{{ contsTypeVO.mngrPagePath }}</p>
               <!-- <input
                 type="text"
                 class="full-input"
-                v-model="contsTypeVO.mngrPageCrs"
+                v-model="contsTypeVO.mngrPagePath"
                 disabled
               /> -->
             </div>
             <div  class="layout">
               <p class="form-title">사용자 PATH</p>
-              <p>{{ contsTypeVO.pageCrs }}</p>
+              <p>{{ contsTypeVO.userPagePath }}</p>
               <!-- <input
                 type="text"
                 class="full-input"
-                v-model="contsTypeVO.pageCrs"
+                v-model="contsTypeVO.userPagePath"
                 disabled
               /> -->
             </div>
             <div  class="layout">
               <p class="form-title">COMPONENT_URL</p>
-              <p>{{ contsTypeVO.compnCrs }}</p>
+              <p>{{ contsTypeVO.compnPath }}</p>
               <!-- <input
                 type="text"
                 class="full-input"
-                v-model="contsTypeVO.compnCrs"
+                v-model="contsTypeVO.compnPath"
                 disabled
               /> -->
             </div>
client/views/pages/adm/statistics/BbsStatistics.vue
--- client/views/pages/adm/statistics/BbsStatistics.vue
+++ client/views/pages/adm/statistics/BbsStatistics.vue
@@ -173,7 +173,7 @@
             newData["menu"] = data["bbs_nm"];
             this.authrtNmList = data["authrt_nm"];
             for (let i = 0; i < data["authrt_nm"].length; i++) {
-              newData[data["authrt_nm"][i]] = data["cntn_nope"][i];
+              newData[data["authrt_nm"][i]] = data["acsr_cnt"][i];
             }
             datas.push(newData);
           }
client/views/pages/adm/statistics/MenuStatistics.vue
--- client/views/pages/adm/statistics/MenuStatistics.vue
+++ client/views/pages/adm/statistics/MenuStatistics.vue
@@ -174,7 +174,7 @@
           newData["menu"] = data["menu_name"];
           this.authrtNmList = data["authrt_nm"];
           for (let i = 0; i < data["authrt_nm"].length; i++) {
-            newData[data["authrt_nm"][i]] = data["cntn_nope"][i];
+            newData[data["authrt_nm"][i]] = data["acsr_cnt"][i];
           }
           datas.push(newData);
         }
client/views/pages/adm/statistics/UserStatistics.vue
--- client/views/pages/adm/statistics/UserStatistics.vue
+++ client/views/pages/adm/statistics/UserStatistics.vue
@@ -162,7 +162,7 @@
           newData["date"] = data["dates"];
           this.authrtNmList = data["authrt_nm"];
           for (let i = 0; i < data["authrt_nm"].length; i++) {
-            newData[data["authrt_nm"][i]] = data["cntn_nope"][i];
+            newData[data["authrt_nm"][i]] = data["acsr_cnt"][i];
           }
           datas.push(newData);
         }
client/views/pages/adm/system/LoginPolicy/LoginPolicy.vue
--- client/views/pages/adm/system/LoginPolicy/LoginPolicy.vue
+++ client/views/pages/adm/system/LoginPolicy/LoginPolicy.vue
@@ -5,7 +5,7 @@
         <div open class="form-box">
           <div class="form-box-title">
             <p>기본정보</p>
-            <p><span>*</span>로그인 정책을 변경하면 전체 사용자가 로그아웃됩니다.</p>
+            <p><span>*</span>시스템 정책을 변경하면 전체 사용자가 로그아웃됩니다.</p>
           </div>
           <div class="form-content">
             <div class="layout">
@@ -23,7 +23,6 @@
                     <label for="allowMultipleLoginN">비허용</label>
                   </div>
                 </div>
-                <!--    <p>{{ allowMultipleLogin ? '중복 로그인을 허용하고 있습니다.' : '중복 로그인을 허용하지 않습니다.' }}</p>-->
               </div>
             </div>
             <div class="layout border-bottom">
@@ -41,9 +40,6 @@
                     <label for="loginModeS">SESSION 방식</label>
                   </div>
                 </div>
-                <!-- <span class="ml10 gray">
-                  현재 로그인 방식은 <strong>{{ loginModeLabel }}</strong> 입니다.
-                </span> -->
               </div>
             </div>
             <div class="layout">
@@ -51,19 +47,16 @@
               <div class="form-group">
                 <div class="check-area">
                   <div class="form-check">
-                    <input type="radio" id="storageModeL" class="mr5" value="L" v-model="strgMode"
+                    <input type="radio" id="storageModeL" class="mr5" value="L" v-model="strgMth"
                       @change="saveByStorageMode" />
                     <label for="storageModeL">LOCAL 방식</label>
                   </div>
                   <div class="form-check">
-                    <input type="radio" id="storageModeS" class="mr5" value="S" v-model="strgMode"
+                    <input type="radio" id="storageModeS" class="mr5" value="S" v-model="strgMth"
                       @change="saveByStorageMode" />
                     <label for="storageModeS">SESSION 방식</label>
                   </div>
                 </div>
-                <!-- <span class="ml10 gray">
-                  현재 로그인 방식은 <strong>{{ loginModeLabel }}</strong> 입니다.
-                </span> -->
               </div>
             </div>
             <div class="layout">
@@ -81,7 +74,6 @@
                     <label for="use2ndAuthN">미사용</label>
                   </div>
                 </div>
-                <!--    <p>{{ allowMultipleLogin ? '중복 로그인을 허용하고 있습니다.' : '중복 로그인을 허용하지 않습니다.' }}</p>-->
               </div>
             </div>
             <div class="layout">
@@ -106,9 +98,19 @@
 </template>
 
 <script>
-import { findAllByLoginPolicy, saveByLoginPolicy, findAllByLoginMode, saveByLoginMode, findAllBy2ndAuth, saveBy2ndAuth, findAllByStorageMode, saveByStorageMode } from '../../../../../resources/api/loginPolicy.js';
+import { 
+  findAllByLoginPolicy, 
+  saveByLoginPolicy, 
+  findAllByLoginMode, 
+  saveByLoginMode, 
+  findAllBy2ndAuth, 
+  saveBy2ndAuth, 
+  findAllByStorageMode, 
+  saveByStorageMode
+} from '../../../../../resources/api/loginPolicy.js';
 import { getCntxtPth, saveCntxtPth } from '../../../../../resources/api/cntxtPth';
 import { cacheReSet } from "../../../../../resources/api/cacheReSet";
+
 export default {
   data() {
     return {
@@ -133,23 +135,21 @@
   },
   mounted() {
   },
-  computed: {
-    // loginModeLabel() {
-    //   return this.lgnMode === 'J' ? 'JWT' : 'SESSION';
-    // }
-  },
   methods: {
     async findAll() {
       try {
         const res1 = await findAllByLoginPolicy();
         this.allowMultipleLogin = res1.data.data === true ? 'Y' : 'N';
         this.previousAllowMultipleLogin = this.allowMultipleLogin;
+        
         const res2 = await findAllByLoginMode();
         this.lgnMode = res2.data.data;
         this.previousLgnMode = this.lgnMode; // 초기 상태를 저장
+        
         const res3 = await findAllBy2ndAuth();
         this.use2ndAuth = res3.data.data === true ? 'Y' : 'N';
         this.previousUse2ndAuth = this.use2ndAuth; // 초기 상태를 저장
+        
         const res4 = await findAllByStorageMode();
         this.strgMode = res4.data.data;
         this.previousStrgMode = this.strgMode; // 초기 상태를 저장
@@ -157,6 +157,8 @@
         alert('설정 정보를 불러오는 데 실패했습니다.');
       }
     },
+
+    // 중복로그인 설정 저장 - 개선된 버전
     async saveByLoginPolicy() {
       const confirmed = confirm(
         '로그인 설정을 변경하면 전체 사용자가 로그아웃됩니다.\n계속하시겠습니까?'
@@ -168,16 +170,24 @@
 
       try {
         const loginPolicy = {};
-        loginPolicy.allowMultipleLogin = this.allowMultipleLogin;
+        loginPolicy.mltLgnPrmYn = this.allowMultipleLogin;
         await saveByLoginPolicy(loginPolicy);
+        
+        // 전체 사용자 로그아웃 API 호출
+        await this.performGlobalLogout();
+        
         alert('중복 로그인 설정이 저장되었습니다.');
-        this.$store.commit("setStoreReset");
-        window.location = this.$filters.ctxPath('/cmslogin.page');
+        
+        // 완전한 정리 후 로그인 페이지로 이동
+        await this.performCompleteCleanupAndRedirect();
+        
       } catch (err) {
-        alert('중복 로그인 설정 저장 실패'+ (err.response?.data?.message || err.message));
+        alert('중복 로그인 설정 저장 실패: ' + (err.response?.data?.message || err.message));
         this.allowMultipleLogin = this.previousAllowMultipleLogin;
       }
     },
+
+    // 로그인 방식 저장 - 개선된 버전
     async saveByLoginMode() {
       const confirmed = confirm(
         '로그인 방식을 변경하면 전체 사용자가 로그아웃됩니다.\n계속하시겠습니까?'
@@ -191,23 +201,38 @@
         const loginMode = {};
         loginMode.lgnMode = this.lgnMode;
         await saveByLoginMode(loginMode);
+        
+        // 전체 사용자 로그아웃 API 호출
+        await this.performGlobalLogout();  
+        
         alert('로그인 방식이 변경되었습니다.\n다시 로그인해주세요.');
-        this.$store.commit("setStoreReset");
-        window.location = this.$filters.ctxPath('/cmslogin.page');
+        
+        // 완전한 정리 후 로그인 페이지로 이동
+        await this.performCompleteCleanupAndRedirect();
+        
       } catch (err) {
         alert('로그인 방식 저장 실패: ' + (err.response?.data?.message || err.message));
         this.lgnMode = this.previousLgnMode;
       }
     },
 
-    // 최신 Context Path 조회
-    async findCntxtPth() {
+    // 스토리지 방식 저장 - 개선된 버전
+    async saveByStorageMode() {
+      const confirmed = confirm(
+        '스토리지 방식을 변경하면 전체 사용자가 로그아웃됩니다.\n계속하시겠습니까?'
+      );
+      if (!confirmed) {
+        this.strgMode = this.previousStrgMode;
+        return;
+      }
+
       try {
-        const res = await getCntxtPth();
-        if (res.status == 200) {
-          this.cntxtPth = res.data.data;
-          this.defaultCntxtPth = res.data.data;
-        }
+        const storageMode = {};
+        storageMode.strgMth = this.strgMode;
+        await saveByStorageMode(storageMode);
+        alert('스토리지 방식이 변경되었습니다.\n다시 로그인해주세요.');
+        this.$store.commit("setStoreReset");
+        window.location = this.$filters.ctxPath('/cmslogin.page');
       } catch (error) {
         const errorData = error.response.data;
         if (errorData.message != null && errorData.message != "") {
@@ -215,9 +240,9 @@
         } else {
             alert("에러가 발생했습니다.\n관리자에게 문의해주세요.");
         }
+        this.strgMode = this.previousStrgMode;
       }
     },
-
     // Context Path 저장
     async saveByContextPath() {
       if (!this.validation()) {
@@ -258,6 +283,49 @@
         }
       }
     },
+    // 2차 인증 설정 저장
+    async saveBy2ndAuth() {
+      const confirmed = confirm(
+        '2차 인증 설정을 변경하면 전체 사용자가 로그아웃됩니다.\n계속하시겠습니까?'
+      );
+      if (!confirmed) {
+        this.use2ndAuth = this.previousUse2ndAuth;
+        return;
+      }
+
+      try {
+        const email2ndAuth = {};
+        email2ndAuth.useYn = this.use2ndAuth;
+        await saveBy2ndAuth(email2ndAuth);
+        alert('이메일 2차 인증 설정이 저장되었습니다.');
+        // this.$store.commit("setStoreReset");
+        // window.location = this.$filters.ctxPath('/cmslogin.page');
+      } catch (error) {
+        const errorData = error.response.data;
+        if (errorData.message != null && errorData.message != "") {
+            alert(error.response.data.message);
+        } else {
+            alert("에러가 발생했습니다.\n관리자에게 문의해주세요.");
+        }
+      }
+    },
+    // 최신 Context Path 조회
+    async findCntxtPth() {
+      try {
+        const res = await getCntxtPth();
+        if (res.status == 200) {
+          this.cntxtPth = res.data.data;
+          this.defaultCntxtPth = res.data.data;
+        }
+      } catch (error) {
+        const errorData = error.response?.data;
+        if (errorData?.message != null && errorData?.message != "") {
+            alert(error.response.data.message);
+        } else {
+            alert("에러가 발생했습니다.\n관리자에게 문의해주세요.");
+        }
+      }
+    },
 
     // 유효성 검사
     validation() {
@@ -285,60 +353,159 @@
       return true;
     },
 
-    // 2차 인증 설정 저장
-    async saveBy2ndAuth() {
-      const confirmed = confirm(
-        '2차 인증 설정을 변경하면 전체 사용자가 로그아웃됩니다.\n계속하시겠습니까?'
-      );
-      if (!confirmed) {
-        this.use2ndAuth = this.previousUse2ndAuth;
-        return;
-      }
-
+    // 전체 사용자 로그아웃 API 호출
+    async performGlobalLogout() {
       try {
-        const email2ndAuth = {};
-        email2ndAuth.useYn = this.use2ndAuth;
-        await saveBy2ndAuth(email2ndAuth);
-        alert('이메일 2차 인증 설정이 저장되었습니다.');
-        // this.$store.commit("setStoreReset");
-        // window.location = this.$filters.ctxPath('/cmslogin.page');
+        console.log('전체 사용자 로그아웃 API 호출 시작');
+        await fetch('/mbr/logoutAll.json', {
+          method: 'POST',
+          credentials: 'include',
+          headers: {
+            'Content-Type': 'application/json'
+          }
+        });
+        console.log('전체 사용자 로그아웃 API 호출 완료');
       } catch (error) {
-        const errorData = error.response.data;
-        if (errorData.message != null && errorData.message != "") {
-            alert(error.response.data.message);
-        } else {
-            alert("에러가 발생했습니다.\n관리자에게 문의해주세요.");
-        }
+        console.warn('전체 로그아웃 API 호출 실패:', error);
+        // 실패해도 계속 진행
       }
     },
 
-    // 스토리지 방식 저장
-    async saveByStorageMode() {
-      const confirmed = confirm(
-        '스토리지 방식을 변경하면 전체 사용자가 로그아웃됩니다.\n계속하시겠습니까?'
-      );
-      if (!confirmed) {
-        this.strgMode = this.previousStrgMode;
-        return;
-      }
-
+    // 완전한 정리 및 리다이렉트
+    async performCompleteCleanupAndRedirect(contextPath = null) {
       try {
-        const storageMode = {};
-        storageMode.strgMode = this.strgMode;
-        await saveByStorageMode(storageMode);
-        alert('스토리지 방식이 변경되었습니다.\n다시 로그인해주세요.');
+        console.log('완전한 정리 시작');
+        
+        // 1. 스토어 완전 초기화
         this.$store.commit("setStoreReset");
-        window.location = this.$filters.ctxPath('/cmslogin.page');
+        
+        // 2. 모든 저장소 정리
+        this.clearAllStorages();
+        
+        // 3. 모든 쿠키 제거 (클라이언트 사이드)
+        this.clearAllClientCookies();
+        
+        // 4. 브라우저 캐시 정리
+        this.clearBrowserCache();
+        
+        // 5. 페이지 이동
+        const targetPath = contextPath !== null ? 
+          `${contextPath}/cmslogin.page` : 
+          this.$filters.ctxPath('/cmslogin.page');
+        
+        console.log('리다이렉트 경로:', targetPath);
+        
+        // 히스토리 정리 후 이동
+        window.history.replaceState(null, '', targetPath);
+        window.location.href = targetPath;
+        
       } catch (error) {
-        const errorData = error.response.data;
-        if (errorData.message != null && errorData.message != "") {
-            alert(error.response.data.message);
-        } else {
-            alert("에러가 발생했습니다.\n관리자에게 문의해주세요.");
-        }
-        this.strgMode = this.previousStrgMode;
+        console.error('완전한 정리 중 오류:', error);
+        // 최종 수단: 강제 새로고침
+        window.location.reload();
       }
     },
+
+    // 모든 저장소 정리
+    clearAllStorages() {
+      try {
+        console.log('저장소 정리 시작');
+        
+        // localStorage 완전 정리
+        const localStorageKeys = Object.keys(localStorage);
+        localStorageKeys.forEach(key => {
+          localStorage.removeItem(key);
+        });
+        localStorage.clear();
+        
+        // sessionStorage 완전 정리
+        const sessionStorageKeys = Object.keys(sessionStorage);
+        sessionStorageKeys.forEach(key => {
+          sessionStorage.removeItem(key);
+        });
+        sessionStorage.clear();
+        
+        console.log('저장소 정리 완료');
+      } catch (error) {
+        console.error('저장소 정리 실패:', error);
+      }
+    },
+
+    // 모든 클라이언트 쿠키 제거
+    clearAllClientCookies() {
+      try {
+        console.log('클라이언트 쿠키 제거 시작');
+        
+        const cookiesToDelete = [
+          // 일반 인증 쿠키
+          'refresh', 'Authorization', 'access_token', 'JSESSIONID', 'SESSION',
+          
+          // OAuth 관련 쿠키
+          'oauth_access_token', 'oauth_refresh_token', 'oauth_state',
+          'OAUTH2_AUTHORIZATION_REQUEST', 'oauth2_auth_request',
+          
+          // 소셜 로그인 쿠키들
+          'kakao_login', '_kadu', '_kadub', '_kalt', '_kawlt', '_kawltea', '_karmt', '_karmts',
+          'NID_AUT', 'NID_SES', 'NID_JKL', 'NID_INF', 'NID_LOG',
+          'SACSID', 'APISID', 'SSID', 'HSID', 'SID', '1P_JAR',
+          '__Secure-1PAPISID', '__Secure-1PSID', '__Secure-3PAPISID', '__Secure-3PSID',
+          
+          // 기타
+          'remember-me', 'user-session', 'auth-token', 'login-token', 'csrf-token'
+        ];
+        
+        const domains = ['', '.' + window.location.hostname, window.location.hostname, '.localhost', 'localhost'];
+        const paths = ['/', '/oauth2', '/login', '/auth', '/api', '/mbr', '/admin'];
+        
+        cookiesToDelete.forEach(cookieName => {
+          paths.forEach(path => {
+            domains.forEach(domain => {
+              // 기본 쿠키 삭제
+              document.cookie = `${cookieName}=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=${path};`;
+              
+              // 도메인별 쿠키 삭제
+              if (domain) {
+                document.cookie = `${cookieName}=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=${path}; domain=${domain};`;
+              }
+            });
+          });
+        });
+        
+        console.log('클라이언트 쿠키 제거 완료');
+      } catch (error) {
+        console.error('클라이언트 쿠키 제거 실패:', error);
+      }
+    },
+
+    // 브라우저 캐시 정리
+    clearBrowserCache() {
+      try {
+        console.log('브라우저 캐시 정리 시작');
+        
+        // 캐시 API 지원 확인 및 정리
+        if ('caches' in window) {
+          caches.keys().then(cacheNames => {
+            cacheNames.forEach(cacheName => {
+              caches.delete(cacheName);
+            });
+          }).catch(() => {});
+        }
+        
+        // IndexedDB 정리 (가능한 경우)
+        if ('indexedDB' in window) {
+          const commonDBNames = ['auth_db', 'user_db', 'session_db'];
+          commonDBNames.forEach(dbName => {
+            try {
+              indexedDB.deleteDatabase(dbName);
+            } catch (e) {}
+          });
+        }
+        
+        console.log('브라우저 캐시 정리 완료');
+      } catch (error) {
+        console.error('브라우저 캐시 정리 실패:', error);
+      }
+    }
   }
 }
 </script>
(파일 끝에 줄바꿈 문자 없음)
client/views/pages/adm/system/networkAccessControl/NetworkAccessControlInsert.vue
--- client/views/pages/adm/system/networkAccessControl/NetworkAccessControlInsert.vue
+++ client/views/pages/adm/system/networkAccessControl/NetworkAccessControlInsert.vue
@@ -26,7 +26,7 @@
                             </div>
                             <div class="layout">
                                 <label for="" class="form-title"><span>*</span>제어 경로</label>
-                                <input type="text"  class="form-control sm"  v-model="accesCtrl.cntrlCrs" placeholder="제어할 경로 URL을 입력하세요."/>
+                                <input type="text"  class="form-control sm"  v-model="accesCtrl.cntrPath" placeholder="제어할 경로 URL을 입력하세요."/>
                             </div>
                     </div>
                 </div>
@@ -170,7 +170,7 @@
                 alert('IP 형식이 다릅니다.');
                 return false;
             }
-            if (this.accesCtrl.cntrlCrs == null || this.accesCtrl.cntrlCrs == '') {
+            if (this.accesCtrl.cntrPath == null || this.accesCtrl.cntrPath == '') {
                 alert('제어 경로를 입력하세요.');
                 return false;
             }
client/views/pages/adm/system/networkAccessControl/NetworkAccessControlSelectList.vue
--- client/views/pages/adm/system/networkAccessControl/NetworkAccessControlSelectList.vue
+++ client/views/pages/adm/system/networkAccessControl/NetworkAccessControlSelectList.vue
@@ -141,7 +141,7 @@
           this.listCnt -
           idx -
           (this.search.currentPage - 1) * this.search.recordSize, // 번호
-        cntrlCrs: acces.cntrlCrs, // 경로
+        cntrPath: acces.cntrPath, // 경로
         cntrlIp: acces.cntrlIp, // 아이피
         cntrlTypeNm: acces.cntrlTypeNm, // 유형
         regDt: acces.regDt, // 등록일
client/views/pages/adm/system/networkAccessControl/NetworkAccessControlSelectListOne.vue
--- client/views/pages/adm/system/networkAccessControl/NetworkAccessControlSelectListOne.vue
+++ client/views/pages/adm/system/networkAccessControl/NetworkAccessControlSelectListOne.vue
@@ -17,7 +17,7 @@
             </div>
             <div class="layout">
               <p class="form-title">제어 경로</p>
-              <p colspan="3">{{ accesCtrl.cntrlCrs }}</p>
+              <p colspan="3">{{ accesCtrl.cntrPath }}</p>
             </div>
           </div>
         </div>
client/views/pages/login/Login.vue
--- client/views/pages/login/Login.vue
+++ client/views/pages/login/Login.vue
@@ -74,8 +74,7 @@
 
 <script>
 import { useStore } from "vuex";
-// import store from "../AppStore";
-import { loginProc, getUserInfo, oauthLogin } from "../../../resources/api/login";
+import { loginProc, getUserInfo } from "../../../resources/api/login";
 import { check2ndAuthProc, sendAuthEmailProc } from "../../../resources/api/email";
 import queryParams from "../../../resources/js/queryParams";
 
@@ -86,7 +85,6 @@
     return {
       isLoading: false,
       member: { lgnId: null, pswd: null, lgnReqPage: 'U' },
-      // store: useStore(),
       isAdminPage: false,
       isOAuthLoading: false,
       memberInfo: { email: '', code: '' },
@@ -101,7 +99,9 @@
 
   async mounted() {
     await this.$nextTick();
+    // OAuth 파라미터가 있으면 콜백 처리
     if (this.hasOAuthParams()) {
+      console.log('OAuth 파라미터 감지, 콜백 처리 시작');
       await this.handleOAuthCallback();
     }
   },
@@ -113,6 +113,7 @@
   watch: {
     '$route'(to) {
       if (to.query.oauth_success || to.query.error) {
+        console.log('라우트 변경으로 OAuth 콜백 감지');
         this.handleOAuthCallback();
       }
     }
@@ -234,27 +235,41 @@
 
     // ========== OAuth2 로그인 ==========
     fnOAuthLogin(provider) {
+      console.log('OAuth 로그인 시작:', provider);
+      this.isOAuthLoading = true;
+      
       const redirectUrl = this.restoreRedirect("redirect") || this.$route.fullPath;
       sessionStorage.setItem('oauth_redirect', redirectUrl);
-      oauthLogin(provider);
+      sessionStorage.setItem('oauth_provider', provider);
+      sessionStorage.setItem('oauth_start_time', Date.now().toString());
+      
+      // OAuth 로그인 페이지로 이동
+      window.location.href = `/oauth2/login?provider=${provider}`;
     },
 
     async handleOAuthCallback() {
-      const { error, errorMessage, oauthSuccess, loginMode } = this.parseOAuthParams();
+      const { error, errorMessage, oauthSuccess, lgnMth } = this.parseOAuthParams();
+
+      console.log('OAuth 콜백 처리:', { error, errorMessage, oauthSuccess, lgnMth });
 
       if (error) {
         this.handleOAuthError(error, errorMessage);
         return;
       }
 
-      if (oauthSuccess !== 'true' && oauthSuccess !== true) return;
+      if (oauthSuccess !== 'true' && oauthSuccess !== true) {
+        console.log('OAuth 성공 파라미터 없음, 처리 건너뜀');
+        return;
+      }
 
       try {
+        console.log('OAuth 성공 처리 시작');
+        
         // 기존 시스템 로그인 모드 따라가기
         const finalLoginMode = loginMode || this.$store.state.loginMode || localStorage.getItem('loginMode') || 'J';
         
+        console.log('최종 로그인 모드:', finalLoginMode);
         this.$store.commit("setLoginMode", finalLoginMode);
-        // localStorage.setItem("loginMode", finalLoginMode);
 
         if (finalLoginMode === 'J') {
           await this.handleOAuthJWT();
@@ -267,6 +282,7 @@
         await this.handleLoginSuccess();
 
       } catch (error) {
+        console.error('OAuth 처리 중 오류:', error);
         this.handleOAuthError('processing_error', error.message);
       }
     },
@@ -285,11 +301,20 @@
 
     async handleOAuthJWT() {
       try {
-        const token = localStorage.getItem('authorization') 
+        console.log('OAuth JWT 모드 처리 시작');
+        
+        // 여러 방법으로 토큰 찾기
+        const token = this.getCookie('Authorization') 
             || this.getCookie('refresh') 
-            || this.getCookie('Authorization');
+            || localStorage.getItem('authorization')
+            || sessionStorage.getItem('authorization');
             
-        const headers = { 'Content-Type': 'application/json' };
+        console.log('찾은 토큰:', token ? '있음' : '없음');
+            
+        const headers = { 
+          'Content-Type': 'application/json',
+          'Cache-Control': 'no-cache'
+        };
         
         if (token) {
           headers['Authorization'] = token.startsWith('Bearer ') ? token : `Bearer ${token}`;
@@ -301,16 +326,24 @@
           credentials: 'include'
         });
         
+        console.log('OAuth 사용자 정보 응답 상태:', response.status);
+        
         if (response.status === 200) {
           const result = await response.json();
+          console.log('OAuth 사용자 정보:', result);
           
           if (result.success || result.data) {
             const userInfo = result.data;
+            
+            // 토큰이 응답에 있으면 사용, 없으면 기존 토큰 사용
+            const finalToken = result.data.token || token;
+            
             const roles = Array.isArray(userInfo.roles) ?
                 userInfo.roles.map(r => ({ authority: r.authrtCd || r.authority })) :
                 userInfo.roles;
 
-            this.setAuthInfo("J", token, { ...userInfo, roles });
+            this.setAuthInfo("J", finalToken, { ...userInfo, roles });
+            console.log('JWT 인증 정보 설정 완료');
             
           } else {
             throw new Error('서버에서 실패 응답');
@@ -320,31 +353,51 @@
         }
         
       } catch (error) {
+        console.error('OAuth JWT 처리 실패:', error);
         throw error;
       }
     },
 
     async handleOAuthSession() {
       try {
-        const userInfoRes = await getUserInfo();
+        console.log('OAuth 세션 모드 처리 시작');
+        
+        const userInfoRes = await fetch('/oauth2/getUserInfo.json', {
+          method: 'POST',
+          credentials: 'include',
+          headers: {
+            'Content-Type': 'application/json',
+            'Cache-Control': 'no-cache'
+          }
+        });
+        
+        console.log('세션 사용자 정보 응답 상태:', userInfoRes.status);
+        
         if (!userInfoRes || userInfoRes.status !== 200) {
           throw new Error('세션 정보를 가져올 수 없습니다.');
         }
 
-        const userInfo = userInfoRes.data.data;
+        const result = await userInfoRes.json();
+        console.log('세션 사용자 정보:', result);
+        
+        const userInfo = result.data;
         const roles = Array.isArray(userInfo.roles) ?
           userInfo.roles.map(r => ({ authority: r.authrtCd || r.authority })) :
           userInfo.roles;
 
         this.setAuthInfo('S', null, { ...userInfo, roles });
+        console.log('세션 인증 정보 설정 완료');
         
       } catch (error) {
+        console.error('OAuth 세션 처리 실패:', error);
         throw error;
       }
     },
 
     // ========== 공통 처리 ==========
     setAuthInfo(loginMode, token, userInfo) {
+      console.log('인증 정보 설정:', { loginMode, userInfo: userInfo.mbrId });
+      
       // Store 설정
       try {
         if (typeof this.$store !== 'undefined' && this.$store.commit) {
@@ -353,27 +406,20 @@
           this.$store.commit("setMbrId", userInfo.mbrId);
           this.$store.commit("setMbrNm", userInfo.mbrNm);
           this.$store.commit("setRoles", userInfo.roles);
+          console.log('Vuex 스토어 설정 완료');
         }
       } catch (e) {
-        console.warn("store 설정 실패, localStorage만 사용:", e);
+        console.warn("store 설정 실패:", e);
       }
-
-      // localStorage 저장
-      // localStorage.setItem("loginMode", loginMode);
-      // localStorage.setItem("mbrId", userInfo.mbrId);
-      // localStorage.setItem("mbrNm", userInfo.mbrNm);
-      // localStorage.setItem("roles", JSON.stringify(userInfo.roles));
-
-      // if (token && loginMode === 'J') {
-      //   localStorage.setItem("authorization", token);
-      // } else {
-      //   localStorage.removeItem("authorization");
-      // }
     },
 
     async handleLoginSuccess() {
+      console.log('로그인 성공 후 처리 시작');
+      
       const isAdmin = this.$store.state.roles.some(role => role.authority === "ROLE_ADMIN");
       let redirectUrl = this.restoreRedirect("redirect") || sessionStorage.getItem('oauth_redirect');
+
+      console.log('관리자 여부:', isAdmin, '리다이렉트 URL:', redirectUrl);
 
       if (redirectUrl && this.shouldRedirectToMain(redirectUrl)) {
         redirectUrl = this.$filters.ctxPath("/");
@@ -385,6 +431,8 @@
 
       const targetPath = this.getValidRedirectPath(redirectUrl, isAdmin);
       
+      console.log('최종 이동 경로:', targetPath);
+      
       await this.$nextTick();
       this.$router.push({ path: targetPath });
 
@@ -395,11 +443,12 @@
     shouldRedirectToMain(url) {
       return url.includes("/searchId.page") ||
         url.includes("/resetPswd.page") ||
-        url.includes("/login.page");
+        url.includes("/login.page") ||
+        url.includes("/cmslogin.page");
     },
 
     getValidRedirectPath(redirectUrl, isAdmin) {
-      if (redirectUrl && !redirectUrl.includes("login.page")) {
+      if (redirectUrl && !redirectUrl.includes("login.page") && !redirectUrl.includes("cmslogin.page")) {
         const routeExists = this.$router.getRoutes().some(route => route.path === redirectUrl);
         if (routeExists) return redirectUrl;
       }
@@ -411,21 +460,29 @@
 
     // ========== 에러 처리 및 정리 ==========
     handleOAuthError(error, errorMessage) {
+      console.error('OAuth 에러 처리:', { error, errorMessage });
+      
       this.isOAuthLoading = false;
       this.cleanupOAuth();
 
       const message = decodeURIComponent(errorMessage || error || 'OAuth 로그인에 실패했습니다.');
       alert(`소셜 로그인 실패: ${message}`);
 
-      this.$router.push({ path: this.$filters.ctxPath("/login.page") });
+      // 현재 페이지가 메인 페이지가 아니면 로그인 페이지로 이동
+      if (this.$route.path !== this.$filters.ctxPath("/")) {
+        this.$router.push({ path: this.$filters.ctxPath("/login.page") });
+      }
     },
 
     cleanupOAuth() {
+      console.log('OAuth 정리 작업');
+      
       sessionStorage.removeItem('oauth_redirect');
       sessionStorage.removeItem('oauth_provider');
       sessionStorage.removeItem('oauth_start_time');
       this.isOAuthLoading = false;
 
+      // URL에서 OAuth 파라미터 제거
       const cleanUrl = window.location.pathname;
       window.history.replaceState({}, document.title, cleanUrl);
     },
@@ -434,7 +491,12 @@
     getCookie(name) {
       const value = `; ${document.cookie}`;
       const parts = value.split(`; ${name}=`);
-      return parts.length === 2 ? parts.pop().split(';').shift() : null;
+      if (parts.length === 2) {
+        const cookieValue = parts.pop().split(';').shift();
+        console.log(`쿠키 ${name}:`, cookieValue ? '있음' : '없음');
+        return cookieValue;
+      }
+      return null;
     },
 
     moveSearchId() {
Add a comment
List