실제 서비스 운영 중 생긴 치명적인 인증(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 처리, 토큰 삭제, 로그아웃 처리함
'프로그래밍 개발 > IT 서비스 개발 운영' 카테고리의 다른 글
확장 가능 글로벌 서비스 멀티 타임존 도입기 (0) | 2023.08.28 |
---|---|
Front End 시점에서의 서비스 대량 트래픽 발생 그리고 대응 (0) | 2023.08.24 |
실제 서비스 운영중 생긴 API 인증(Certified) 이슈 트러블슈팅과 Axios 인터셉터(interceptors) (0) | 2023.08.21 |
서비스 운영 A/B 테스트 적용기 (feat. Firebase) (0) | 2023.08.14 |
IT 서비스 개발 운영 - 글로벌 서비스 다국어 지원 기능 구현하기 (feat. i18next) (0) | 2023.08.09 |
댓글