From c9f1a4102f9884a6054a6ee02b519984086260f0 Mon Sep 17 00:00:00 2001 From: yscha Date: Fri, 3 Apr 2026 17:33:09 +0900 Subject: [PATCH] =?UTF-8?q?=EB=A1=9C=EA=B7=B8=EC=9D=B8,=20=EB=A1=9C?= =?UTF-8?q?=EA=B7=B8=EC=95=84=EC=9B=83=20=EC=B6=94=EA=B2=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app/api/auth/logout/route.ts | 31 ++++++++++++++++++++++++++++++- src/app/api/auth/route.ts | 28 ++++++++-------------------- src/components/Login.tsx | 3 +++ src/libs/session.ts | 3 ++- src/types/Auth.ts | 1 + 5 files changed, 44 insertions(+), 22 deletions(-) diff --git a/src/app/api/auth/logout/route.ts b/src/app/api/auth/logout/route.ts index ad4b365..e8d8a06 100644 --- a/src/app/api/auth/logout/route.ts +++ b/src/app/api/auth/logout/route.ts @@ -2,9 +2,39 @@ import type { SessionData } from '@/types/Auth' import { cookies } from 'next/headers' import { NextResponse } from 'next/server' import { getIronSession } from 'iron-session' +import { axiosInstance } from '@/libs/axios' import { sessionOptions } from '@/libs/session' import { tracking } from '@/libs/tracking' +export async function POST(request: Request) { + const cookieStore = await cookies() + const session = await getIronSession(cookieStore, sessionOptions) + + const headers: Record = { + referer: process.env.NEXT_PUBLIC_QSP_API_REFERER || '', + } + + try { + const result = await axiosInstance(`${process.env.NEXT_PUBLIC_QSP_API_URL}`, headers).post(`/api/user/logout`, { + loginId: session.userId, + accsSiteCd: 'QREAD', + actLog: 'LOGOUT', + requestId: session.sessionId, + }) + console.log('🚀 ~ logout ~ result:', result.data) + } catch (e) { + console.error('🚀 ~ logout ~ error:', e) + } + + tracking({ + url: '/api/auth/logout', + data: JSON.stringify({ loginId: session.userId }), + }) + session.destroy() + + return NextResponse.json({ code: 200, message: 'Logout successful' }) +} + export async function GET(request: Request) { const cookieStore = await cookies() const session = await getIronSession(cookieStore, sessionOptions) @@ -16,7 +46,6 @@ export async function GET(request: Request) { }), }) session.destroy() - // return redirect('/login') return NextResponse.json({ code: 200, message: 'Logout successful' }) } diff --git a/src/app/api/auth/route.ts b/src/app/api/auth/route.ts index 8bcad1c..45c5550 100644 --- a/src/app/api/auth/route.ts +++ b/src/app/api/auth/route.ts @@ -9,6 +9,8 @@ import { tracking } from '@/libs/tracking' export async function POST(request: Request) { const { loginId, pwd } = await request.json() + const sessionId = crypto.randomUUID() + const headers: Record = { referer: process.env.NEXT_PUBLIC_QSP_API_REFERER || '', } @@ -16,6 +18,9 @@ export async function POST(request: Request) { const result = await axiosInstance(`${process.env.NEXT_PUBLIC_QSP_API_URL}`, headers).post(`/api/user/login`, { loginId, pwd, + accsSiteCd: 'QREAD', + actLog: 'LOGIN', + requestId: sessionId, }) console.log('🚀 ~ result ~ result:', result.data) @@ -24,10 +29,7 @@ export async function POST(request: Request) { if (result.data.result.resultCode === 'S') { tracking({ url: `/api/auth/login`, - data: JSON.stringify({ - loginId, - pwd, - }), + data: JSON.stringify({ loginId }), }) const cookieStore = await cookies() const session = await getIronSession(cookieStore, sessionOptions) @@ -65,6 +67,7 @@ export async function POST(request: Request) { session.builderNm = result.data.data.builderNm session.isLoggedIn = true session.custNm = result.data.data.custNm + session.sessionId = sessionId /** * - Admin_Sub: 2차 판매점 슈퍼/일반 유저 (groupId: 70000 (Musubi), builderNo: null, userAuthCd: B가 아닌 경우) @@ -122,25 +125,10 @@ export async function POST(request: Request) { BUILDER_NO: result.data.data.builderNo, BUILDER_NM: result.data.data.builderNm, IS_LOGGED_IN: true, - ROLE: '', + ROLE: session.role, CUST_NM: result.data.data.custNm, } - if (result.data.data.userId === 'T01' || result.data.data.storeId === 'T01') { - resultForSession.ROLE = 'T01' - } else if (result.data.data.groupId === '60000') { - resultForSession.ROLE = 'Admin' - } else if (result.data.data.groupId === '70000' && result.data.data.builderNo === null && result.data.data.userAuthCd !== 'B') { - resultForSession.ROLE = 'Admin_Sub' - } else if ( - (result.data.data.groupId === '70000' && result.data.data.builderNo !== null) || - (result.data.data.groupId === '70000' && result.data.data.builderNo === null && result.data.data.userAuthCd === 'B') - ) { - resultForSession.ROLE = 'Builder' - } else { - resultForSession.ROLE = 'User' - } - finalResult = { code: 200, message: 'Login is Succecss!!', diff --git a/src/components/Login.tsx b/src/components/Login.tsx index 49b2e9b..58d337e 100644 --- a/src/components/Login.tsx +++ b/src/components/Login.tsx @@ -91,6 +91,9 @@ export default function Login() { result: SessionData } + // TODO: queryKey가 고정값(['login', 'account'])이라 이전 로그인 성공 캐시가 남아있으면 + // isLogin이 true로 바뀌는 순간 캐시를 먼저 반환 → useEffect 실행 → router.push('/') 발생 + // useMutation으로 교체 필요 const { data: loginData, isPending, diff --git a/src/libs/session.ts b/src/libs/session.ts index 7bd5522..da56275 100644 --- a/src/libs/session.ts +++ b/src/libs/session.ts @@ -49,7 +49,8 @@ export const defaultSession: SessionData = { builderNm: null, isLoggedIn: false, role: null, - custNm: null + custNm: null, + sessionId: null, } export const getSession = async () => { diff --git a/src/types/Auth.ts b/src/types/Auth.ts index 8a84ac7..576e567 100644 --- a/src/types/Auth.ts +++ b/src/types/Auth.ts @@ -32,4 +32,5 @@ export interface SessionData { isLoggedIn: boolean role: string | null custNm: null | string + sessionId: string | null } -- 2.47.2