@@ -2,7 +2,7 @@ import axios from "axios";
22
33const instance = axios . create ( {
44 baseURL : import . meta. env . VITE_BASE_URL ,
5- timeout : 5000 ,
5+ timeout : 30000 ,
66 headers : { "Content-Type" : "application/json" } ,
77} ) ;
88
@@ -22,13 +22,13 @@ const processQueue = (error, token = null) => {
2222
2323instance . interceptors . request . use (
2424 ( config ) => {
25- const accessToken = localStorage . getItem ( "accessToken" ) ;
26- if ( accessToken ) {
27- config . headers . Authorization = `Bearer ${ accessToken } ` ;
25+ const token = localStorage . getItem ( "accessToken" ) ;
26+ if ( token ) {
27+ config . headers . Authorization = `Bearer ${ token } ` ;
2828 }
2929 return config ;
3030 } ,
31- ( error ) => Promise . reject ( error )
31+ ( error ) => Promise . reject ( error ) ,
3232) ;
3333
3434instance . interceptors . response . use (
@@ -53,43 +53,64 @@ instance.interceptors.response.use(
5353
5454 try {
5555 const refreshToken = localStorage . getItem ( "refreshToken" ) ;
56+ const accessToken = localStorage . getItem ( "accessToken" ) ;
57+ if ( ! refreshToken ) {
58+ throw Object . assign ( new Error ( "Missing refresh token" ) , {
59+ response : { status : 401 } ,
60+ } ) ;
61+ }
62+
63+ const refreshHeaders = accessToken
64+ ? { Authorization : `Bearer ${ accessToken } ` }
65+ : { } ;
66+
5667 const res = await axios . post (
5768 `${ import . meta. env . VITE_BASE_URL } /api/v1/auth/reissue` ,
58- { refreshToken : refreshToken }
69+ { refreshToken } ,
70+ {
71+ headers : refreshHeaders ,
72+ timeout : instance . defaults . timeout ,
73+ } ,
5974 ) ;
6075
6176 if ( res . data . status === "success" ) {
62- const { accessToken, refreshToken : newRefreshToken } = res . data . data ;
77+ const tokenPayload = res . data . data ?? res . data ;
78+ const { accessToken : newAccessToken , refreshToken : newRefreshToken } =
79+ tokenPayload ?? { } ;
80+ if ( ! newAccessToken ) {
81+ throw new Error ( "Token refresh response missing access token" ) ;
82+ }
83+
84+ localStorage . setItem ( "accessToken" , newAccessToken ) ;
85+ if ( newRefreshToken ) {
86+ localStorage . setItem ( "refreshToken" , newRefreshToken ) ;
87+ }
88+ localStorage . setItem ( "tokenExpiry" , Date . now ( ) + 60 * 60 * 1000 ) ;
6389
64- localStorage . setItem ( "accessToken" , accessToken ) ;
65- localStorage . setItem ( "refreshToken" , newRefreshToken ) ;
90+ originalRequest . headers . Authorization = `Bearer ${ newAccessToken } ` ;
91+ processQueue ( null , newAccessToken ) ;
6692
67- originalRequest . headers . Authorization = `Bearer ${ accessToken } ` ;
68- processQueue ( null , accessToken ) ;
69-
7093 return instance ( originalRequest ) ;
7194 } else {
72- const failError = new Error ( "토큰 리프레시가 실패했어요" ) ;
73- processQueue ( failError , null ) ;
74- return Promise . reject ( failError ) ;
95+ throw new Error ( "Token refresh failed" ) ;
7596 }
7697 } catch ( refreshError ) {
7798 processQueue ( refreshError , null ) ;
78-
99+
79100 const status = refreshError . response ?. status ;
80101 if ( status === 401 || status === 403 ) {
81- console . warn ( "세션이 만료되었습니다. 다시 로그인해주세요 ." ) ;
102+ console . warn ( "세션이 만료되어 로그아웃됩니다 ." ) ;
82103 localStorage . clear ( ) ;
83104 window . location . href = "/login" ;
84105 }
85-
86106 return Promise . reject ( refreshError ) ;
87107 } finally {
88108 isRefreshing = false ;
89109 }
90110 }
111+
91112 return Promise . reject ( error ) ;
92- }
113+ } ,
93114) ;
94115
95- export default instance ;
116+ export default instance ;
0 commit comments