개발자
안녕하세요, 스타트업에 취업한 신입 프론트 개발자입니다. 지금 회사에서 jwt 토큰으로 로그인을 구현하고있는데, 지금 3일째 붙잡고있는데 전혀 해결이 안되서 너무 막막합니다 ... 페이지가 처음 열릴 때 load_board()라는 함수를 실행합니다. 이는 axios 통신을 하는 함수이고 만약 res.data=== 'reload' 라면 refresh_token()함수를 실행한 후 다시 load_board()를 실행하고 싶습니다. 이걸 어떻게하면 좋을까요 ?... 제가 해봤던 방법은 1번 .then((res) =>{ setIsRefresh(true); } useEffect(()=>{ if(isRefresh){ refresh_token(); setIsRefresh(false); load_board() },[isRefresh]) 이 방법은 되긴되나 서버와 통신을 최소 3번씩하고 ... (refresh_token()를 실행하기전에 자꾸 load_board()를 실행해서...) 2범 async await을 써보니 useEffect(()=>{ const res = load_board(); if(res.data ==='reload'){ await refresh_token(); await load_board} ... },[]) 이건 확실히 한번만 실행이되는데 refresh_token()의 리스폰이 오기전에 load_board()를 실행하니까 의도한대로 안돼요 . . . . . . . . 이걸 어쩌면 좋을까요. . . . . .
답변 4
res.data 가 왜 reload인 건가요? 엑세스토큰이 만료됌을 알려주는 건가요? 그렇다면 200 응답이 아니라 400번대 에러 응답을 서버에서 보내주는게 더 노멀한 방법입니다. 엑세스 토큰 만료시에 자동으로 토큰 리프래시 후 재요청을 하고 싶은거면 axios interceptor를 키워드로 찾아보시는걸 추천드려요
익명
작성자
2024년 03월 18일
그렇군요! 저도 백엔드분도 jwt가 처음이라 많이 헤메게되네요. 감사합니다!
익명
작성자
2024년 03월 19일
안녕하세요! 어떤걸 전역으로 관리하라는 말씀이실까요? 현재 refresh_token() (토큰발급해주는함수)는 export 되어 여러 페이지에서 호출이 가능하게 되어있기는 합니다.
익명
작성자
2024년 03월 19일
안녕하세요! 덕분에 해결되었습니다 정말 감사합니다 !!
익명
작성자
2024년 03월 19일
안녕하세요! 말씀해주신 방법이 아래와 같은게 맞을까요 ? refresh_token()는 axios로 서버에서 토큰을 재발급 받아 스토리지에 저장하는 함수입니다 ! useEffect(() => { const loadData = async () => { try { const res = await load_bord(); if (res.data === "reload") { await refresh_token(); await load_bord(); } else { console.log(res.data); } } catch (error) { console.error("Error while loading data:", error); } }; loadData(); }, []); 해당 코드를 실행했을 때, 순차 실행이 되지만 refresh_token()의 then이 출력되기전에 load_boar()가 실행되버려서 ... 혹시 이렇게 쓰는게 아닌걸까요 ㅜ ㅜ
익명
작성자
2024년 03월 19일
안녕하세요! promise반환을 다시 해보니 해결되었어요! 도움주셔서 감사합니다!!
안녕하세요, 지나가다가 댓글남깁니다! 토큰 처리방식과는 별개로 질문자님께서 다른 댓글에 제공해주신 코드만을 보았을 때 로직 상은 큰 문제가 없어 보입니다! 다만, 그럼에도 await refresh_token(); await load_bord(); 부분이 동기적으로 실행되지 않는다면 refresh_token 함수 내부의 비동기 처리 방식을 의심해 볼 수 있을듯 합니다. 혹시 내부 구현 방식이 어떻게 되어있을까요? 아래는 제가 예상해본 방식입니다!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
// 1. 옳은 예: await을 통해 동기적으로 fetch async function refresh_token() { const { data: newToken } = await fetchToken(); console.log('New Token: ', newToken); localStorage.setItem('token', newToken); // localStorage는 동기적 실행을 보장 } // 2. 틀린 예: then으로 promise를 resolve시키지만, 정작 then 프로세스가 끝나는 것을 기다리지는 않음 async function refresh_token() { fetchToken().then(res => { console.log('New Token: ', res.data); localStorage.setItem('token', res.data); }); } // 2-1. 틀린 예를 활용한 동작 가능 코드 async function refresh_token() { await fetchToken().then(async res => { console.log('New Token: ', res.data); localStorage.setItem('token', res.data); }); }
익명
작성자
2024년 03월 19일
안녕하세요! 어쩐지 이래서 동작이 원하는대로 안되었던 거였군요 !! 정말 도움이 되었습니다 감사합니다!!
지금 가입하면 모든 질문의 답변을 볼 수 있어요!
현직자들의 명쾌한 답변을 얻을 수 있어요.
이미 회원이신가요?
지금 가입하면 모든 질문의 답변을 볼 수 있어요!