1+ // auth.ts
12import { getApi } from '@/app/api/config/appConfig' ;
23import { create } from 'zustand' ;
34
@@ -13,43 +14,47 @@ export interface User {
1314interface AuthState {
1415 user : User | null ;
1516 isLoggedIn : boolean ;
17+ isAuthChecked : boolean ;
18+
1619 setUser : ( user : User ) => void ;
1720 logout : ( ) => Promise < void > ;
1821 loginWithProvider : ( provider : User [ 'provider' ] ) => void ;
19-
2022 updateUser : ( ) => Promise < User | null > ;
2123 checkAuth : ( ) => Promise < User | null > ;
2224}
2325
24- export const useAuthStore = create < AuthState > ( ) ( ( set ) => ( {
26+ export const useAuthStore = create < AuthState > ( ) ( ( set , get ) => ( {
2527 user : null ,
2628 isLoggedIn : false ,
29+ isAuthChecked : false ,
2730
2831 loginWithProvider : ( provider ) => {
2932 window . location . href = `${ getApi } /oauth2/authorization/${ provider } ` ;
3033 } ,
3134
3235 setUser : ( user ) => {
3336 const updatedUser = { ...user , abv_degree : user . abv_degree ?? 5.0 } ;
34- set ( { user : updatedUser , isLoggedIn : true } ) ;
37+ set ( {
38+ user : updatedUser ,
39+ isLoggedIn : true ,
40+ isAuthChecked : true ,
41+ } ) ;
3542 } ,
3643
37- // 로그아웃
3844 logout : async ( ) => {
3945 try {
4046 await fetch ( `${ getApi } /user/auth/logout` , {
4147 method : 'POST' ,
4248 credentials : 'include' ,
4349 } ) ;
44- set ( { user : null , isLoggedIn : false } ) ;
50+
51+ set ( { user : null , isLoggedIn : false , isAuthChecked : true } ) ;
4552 } catch ( err ) {
4653 console . error ( '로그아웃 실패' , err ) ;
47- } finally {
48- set ( { user : null , isLoggedIn : false } ) ;
54+ set ( { user : null , isLoggedIn : false , isAuthChecked : true } ) ;
4955 }
5056 } ,
5157
52- // idle + refresh 시 호출
5358 updateUser : async ( ) => {
5459 try {
5560 const res = await fetch ( `${ getApi } /user/auth/refresh` , {
@@ -58,15 +63,22 @@ export const useAuthStore = create<AuthState>()((set) => ({
5863 headers : { 'Content-Type' : 'application/json' } ,
5964 } ) ;
6065
61- if ( ! res . ok ) throw new Error ( '토큰 갱신 실패' ) ;
66+ // 200 응답 기대
67+ if ( ! res . ok ) {
68+ set ( { user : null , isLoggedIn : false } ) ;
69+ return null ;
70+ }
6271
6372 const data = await res . json ( ) ;
6473 const userInfo = data ?. data ?. user ;
6574
6675 if ( userInfo ) {
67- set ( { user : userInfo , isLoggedIn : true } ) ;
68- return userInfo ;
76+ const updatedUser = { ...userInfo , abv_degree : userInfo . abv_degree ?? 5.0 } ;
77+ set ( { user : updatedUser , isLoggedIn : true } ) ;
78+ return updatedUser ;
6979 }
80+
81+ set ( { user : null , isLoggedIn : false } ) ;
7082 return null ;
7183 } catch ( err ) {
7284 console . error ( 'updateUser 실패' , err ) ;
@@ -75,24 +87,41 @@ export const useAuthStore = create<AuthState>()((set) => ({
7587 }
7688 } ,
7789
78- // 시작 시 로그인 상태 확인
7990 checkAuth : async ( ) => {
91+ const { isAuthChecked } = get ( ) ;
92+
93+ // 이미 체크했으면 현재 user 반환
94+ if ( isAuthChecked ) {
95+ return get ( ) . user ;
96+ }
97+
8098 try {
8199 const res = await fetch ( `${ getApi } /user/auth/me` , {
82100 method : 'GET' ,
83101 credentials : 'include' ,
84102 } ) ;
85- if ( ! res . ok ) throw new Error ( '인증 실패' ) ;
103+
104+ // 항상 200 응답 기대
105+ if ( ! res . ok ) {
106+ set ( { user : null , isLoggedIn : false , isAuthChecked : true } ) ;
107+ return null ;
108+ }
86109
87110 const data = await res . json ( ) ;
88- const userInfo = data ?. data ?. user ;
111+ const userInfo = data ?. data ?. user || null ;
112+
89113 if ( userInfo ) {
90- set ( { user : userInfo , isLoggedIn : true } ) ;
91- return userInfo ;
114+ const updatedUser = { ...userInfo , abv_degree : userInfo . abv_degree ?? 5.0 } ;
115+ set ( { user : updatedUser , isLoggedIn : true , isAuthChecked : true } ) ;
116+ return updatedUser ;
92117 }
118+
119+ // user가 null이어도 정상 응답
120+ set ( { user : null , isLoggedIn : false , isAuthChecked : true } ) ;
93121 return null ;
94- } catch {
95- set ( { user : null , isLoggedIn : false } ) ;
122+ } catch ( err ) {
123+ console . error ( 'checkAuth 실패' , err ) ;
124+ set ( { user : null , isLoggedIn : false , isAuthChecked : true } ) ;
96125 return null ;
97126 }
98127 } ,
0 commit comments