From b021b7beeae2006b3d626ca9eb833ed22c6bdf33 Mon Sep 17 00:00:00 2001 From: ysCha Date: Fri, 3 Apr 2026 16:15:13 +0900 Subject: [PATCH 1/2] =?UTF-8?q?=EB=A1=9C=EA=B7=B8=EC=95=84=EC=9B=83=20?= =?UTF-8?q?=EA=B2=B0=EA=B3=BC=EC=97=86=EC=9D=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/auth/AutoLogin.jsx | 2 +- src/components/header/Header.jsx | 2 +- src/components/main/ChangePasswordPop.jsx | 6 ++--- src/hooks/useLogout.js | 29 +++++++++++------------ 4 files changed, 18 insertions(+), 21 deletions(-) diff --git a/src/components/auth/AutoLogin.jsx b/src/components/auth/AutoLogin.jsx index c8e42c49..5de9ea85 100644 --- a/src/components/auth/AutoLogin.jsx +++ b/src/components/auth/AutoLogin.jsx @@ -3,12 +3,12 @@ import { useState } from 'react' import { useMessage } from '@/hooks/useMessage' import { setSession, login } from '@/lib/authActions' -import Cookies from 'js-cookie' import { sessionStore } from '@/store/commonAtom' import { useRecoilState } from 'recoil' import { useAxios } from '@/hooks/useAxios' import { globalLocaleStore } from '@/store/localeAtom' import { useRouter } from 'next/navigation' +import Cookies from 'js-cookie' import GlobalSpinner from '@/components/common/spinner/GlobalSpinner' diff --git a/src/components/header/Header.jsx b/src/components/header/Header.jsx index 9da21fb2..8c2ccbff 100644 --- a/src/components/header/Header.jsx +++ b/src/components/header/Header.jsx @@ -50,6 +50,7 @@ export default function Header(props) { const [stuffSearch, setStuffSearch] = useRecoilState(stuffSearchState) const { closeAll } = usePopup() + const { logoutProcess } = useLogout() const { userSession } = props const [sessionState, setSessionState] = useRecoilState(sessionStore) @@ -78,7 +79,6 @@ export default function Header(props) { const { promiseGet } = useAxios() const { swalFire } = useSwal() - const { logoutProcess } = useLogout() /** * 지붕재 목록 Header에서 조회 diff --git a/src/components/main/ChangePasswordPop.jsx b/src/components/main/ChangePasswordPop.jsx index 064b6680..58c22d69 100644 --- a/src/components/main/ChangePasswordPop.jsx +++ b/src/components/main/ChangePasswordPop.jsx @@ -6,10 +6,9 @@ import { useRecoilState, useRecoilValue } from 'recoil' import { useAxios } from '@/hooks/useAxios' import { globalLocaleStore } from '@/store/localeAtom' import { login, setSession } from '@/lib/authActions' -import { useLogout } from '@/hooks/useLogout' import { useSwal } from '@/hooks/useSwal' import { QcastContext } from '@/app/QcastProvider' -import { useRouter } from 'next/navigation' +import { useLogout } from '@/hooks/useLogout' export default function ChangePasswordPop(props) { const globalLocaleState = useRecoilValue(globalLocaleStore) @@ -18,10 +17,9 @@ export default function ChangePasswordPop(props) { const { swalFire } = useSwal() const { patch } = useAxios(globalLocaleState) - const { logoutProcess } = useLogout() const { getMessage } = useMessage() const [sessionState, setSessionState] = useRecoilState(sessionStore) - const router = useRouter() + const { logoutProcess } = useLogout() const formInitValue = { password1: '', password2: '', diff --git a/src/hooks/useLogout.js b/src/hooks/useLogout.js index cbaed9db..9b2d638e 100644 --- a/src/hooks/useLogout.js +++ b/src/hooks/useLogout.js @@ -17,21 +17,20 @@ export function useLogout() { loginId: sessionState.userId, requestId: Cookies.get('sessionId'), } - await promisePost({ url: '/api/login/v1.0/logout', data: param }) - .then(async (res) => { - if (res.data.result.resultCode === 'S') { - setStuffSearch({ - ...stuffSearch, - code: 'DELETE', - }) - Cookies.remove('sessionId') - await logout() - window.location.href = '/login' - } - }) - .catch((error) => { - alert(error.response?.data?.message || 'ログアウトに失敗しました。') - }) + + try { + await promisePost({ url: '/api/login/v1.0/logout', data: param }) + } catch (error) { + console.log('logout api error:', error) + } + + setStuffSearch({ + ...stuffSearch, + code: 'DELETE', + }) + Cookies.remove('sessionId') + await logout() + window.location.href = '/login' } return { logoutProcess } -- 2.47.2 From afe0a377db39cd71e3384adff3e72d7e036b8348 Mon Sep 17 00:00:00 2001 From: ysCha Date: Fri, 3 Apr 2026 16:20:12 +0900 Subject: [PATCH 2/2] =?UTF-8?q?=EC=9E=90=EB=8F=99=20=EB=A1=9C=EA=B7=B8?= =?UTF-8?q?=EC=9D=B8,=20=EB=A1=9C=EA=B7=B8=EC=95=84=EC=9B=83=20=EC=B6=94?= =?UTF-8?q?=EC=A0=812?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/hooks/useLogout.js | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/src/hooks/useLogout.js b/src/hooks/useLogout.js index 9b2d638e..08ef1cc3 100644 --- a/src/hooks/useLogout.js +++ b/src/hooks/useLogout.js @@ -6,6 +6,11 @@ import { useAxios } from '@/hooks/useAxios' import { logout } from '@/lib/authActions' import Cookies from 'js-cookie' +/** + * 로그아웃 처리 Hook + * - 로그아웃 API 호출 후 성공/실패 상관없이 로그아웃 처리 + * - Header, ChangePasswordPop 등에서 공통으로 사용 + */ export function useLogout() { const [sessionState] = useRecoilState(sessionStore) const [stuffSearch, setStuffSearch] = useRecoilState(stuffSearchState) @@ -15,22 +20,24 @@ export function useLogout() { const logoutProcess = async () => { const param = { loginId: sessionState.userId, - requestId: Cookies.get('sessionId'), + requestId: Cookies.get('sessionId'), // 로그인 시 저장한 sessionId } + // 로그아웃 API 호출 (실패해도 로그아웃 진행) try { await promisePost({ url: '/api/login/v1.0/logout', data: param }) } catch (error) { console.log('logout api error:', error) } + // 물건검색 상태 초기화 setStuffSearch({ ...stuffSearch, code: 'DELETE', }) - Cookies.remove('sessionId') - await logout() - window.location.href = '/login' + Cookies.remove('sessionId') // sessionId 쿠키 삭제 + await logout() // iron-session 세션 파기 + window.location.href = '/login' // 로그인 페이지로 이동 (full reload) } return { logoutProcess } -- 2.47.2