@@ -10,6 +10,7 @@ export const instance = axios.create({
10
10
baseURL : process . env . REACT_APP_BASE_URL ,
11
11
timeout : 10000 ,
12
12
} ) ;
13
+
13
14
let isRefreshing = false ;
14
15
let refreshSubscribers : ( ( token : string ) => void ) [ ] = [ ] ;
15
16
@@ -18,6 +19,10 @@ const onRefreshed = (token: string) => {
18
19
refreshSubscribers = [ ] ;
19
20
} ;
20
21
22
+ const subscribeTokenRefresh = ( callback : ( token : string ) => void ) => {
23
+ refreshSubscribers . push ( callback ) ;
24
+ } ;
25
+
21
26
instance . interceptors . request . use (
22
27
( config ) => {
23
28
const accessToken = getCookie ( 'access_token' ) ;
@@ -43,21 +48,25 @@ instance.interceptors.response.use(
43
48
const refreshToken = getCookie ( 'refresh_token' ) ;
44
49
45
50
if ( ! refreshToken ) {
51
+ console . warn ( '리프레시 토큰 없음. 로그인 필요함.' ) ;
46
52
window . location . href = '/login' ;
47
53
return Promise . reject ( error ) ;
48
54
}
49
55
50
56
if ( originalRequest . _retry ) {
57
+ console . warn ( '이미 리트라이한 요청인데 실패함.' ) ;
58
+ window . location . href = '/login' ;
51
59
return Promise . reject ( error ) ;
52
60
}
61
+
53
62
originalRequest . _retry = true ;
54
63
55
64
if ( isRefreshing ) {
56
65
return new Promise ( ( resolve ) => {
57
- refreshSubscribers . push ( ( token : string ) => {
66
+ subscribeTokenRefresh ( ( newToken ) => {
58
67
originalRequest . headers = new AxiosHeaders ( {
59
68
...originalRequest . headers ,
60
- Authorization : `Bearer ${ token } ` ,
69
+ Authorization : `Bearer ${ newToken } ` ,
61
70
} ) ;
62
71
resolve ( instance ( originalRequest ) ) ;
63
72
} ) ;
@@ -67,29 +76,36 @@ instance.interceptors.response.use(
67
76
isRefreshing = true ;
68
77
69
78
try {
79
+ console . log ( '토큰 리프레시 요청' ) ;
70
80
const res = await reIssueToken ( refreshToken ) ;
71
81
const newAccessToken = res . access_token ;
82
+ const newRefreshToken = res . refresh_token ;
83
+
84
+ if ( ! newAccessToken || ! newRefreshToken ) {
85
+ throw new Error ( '리프레시 응답이 유효하지 않음' ) ;
86
+ }
72
87
73
88
setCookie ( 'access_token' , newAccessToken , {
74
89
expires : new Date ( res . access_token_expired_at ) ,
75
90
} ) ;
76
91
77
- setCookie ( 'refresh_token' , res . refresh_token , {
92
+ setCookie ( 'refresh_token' , newRefreshToken , {
78
93
expires : new Date ( res . refresh_token_expired_at ) ,
79
94
} ) ;
80
95
81
- isRefreshing = false ;
82
96
onRefreshed ( newAccessToken ) ;
83
-
84
97
originalRequest . headers = new AxiosHeaders ( {
85
98
...originalRequest . headers ,
86
99
Authorization : `Bearer ${ newAccessToken } ` ,
87
100
} ) ;
101
+
88
102
return instance ( originalRequest ) ;
89
103
} catch ( err ) {
90
- isRefreshing = false ;
104
+ console . error ( '토큰 재발급 실패:' , err ) ;
91
105
window . location . href = '/login' ;
92
106
return Promise . reject ( err ) ;
107
+ } finally {
108
+ isRefreshing = false ;
93
109
}
94
110
}
95
111
0 commit comments