본문 바로가기
프로그래밍 개발/IT 서비스 개발 운영

실제 서비스 운영 중 생긴 치명적인 인증(Token) 이슈 트러블슈팅

by Jinseok Kim 2023. 8. 17.
반응형

실제 서비스 운영 중 생긴 치명적인 인증(Token) 이슈 트러블슈팅

지금 운영 중인 서비스에서 과거 가장 치명적이면서 급박했던 이슈 발생과 해결까지의 상황을 기록하였습니다. 다시는 이런 일이 벌어지지 않았으면 하는 마음으로 기록을 남겨봅니다.

치명적인 수준까지 간 이유는 사용자가 앱을 실행시키면 사용 자체를 하지 못하는 이슈였기 때문이었습니다. 로그인 인증 기능/로직에 관련된 원인으로 매우 영향이 큰 이슈였습니다.

 

 

 

 

이슈 발생


💡 장애에 대해 간단한 요약 설명

 

모두가 아닌 특정 유저들이 앱 실행 후 스플래시 화면에서 넘어가지 않는 이슈를 운영팀에서 보고 받아 퇴근시간 이후 이슈가 발생하는 불상사가 일어났습니다.

퇴근 시간이 지난 이후에도 저희 팀은 퇴근 생각할 틈도 없이 바로 대응에 들어갔었습니다.

 

 

 

 

 

이슈 현상


💡 장애 현상에 대한 자세한 설명
  • 백그라운드에 오래 놔둔 뒤, 앱 실행시 스플래시 화면에서 넘어가지 않음.
  • ios / aos 를 가리지 않고, 백그라운드 오래 놔둔 유저들에게 발생
  • 전날은 접속이 되었지만, 당일 접속이 되지 않는다고 함.
  • 스플래시 화면에서 앱을 종료하고, 다시 실행해도 되지 않는다고 함.

 

 

 

 

이슈 원인


💡 장애의 원인이 무엇이었는지
  • 사용자가 앱에 가지고 있던 액세스 토큰 만료 됨 -> 앱 실행 후 Refresh Token으로 토큰 갱신 API를 호출했으나, 401 인증 에러로 인해 토큰 갱신이 되지 않음. 원래 토큰 갱신 API는 Refresh Token 만 있으면 되어야 하는데, Refresh Token을 보냈더니 Access Token 가 만료됐다는 비정상적인 Error return.
  • 과거 구현했던 인증 토큰 처리 로직이 부실했고 미처 발견하지 못한 구멍을 찾지 못하고 보안하지 못했던 것이 큰 원이이었음.
  • 토큰 갱신 API 호출 시 에러가 났을 때, 프론트단에서 token을 지우고, 로그아웃 처리를 해야 하는데 해당 로직이 없음.

 

위의 원인들을 보면 알 수 있듯이 서버/프론트 둘 다 에러 사후처리를 하지 않아 동시 다발적으로 일어나 이슈를 발생시키게 되었습니다.

서비스 첫 런칭 후 날부터 이슈가 발생하기까지의 날까지의 시간이 바로 Access Token이 만료되는 시간과 일치하는 것을 보아 토큰이 만료가 될 때까지 이슈가 발현되지 않아 미처 발견하지 못했던 것이었습니다.

 

그리고 프론트단에서는 스플래쉬 화면이 인증/로그인 API 호출 관련된 함수 작동이 끝난 후 사라지는 것인데 프론트단의 API 호출을 담당하는 Axios interceptor 함수 안에서 인증/로그인 관련 API 호출 후 발생할 수 있는 Error 처리가 안되어 서버에서의 아예 함수가 진행되지 않고 멈춰버려 스플래쉬 화면 또한 멈춰있던 것이 원인이었습니다.

 

 

 

이슈 해결


 

💡 해당 이슈를 어떻게 조치해서 해결했는지, 가능하다면 시간 순서대로 기록

 

 

이날 있었던 일들을 연대기식으로 기록하였습니다.

더 자세히 이 사태가 일어난 궁극적인 원인과 바로 이슈 장애에 대하여 대응하지 못한 팀의 부족한 점 등등을 깨닫기 위한 목적이었습니다.

 

 

History

AM 11:44 앱이 실행되지 않는다는 제보가 옴  
     
앱버전 : 1.5.5 운연팀 직원분의 이슈 제보 (Android 갤럭시 20)  
     
AM 11:52 한국에서 1.5.5 잘 작동하는 것 확인 팀 PM분 확인
     
PM 12:27 Android APK 버젼 이슈인 것 같아 앱 재설치 운영팀에 안내 팀 CTO분의 안내
     
PM 4:35 아직도 앱이 실행되지 않는다는 제보가 옴 (Iphone 11pro, 1.5.5) -> iOS / Android OS별 상관없는 공통 이슈 인식  
     
     
PM 7:51 토큰 갱신 API가 원인인 것 발견 -> 퍼블릭 API 로 전환 -> CTO님 수정된 토큰 갱 API 긴급 배포 -> 서버 배포완료  
     
     
PM 7:56 다시 정상 접속 확인 운영팀 확인
     

 

 

 

 

이슈 재발 방지 방안


💡 장애가 다시 발생하지 않도록 대책 수립하기로 하였습니다.
  • 원인 파악 시간 단축 필요 -> 에러 트래킹(Sentry) 방식 개선하기로 결정
  • 인증 로직 개편

 

 

1. 인증 개선 대상

  • Access Token 만료 시간 : 5분으로 정립
  • Background -> Restart 일 때 : 앱 프론트단에서 백그라운드 모드가 10분 이상일 때 다시 앱 들어오면 앱 전체 ㄴ재시작
  • Refresh Token 만료 시간 : 100 years

 

 

2. 앱 스플래쉬 화면 넘어가지 않는 이유 분석과 개선

  • 결론은 스플래쉬 화면이 넘어가지 않은 가장 큰 원인은 여러 가지 서버/프론트 복합적인 Error 처리가 안된 이슈였습니다.
    • 원인 분석 완료
  • 토큰 갱신 API에서 잘못된 에러 Return
    • 서버 수정 및 개선 배포
  • Axios response interceptor Error 처리가 안되어있어서 Axios을 쓰는 함수의 호출이 끝나지 않는 이슈가 스플래쉬 화면을 넘어가지 않게 하는 원인이었음
    • Axios response interceptor 401 처리(함수 호출 끝나고 스플래쉬 화면 무사히 사라지도록) 및 로그아웃 로직 추가

 

 

3. Refresh Token 로그아웃

로그아웃 요청 request

  • 기존 적용되어 있는 불확실한 로그아웃 호출 함수 모두 삭제 및 개선

Axios response interceptor

  • Axios response Interceptor에서 401 처리, 토큰 삭제, 로그아웃 처리함
반응형

댓글