@@ -3,73 +3,101 @@ import { apiAuth, api } from '@/api'
3
3
import { ref } from 'vue'
4
4
5
5
export const useAuthStore = defineStore ( 'auth' , ( ) => {
6
- const user = ref ( null )
6
+ const loginUser = ref ( null )
7
7
const isLoggedIn = ref ( false )
8
+ let tokenCheckInterval = null
8
9
9
- if ( localStorage . getItem ( 'token' ) ) {
10
+ if ( localStorage . getItem ( 'token' ) ) {
10
11
isLoggedIn . value = true
11
12
}
12
-
13
13
14
14
async function login ( email , password ) {
15
- try {
16
- console . log ( email , password )
17
- const response = await api . post ( "/user/login" , {
18
- email, password,
19
- } )
20
-
21
- const token = response . data [ "refresh-token" ]
22
- user . value = { email } ; // 사용자 정보 저장
23
- localStorage . setItem ( "users" , JSON . stringify ( user . value ) ) ; // 사용자 정보 저장
24
- localStorage . setItem ( "token" , token ) // 토큰저장
25
- isLoggedIn . value = true ;
26
- return { success : true , message : "로그인이 완료되었습니다." } ;
27
- } catch ( err ) {
28
- if ( err . response && err . response . status === 401 ) {
29
- return { success : false , message : "이메일 또는 비밀번호가 잘못되었습니다." } ;
30
- } else {
31
- console . error ( "로그인 오류" , err ) ;
32
- return { success : false , message : "로그인 중 문제가 발생했습니다. 다시 시도해주세요." } ;
33
- }
15
+ try {
16
+ const response = await api . post ( "/user/login" , { email, password } )
17
+ const token = response . data [ "refresh-token" ]
18
+ loginUser . value = { email }
19
+ localStorage . setItem ( "loginUser" , JSON . stringify ( loginUser . value ) )
20
+ localStorage . setItem ( "token" , token )
21
+ isLoggedIn . value = true
22
+ return { success : true , message : "로그인이 완료되었습니다." }
23
+ } catch ( err ) {
24
+ if ( err . response && err . response . status === 401 ) {
25
+ return { success : false , message : "이메일 또는 비밀번호가 잘못되었습니다." }
26
+ } else {
27
+ console . error ( "로그인 오류" , err )
28
+ return { success : false , message : "로그인 중 문제가 발생했습니다. 다시 시도해주세요." }
34
29
}
30
+ }
35
31
}
36
32
37
33
async function logout ( ) {
38
34
try {
35
+ const token = localStorage . getItem ( "token" )
36
+ if ( ! token || isTokenExpired ( token ) ) {
37
+ handleClientLogout ( )
38
+ return { success : true , message : "로그아웃이 완료되었습니다." }
39
+ }
39
40
await apiAuth . post ( "/user/logout" )
40
- localStorage . removeItem ( "token" )
41
- localStorage . removeItem ( "email" )
42
- user . value = null ;
43
- isLoggedIn . value = false ;
44
- return { success : true , message : "로그아웃이 완료되었습니다." } ;
41
+ handleClientLogout ( )
42
+ return { success : true , message : "로그아웃이 완료되었습니다." }
45
43
} catch ( err ) {
46
- console . error ( "로그아웃 오류" , err ) ;
47
- return { success : false , message : "로그아웃 중 문제가 발생했습니다. 다시 시도해주세요." } ;
44
+ console . error ( "로그아웃 오류" , err )
45
+ handleClientLogout ( )
46
+ return { success : false , message : "로그아웃 중 문제가 발생했습니다. 다시 시도해주세요." }
48
47
}
49
48
}
50
49
51
- // function checkAuth() {
52
- // // const storedUser = localStorage.getItem('user')
53
- // // if (isLoggedIn) {
54
- // // user.value = JSON.parse(storedUser)
55
- // // isLoggedIn = true
56
- // // }
57
- // }
50
+ function handleClientLogout ( ) {
51
+ clearInterval ( tokenCheckInterval ) // 토큰 확인 중지
52
+ localStorage . removeItem ( "token" )
53
+ localStorage . removeItem ( "loginUser" )
54
+ loginUser . value = null
55
+ isLoggedIn . value = false
56
+ }
57
+
58
58
function checkAuth ( ) {
59
- const storedUser = localStorage . getItem ( 'user' ) ;
60
- if ( storedUser ) {
61
- user . value = JSON . parse ( storedUser ) ;
62
- isLoggedIn . value = true ;
59
+ const token = localStorage . getItem ( 'token' )
60
+ const storedUser = localStorage . getItem ( 'loginUser' )
61
+
62
+ if ( token && storedUser && ! isTokenExpired ( token ) ) {
63
+ loginUser . value = JSON . parse ( storedUser )
64
+ isLoggedIn . value = true
65
+ } else {
66
+ logout ( )
63
67
}
64
68
}
65
-
69
+
70
+ function isTokenExpired ( token ) {
71
+ try {
72
+ const payload = JSON . parse ( atob ( token . split ( '.' ) [ 1 ] ) ) // JWT 디코딩
73
+ const currentTime = Math . floor ( Date . now ( ) / 1000 ) // 현재 시간 (초 단위)
74
+ return payload . exp < currentTime // 만료 여부 확인
75
+ } catch ( err ) {
76
+ console . error ( "토큰 디코딩 오류" , err )
77
+ return true // 디코딩 실패 시 만료된 것으로 처리
78
+ }
79
+ }
80
+
81
+ function startTokenCheck ( ) {
82
+ if ( tokenCheckInterval ) return // 중복 실행 방지
83
+ tokenCheckInterval = setInterval ( ( ) => {
84
+ const token = localStorage . getItem ( "token" )
85
+ if ( token && isTokenExpired ( token ) ) {
86
+ logout ( )
87
+ alert ( "세션이 만료되었습니다. 다시 로그인해주세요." )
88
+ }
89
+ } , 300000 ) // 5분마다 확인
90
+ }
91
+
92
+ checkAuth ( )
93
+ startTokenCheck ( )
66
94
67
95
return {
68
- user ,
96
+ loginUser ,
69
97
isLoggedIn,
70
98
login,
71
99
logout,
72
- checkAuth
100
+ checkAuth,
101
+ startTokenCheck,
73
102
}
74
103
} )
75
-
0 commit comments