인프런 커뮤니티 질문&답변

ghoonpark님의 프로필 이미지
ghoonpark

작성한 질문수

코드로 배우는 React with 스프링부트 API서버

Refresh Token 만료시 로그아웃 및 페이지 이동 처리

작성

·

133

0

Refresh Token마저 만료되었을때 Todo 또는 Product 메뉴를 누르면 자동으로 로그아웃 및 메인페이지로 이동하려고 합니다.

 

강의 내용대로 쿠키 member를 삭제하여 로그아웃 처리는 하였으나 '/' Path로 이동은 안되어서 방법을 찾지 못하여 질문드립니다.

 

추가로 토큰만료시 jwtUtil의 beforeRes에서 쿠키를 삭제하였으나 todo 페이지가 호출 및 페이지 이동이 안되어서 todo 페이지 나오기전에 페이지 이동을 하고싶습니다.

 

ListComponent의 useEffect에 hook을 사용했으나 실제로 이동안 되고 jwtUtil, todoAPI 는 모두 규칙 위반으로 hook이나 navigate를 사용할수 없더라구요.

 

어떻게 해야할까요..

 

 

답변 1

0

구멍가게코딩단님의 프로필 이미지
구멍가게코딩단
지식공유자

저도 집필하는 동안 이 부분을 고민했습니다.

제가 생각하는 방식은

 

1.jwtUitl에서는 refreshJWT를 했을 때 잘못된 결과가 나오면 예외를 발생시킵니다.

const result = await refreshJWT(memberCookieValue.accessToken, memberCookieValue.refreshToken)

console.log("refreshJWT RESULT", result)

if(!result.accessToken || result.accessToken == 'undefined'
    || !result.refreshToken || result.refreshToken == 'undefined'){
  throw new Error('LOGIN_REQUIRE')
}

  1. 각 화면에서는 catch( )를 이용해서 원하는 제어를 지정합니다.

const {moveToLogin} = useCustomLogin()

//serverData는 나중에 사용
const [serverData, setServerData] = useState(initState)


useEffect(() => {

  getList({page,size}).then(data => {
    console.log(data)
    setServerData(data)
  }).catch(err => {
    console.log("------------------------------")
    console.log("------------------------------")
    console.log("------------------------------")
    moveToLogin()
  })

}, [page,size, refresh])

 

이 부분을 공통으로 빼려면 어떻게 하는게 좋을까 고민했었는데요.. 우선은 jwtUtil은 문제가 발생했을때 예외를 발생하는 것이 맞고, API 서버의 호출시에 추가적인 작업을 할 수 있도록 하는 것이 좋다고 생각합니다.

예를 들어 todo API 호출시에 추가적인 콜백 처리를 하고

export const getListLogin = async ( pageParam , errHandlerr) => {

  const {page,size} = pageParam

  try {
    const res = await jwtAxios.get(`${prefix}/list`, {params: {page: page, size: size}})
    return res.data
  }catch(err) {
    errHandlerr()
  }
}

 

컴포넌트에서는 예외 발생시 이동을 지정하는 것이 무난할 듯 합니다.

const {moveToLogin} = useCustomLogin()

//serverData는 나중에 사용
const [serverData, setServerData] = useState(initState)


useEffect(() => {

  getListLogin({page,size}, moveToLogin).then(data => {
    console.log(data)
    setServerData(data)
  })

}, [page,size, refresh])

 

 

 

 

ghoonpark님의 프로필 이미지
ghoonpark
질문자

감사합니다. 말씀해주신 내용으로 다시 진행해보겠습니다.

 

추가 질문이 두가지가 있는데

1. 마지막에 hook을 통해 로그인 화면으로 이동은 성공했으나 BasicMenu의 Todo, Product 버튼은 남아있어 렌더링을 위해 강제로 window.location.reload()를 발생시켰습니다.

이렇게 하는것이 맞을까요? 오히려 모든 상태를 초기화 시키는게 나은건지..

  1. navigate의 replace값을 true로 지정했는데도 뒤로가기를 여러번 누르면 마치 stack에 쌓인 값처럼 이전 페이지가 뜨더라구요. /todo/list 또는 기타 페이지로...

    Chome 사용중이고 혹시 몰라 카페 자료의 코드를 복사 붙여넣기 했습니다. 어딘가 실수한것일까요?

     

혹시 위 두가지 질문에도 도움을 주실 수 있으실까요..?

구멍가게코딩단님의 프로필 이미지
구멍가게코딩단
지식공유자

로그아웃을 했으므로 완전히 어플리케이션을 초기화하는 것도 아주 나쁜 방법은 아닙니다.

굳이 예외가 발생해서 로그아웃될때 뭔가 추가적인 정보를 심어서 로그인으로 이동했을때 초기화하는 코드들을 호출하시는 방법을 고려해 보시면 좋겠습니다.

 

2번 문제는 사실 브라우저를 좀 타긴해도.. 흠..질문보고 다시 확인했을때 문제가 보이진 않았습니다만.. 좀 더 정확하게 상황을 설명해 주시면 감사하겠습니다.

 

ghoonpark님의 프로필 이미지
ghoonpark

작성한 질문수

질문하기