[트러블슈팅] 간헐적으로 모든 api가 안 돌아가고 러닝 data가 날아갔던 버그
현재 Runnect에서 open api를 제외한 나머지 api는 모두 accessToken과 refreshToken을 request header에 넣어서 보내주고 있다. token이 유효해야 api를 정상적으로 이용할 수 있다. 만약 token이 만료되면 서버로 보내서 갱신을 시켜주도록 하고있다.
그런데 가끔 open api를 제외한 나머지 모든 api가 안 돌아가는 문제가 있었다. "토큰 갱신에 문제가 있었나?"하고 수집된 log를 보면 역시나 token이 만료됐다는 error message가 날아왔다.
난처했던 건 이러한 버그가 갱신 logic 상에 문제가 없어보이는 상황에서 간헐적으로 발생한다는 것이었다. 이 때문에 단순히 유효한 token이 아니라는 message만으로는 어떠한 상황 때문에 발생하는 것인지 파악이 어려웠다.
서버 파트원들과 같이 얘기를 나눠봤는데 만료된 token이 갱신이 가능할 때가 있고 불가능한 때가 있다고 했다. 기본적으로 token이 2시간마다 만료가 되면 갱신을 시켜줄 수 있는데 2주가 지나면 아예 갱신이 불가능하다고 했다. 2주라는 기간은 늘릴 수 있긴 한데 보안 이슈 때문에 통상적으로 2주로 정한다고 했다.
따라서 2주가 지나면 login 재요청을 해서 아예 새 token을 발급받게 해주어야 한다고 했다.
상황을 정리해보면 현재 우리는 유효/만료 여부에 관계 없이 token을 들고 있기만 하면 자동로그인이 되게 하고 만약 token이 만료되었다면 api 활용 시 갱신되게끔 해놨다. 그런데 우리는 2시간마다 만료시 갱신 요청만 하고 있을 뿐, 2주 뒤 아예 token이 사용 불가 상태가 되어버렸을 때에 대해선 분기 처리를 안 해주었기 때문에 일단 로그인은 됐지만 이후 api 통신이 전혀 안 되는 것이었다.
이에 우리는 서버에서 보내주는 만료 메세지에 따라(2주가 지나면) login 페이지를 띄워주게끔 조치를 취해주는 것으로 1차적인 문제를 해결했다.
클라 단에서만 얘기를 계속 나눴으면 파악 못했을 이슈였다. 하지만 2차적인 문제가 또 있었다.
만약 러닝을 뛰고 나서 기록을 서버에 올리려고 하는데 token의 2주 만료 기간이 딱 그때랑 겹쳐서 로그인 페이지가 띄워지는 상황이라면 뛰었던 러닝 data가 날아가게 된다.
모종의 이유로 열심히 작업했던 파일이 다 날아간다면 얼마나 화가 나겠는가? 유저 입장에서 치명적인 이슈라 생각했고 대응 방법을 고민했다.
아래의 링크는 해당 이슈에 대해 팀원과 논의한 PR인데 지금의 logic을 버리고 SplashActivity에서부터 토큰이 비어있는 걸 확인한 다음 로그인 화면으로 전환하는 방식으로 대응하기로 했다.
https://github.com/Runnect/Runnect-Android/pull/257