Pogl
운영·

사흘 동안 안드로이드 앱에서 로그인이 되지 않았습니다

10월 20일부터 사흘 동안 안드로이드 앱 로그인이 거의 되지 않았고, 저희는 사용자 제보로 처음 알았습니다. 로그인이 실패한 원인과, 다음에는 먼저 알아채기 위해 바꾼 점을 적었습니다.

먼저 훑어보고 정리했어요
  • 10월 20일부터 22일 오전까지 안드로이드 앱 로그인 성공률이 평소 97%에서 3%로 떨어졌고, 저희는 사용자 제보로 처음 알았습니다.
  • 로그인 뒤 앱으로 돌아오는 주소를 저희 앱을 지정해서 여는 방식으로 바꿨습니다. 웹만 수정했기 때문에 이미 설치된 앱에서도 바로 로그인이 됐습니다.
  • 서버 상태 대신 사용자가 로그인과 가입, 만들기를 끝까지 마쳤는지 보는 경보를 만들고, 켜기 전에 지난 2주 기록에 돌려 봤습니다.

10월 22일 오전에 제보 하나를 받았습니다. 안드로이드 앱에서 로그인을 하면 앱으로 돌아오지 않는다는 내용이었어요.

찾아보니 한두 사람의 일이 아니었습니다. 평소 97%이던 앱 로그인 성공률이 20일 아침부터 3%였습니다. 사흘 가까이 로그인하려던 분들 대부분이 로그인 화면에서 앱으로 돌아오지 못했습니다.

그 사흘 동안 저희는 이 문제를 알지 못했습니다. 서버 경보는 한 번도 울리지 않았어요. 서버에는 실제로 문제가 없었기 때문입니다.

보안을 강화하려던 변경이 로그인을 실패하게 만들었습니다

시작은 10월 18일에 준비한 앱 1.5.0이었습니다. 로그인을 마친 뒤 로그인 코드를 저희 앱만 받을 수 있는 웹 주소로 돌려받게 바꾼 판입니다. 안드로이드에서는 이런 주소를 앱 링크라고 부릅니다. 등록해 두면 그 주소를 열 때 브라우저 대신 앱이 열려요.

20일 아침 새 판이 사용자 기기에 설치되면서 성공률이 떨어졌습니다. 이 경우를 확인하지 못한 채 판을 내보낸 건 제 책임입니다.

크롬은 같은 주소 안에서는 앱을 열지 않았습니다

앱 로그인은 다음 순서로 진행됩니다. 앱이 크롬 맞춤 탭으로 로그인 화면을 띄웁니다. 앱 위에 잠깐 겹쳐 뜨는 크롬 창이에요. 소셜 로그인을 마치면 저희 사이트의 복귀 주소로 넘어가고, 안드로이드가 그 주소를 보고 앱을 엽니다.

그런데 로그인 화면과 복귀 주소가 같은 사이트 주소에 있었습니다. 크롬은 보고 있던 사이트 안에서 일어나는 이동은 앱에 넘기지 않고 탭 안에서 그냥 엽니다. 자동으로 넘어가는 이동도, 대비용으로 둔 [앱으로 돌아가기] 단추도 같은 주소를 열었기 때문에 같은 페이지만 다시 열렸어요.

기록에도 같은 내용이 남아 있었습니다. 21일 오후 2시부터 30분 동안 로그인 코드는 25개 만들어졌고 복귀 페이지는 50번 넘게 열렸는데, 앱이 코드를 받아 간 건 한 번도 없었습니다. 앱 링크 설정이나 서명이 틀렸을 수도 있어서 에뮬레이터에서 재현해 봤지만, 설정과 서명에는 문제가 없었습니다.

안드로이드 앱크롬 맞춤 탭로그인 화면소셜 로그인복귀 주소로 이동같은 호스트10월 20일 ~ 22일 오전같은 호스트라 크롬이 탭 안에서 엶앱으로 돌아오지 못함성공률 3%고친 뒤앱 패키지를 지정한 intent://로 엶앱이 열리고코드를 로그인 세션으로 교환
로그인 화면과 복귀 주소가 같은 호스트에 있어 크롬이 이동을 앱으로 넘기지 않았다. 고친 뒤에는 앱 패키지를 지정한 인텐트 주소로 열어 크롬이 바로 앱에 넘긴다.

앱을 지정해서 여는 주소로 바꿨습니다

복귀 주소를 여는 방식을 바꿨습니다. 같은 사이트 주소를 그대로 여는 대신, 저희 앱 패키지 이름을 적은 안드로이드 인텐트 주소(intent://)로 엽니다. 크롬은 이 주소를 적힌 앱에만 넘기기 때문에 다른 앱이 이 주소를 대신 받을 수도 없습니다. 혹시 탭이 그대로 남으면 띄우는 단추도 같은 방식으로 엽니다.

22일 오전 10시 29분에 고쳤습니다. 웹 쪽만 바꾼 수정이라 앱을 새로 받지 않아도 설치되어 있던 앱에서 바로 로그인이 됐어요. 에뮬레이터에서도 단추를 누르든 안 누르든 앱이 열리는 걸 확인했습니다.

사용자가 작업을 끝까지 마쳤는지 보는 경보를 더했습니다

문제를 알아채기까지 사흘이 걸린 점도 고쳐야 했습니다. 서버가 동작하는지보다 사용자가 하려던 일을 끝까지 마쳤는지를 봐야 했어요. 같은 날 정오에 경보 여섯 개를 더했습니다. 앱 로그인 성공률, 가입 수, 첫 만들기 실패율, 고치기 실패율, 게임이 열리지 않는 비율, 앱 결제 실패와 결제가 끊긴 공백입니다. 기준은 1~7일 전 같은 시간대의 평소 값이에요.

앱 로그인은 한 시간에 시도가 8번 이상인데 성공률이 절반 아래면 울립니다. 값이 한 번만 나빠졌을 때는 울리지 않도록 5분마다 확인해서 두 번 연달아 나빠야 알려요.

켜기 전에 이 판정을 지난 14일 기록에 5분 간격으로 적용해 봤습니다. 그때 이 경보가 있었다면 앱 로그인 경보는 10월 20일 오전 11시 5분에 한 번 울리고 사흘 내내 이어졌을 겁니다. 실제로 고친 시각보다 이틀 가까이 먼저입니다.

0%50%100%10/1910/2010/2110/2210/23경보 기준 50%경보가 울렸을 시점 10/20 11:05고침 10/22 10:29평소 97%3%이틀 가까이 먼저 알 수 있었다
안드로이드 앱 로그인 성공률. 평소 97%였다가 10월 20일 아침부터 3%로 떨어졌다. 떨어진 정확한 시각은 기록에 없어 아침 무렵으로만 그렸다. 파란 점선은 새 경보를 지난 기록에 적용했을 때 처음 울린 시각이다.

같은 방법으로 돌려 보니 만들기, 고치기, 게임 열기 경보는 각각 네 번씩 울렸습니다. 그 안에는 재배포로 작업이 끊긴 날처럼 실제로 문제가 있던 때가 들어 있었어요.

잘못 울리는 경우도 찾았습니다. 가입 수를 지난주 같은 시간하고만 견줬더니, 지난주에 가입이 한꺼번에 몰린 날 때문에 16번이나 울렸습니다. 지난주 값과 지난 7일 보통 값 중 작은 쪽과 견주고, 다섯 번 연달아 나빠야 울리게 고쳤습니다.

서버에 문제가 없어도 사용자는 로그인하지 못할 수 있습니다

  • 서버 경보는 서버에 문제가 있을 때만 울립니다. 사용자 기기와 브라우저 사이에서 생기는 문제는 서버에 이상이 없기 때문에, 사용자가 마지막 단계까지 마쳤는지를 세는 경보로만 찾을 수 있습니다.
  • 새 경보는 켜기 전에 지난 기록에 돌려 보면 좋습니다. 실제 장애를 언제 알아챘을지와 잘못 울리는 경우가 얼마나 될지를 함께 확인할 수 있습니다. 가입 경보를 처음 생각대로 켰다면 2주 동안 16번 잘못 울렸을 거예요.
  • 안드로이드에서 크롬 탭 안의 페이지가 앱을 열어야 한다면, 같은 사이트 주소로 보내지 말고 앱 패키지를 적은 인텐트 주소로 여세요. 앱 링크는 같은 사이트 안의 이동에서는 앱을 열지 않습니다.

사흘 동안 로그인하지 못한 분들께 죄송합니다. 알려 주신 덕분에 고칠 수 있었습니다.

다른 글