accessToken
자동 재요청이 무한 재귀 호출 구조로 인해 과도하게 발생하고 있음을 확인하였다.[참고] 브라우저 네트워크 탭
[참고] 서버 측 로그
기존 checkTokenExp
함수는 토큰 만료 확인, accessToken 재발급 요청, 재귀 호출을 동시에 처리하여 과도한 요청의 원인이 되었다.
// 토큰 만료 시간 측정
const checkTokenExp = useCallback(async () => {
const exp = getLoginExp()
if (typeof exp !== 'number') return
const currentTime = Math.floor(Date.now() / 1000)
const expired60SecondsAgo = exp - (currentTime - MINUTE_TO_SEC) // 현재(sec) - 60(sec) = 1분 전 토큰 만료
setTimeScale(Number(expired60SecondsAgo))
if (exp <= currentTime - MINUTE_TO_SEC) {
const isSuccess = await requestNewAccessToken()
if (isSuccess) checkTokenExp()
}
}, [])
// setInterval 을 통해
useEffect(() => {
const timeId = setInterval(checkTokenExp, 1000)
return () => {
clearTimeout(timeId)
}
}, [checkTokenExp])
해당 함수를 토큰 만료 여부 판단 전용 함수로 수정하고, 재발급 요청은 updateToken()
함수에서 isExpire
상태 변화에 따라 처리하도록 분리하였다.
기존에는 재발급 성공 시 checkTokenExp()
를 재귀 호출하여 setInterval
과 중복 실행되는 문제가 있었다.
이 부분을 제거하고, isExpire
상태가 true일 경우에만 토큰을 갱신하도록 변경하였다.