feat: 대시보드에 유저의 정보를 불러오기

This commit is contained in:
2026-02-26 20:49:12 +09:00
parent d56303cec4
commit c92e270716
11 changed files with 213 additions and 22 deletions

View File

@@ -12,34 +12,43 @@ interface AuthState {
logout: () => void;
}
// 쿠키 키 상수 정의 (Access Token 보관용)
// 쿠키 키 상수 정의
const TOKEN_COOKIE_KEY = 'vr_access_token';
const REFRESH_TOKEN_COOKIE_KEY = 'vr_refresh_token';
/**
* VibeRoom 전역 인증(Auth) 상태 저장소
*
* Zustand를 활용하여 메모리에 상태를 쥐고 있으면서,
* 쿠키(js-cookie)를 통해 브라우저 종료 후에도 세션이 유지되도록 동기화합니다.
*/
export const useAuthStore = create<AuthState>((set) => {
// 브라우저 환경에서만 쿠키 접근
const isClient = typeof window !== 'undefined';
const savedToken = isClient ? Cookies.get(TOKEN_COOKIE_KEY) : null;
return {
accessToken: savedToken || null,
user: null, // 새로고침 시 이 토큰을 기반으로 유저 정보(me API)를 다시 가져와야 합니다(Hydrate).
user: null,
isAuthenticated: !!savedToken,
setAuth: (data: AuthResponse) => {
// 1. 브라우저 쿠키에 저장 (보안 옵션 설정)
const cookieOptions = {
secure: process.env.NODE_ENV === 'production',
sameSite: 'strict' as const
};
// 1. Access Token 저장 (7일)
Cookies.set(TOKEN_COOKIE_KEY, data.accessToken, {
expires: 7, // 7일 후 만료
secure: process.env.NODE_ENV === 'production', // HTTPS 환경에서만 전송
sameSite: 'strict' // CSRF 공격 방어
...cookieOptions,
expires: 7
});
// 2. Zustand 메모리 상태 업데이트 (연결된 UI 전체 리렌더링)
// 2. Refresh Token 저장 (30일)
if (data.refreshToken) {
Cookies.set(REFRESH_TOKEN_COOKIE_KEY, data.refreshToken, {
...cookieOptions,
expires: 30
});
}
// 3. 상태 업데이트
set({
accessToken: data.accessToken,
user: data.user,
@@ -48,10 +57,9 @@ export const useAuthStore = create<AuthState>((set) => {
},
logout: () => {
// 1. 쿠키에서 토큰 삭제
Cookies.remove(TOKEN_COOKIE_KEY);
Cookies.remove(REFRESH_TOKEN_COOKIE_KEY);
// 2. Zustand 상태 초기화
set({
accessToken: null,
user: null,