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

swiper님의 프로필 이미지
swiper

작성한 질문수

[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!

Dio onError Interceptor 작업하기

토큰 재발급 관련 질문입니다.

해결된 질문

작성

·

388

·

수정됨

1

안녕하세요. 기초를 수강하고, 중급 강의 절반 정도 수강한 학생입니다. 우선, 기초와 중급 모두 좋은 퀄리티의 영상과 강의를 올려주셔서 정말 감사드린다는 말씀 드립니다!

현재 강의와는 별개로 따로 진행하고 있는 프로젝트에서 한 페이지에 여러 api 호출을 진행하는 과정에서 access 토큰이 만료되었을 때의 상황에서 문제를 겪고 있습니다.

예를 들어, 3개의 api를 호출하여 FutureBuilder 3개 혹은 Future.wait으로 3개의 데이터를 가져오는 상황입니다.

우선, 모든 요청에 access 토큰 만료를 백엔드에서 계산하고 있습니다. 만료가 되었을 때, 프론트로 401이 던져지고 onError에서 이를 캐치하여 재발급 api를 호출하고 다시 토큰을 갱신하여 secure storage에 저장하고 있습니다.
(백엔드에서는 access 토큰이 만료되어 재발급 요청을 받으면, 유효한 refresh 토큰인지 확인하여 유효시 두 토큰 모두 갱신하여 재발급해줍니다.)

이 과정에서 3개의 모든 api 요청에 대한 재발급을 시도하여 3번의 재발급 요청이 이루어지게 됩니다. 그리고나서 3개의 모든 api 요청에 다시 resolve를 하게 되는데, 이러한 순서의 로직이 맞는 부분인지 궁금합니다.

어려움을 겪고 있는 부분에는 3개의 요청 중 2개의 요청은 요청된 시간이 밀리세컨드 단위로 다르지만, 재발급 된 토큰이 동일해 요청이 성공적으로 진행됩니다. (5개라면 2개가 성공할 때가 있고, 3개가 성공할 때가 있고 시시각각 변합니다..)
하지만, 남은 api 요청은 앞선 요청에서 이미 새롭게 토큰이 발급되었기 때문에 갱신되지 않은 토큰으로 요청을 보내게 되고, 서버에서는 토큰이 새로 갱신되었기 때문에 토큰이 유효하지 않다는 오류가 발생하게 됩니다.

여러 레퍼런스를 참고하여 QueuedInterceptorsWrapper 및 일부 코드를 추가하여 임시로 해결해놓은 상태이지만, 근본적인 원인 해결이 되지 않았다고 생각하여 질문드립니다.
(여전히 5개의 요청이라면, 5개의 재발급 요청을 보내는 상황입니다...)

아직 남은 강의를 모두 들어보지 않아 해결하지 못하는 문제일 수 있지만, 미리 질문부터 드리는 점 양해 드립니다,,ㅠ

서둘러 완강해보도록 하겠습니다!
감사합니다 :)

답변 1

1

코드팩토리님의 프로필 이미지
코드팩토리
지식공유자

안녕하세요!

API 요청은 일반적으로 parallel하게 진행되기 때문에 토큰이 만료될 경우 여러번 토큰 갱신 요청이 들어가는건 어쩔 수 없습니다.

만약에 이부분을 막고싶다면 serial하게 순차적으로 요청을 보내야하는데 득보다 손실이 훨씬 커집니다.

하나의 안전장치를 더 추가하는 방법으로 약간의 보완을 할 수는 있습니다.

JWT는 JSON 정보를 base64로 변환한 것 뿐입니다.

클라이언트에서 비밀번호를 모르기때문에 시그니처를 검증 할 수는 없지만 base64 디코드를 해서 JSON을 까본다음 유효기간이 얼마나 남았는지 확인은 충분히 가능합니다.

이를 통해 만료되지 않았더라도 시간이 충분히 남지 않았다면 미리 갱신을 한다던지 백그라운드에서 갱신을 지속적으로 해준다던지 할 수 있습니다.

하지만 제 개인적인 의견은 이미 구현해두신 방법이 크게 나쁘지 않다는 생각입니다.

감사합니다!

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

순차적으로 요청을 보내는 방법도 생각해봤었는데, 득보다 손실이 훨씬 큰 방법이라는 말씀에 도움이 되었습니다!

만료 시점 이전에 미리 계산하여 재발급 요청을 보내는 방법도 고민을 하고 있었는데, 현재도 괜찮다고 말씀해주셔서 우선 이대로 진행해보려고 합니다.

그리고 지속적으로 현재 코드를 개선할 수 있는 방법과 방향을 계속 생각해보겠습니다 ㅎㅎ

답변 정말 감사드립니다!! :)

swiper님의 프로필 이미지
swiper

작성한 질문수

질문하기