중복 로그인 오류 (모바일 편)

홈페이지를 먼저 오픈하고 중복 로그인 오류를 한 차례 겪은 후 jSessionId 비교 시 instance 구분자를 제외하고 비교하도록 변경한 후에 문제 없이 운영을 해왔습니다.

시스템 설계 시 Front-end는 반응형으로 구성하지 않아 홈페이지와 모바일 Repository를 분리하여 설계했지만 Back-end API는 서비스 공통화와 생산성 향상을 위해 하나의 Repository를 사용하고 있었습니다.

이미 jSessionId 이슈는 해결한 상태라 모바일을 오픈한 후에는 관련한 이슈는 없을 것으로 생각하고 있었으나 정말 특이하게도 정확하게 동일한 사유로 민원이 유입되었습니다.

하지만 홈페이지 때와 다른 점은 민원이 좀 더 많이 유입되었습니다. 발생한 시간 대도 모두 제각각이고 확실히 빈도가 높았습니다.

거래 이력 확인

민원이 여러 건 유입된 덕분에 거래 이력은 좀 빨리 확인해 볼 수 있었습니다. 거래 이력을 확인해보니 역시 특이점을 발견할 수 있었습니다.

14:31:34.123 inst01 211.111.111.111 getSmsAuthMsg.do
14:31:36.007 inst07 211.111.111.111 login.do
14:31:36.007 inst01 211.111.111.111 getMyInfo.do --> error

재미있었던 포인트는 아래와 같습니다.

1. 홈페이지 때와 동일하게 instance가 변경되었지만, 
   다음 거래에서는 instance가 돌아왔습니다.
2. 4-5건의 민원을 확인해 본 결과 반드시 sms 인증번호 발송요청 후 
   오류가 발생했습니다.
3. 일단 4-5건은 모두 Android 사용자 였습니다.

확인 경과

서버 소스 검토

사실 instance가 변경된 부분이라 호출을 당하는 서버 쪽보다는 클라이어트 쪽에 비중을 더 두었으나 서버의 인증 소스도 일단 전부 재검토를 진행했습니다.

sms 인증 부분을 모두 검토했고 혹여나 타 시스템과 인터페이스하면서 특이사항이 발생할 내용이 없는지 확인해 보았으나 별 소득이 없었습니다.

클라이언트 소스 검토

사실 서버 소스보다는 Android, iOS 소스 검토에 조금 더 비중을 두고 검토를 진행했습니다.

만약 클라이언트 소스에서 new HttpUrlConnection을 해서 새로운 Connection을 생성하여 sms 인증을 수행한다면 별도의 Session으로 통신을 하기 때문에 저런 현상이 발생할 수 있습니다.

Connection 부분 소스 및 Cookie Sync 부분도 소스 코드를 모두 검토하였으나 역시 소득이 없었습니다.

멘붕. 커피나 마시자.

홈페이지와는 다르게 민원은 자주 유입이 되지, 확인할 아이디어는 좀처럼 떠오르지 않지, 살짝 멘붕이 와서 머리를 식히기 위해서 나가서 커피나 마십니다. 아직은 프로젝트가 종료되지 않은 상태라... 귀책은 프로젝트 팀에 있으니 살짝 머리를 시키기 위해 회피를 선택합니다...

android.permission.RECEIVE_SMS

커피를 마시다가 예전에 Android 에서 사용하던 가계부 앱의 기능이 생각이 났습니다. 요즘은 Google에서 별도의 승인을 얻지 않으면 사용할 수 없는, 사용자가 수신한 SMS을 인터셉트 할 수 있는 권한입니다.

google의 아래 문서를 참고합니다.
https://support.google.com/googleplay/android-developer/answer/10208820?hl=ko#zippy=%2Csms-%EB%B0%8F-%ED%86%B5%ED%99%94-%EA%B8%B0%EB%A1%9D-%EA%B6%8C%ED%95%9C%EC%9D%98-%ED%97%88%EC%9A%A9%EB%90%9C-%EC%9A%A9%EB%8F%84

내용은 대강 아래와 같습니다.

요즘 스크래핑 서비스를 사용하는 앱들은 모두 아이디나 공동인증서 로그인 기반으로 서비스를 제공하므로 google playstore에서 스크래핑 서비스 앱들을 검색하여 permission list를 모두 확인하기 시작했습니다.

원인 확인

SMS를 수신하면 은행, 카드 등에서는 문자가 아래와 같은 형태로 발송됩니다.

[XX카드] 승인 알림 XXX원이 결제되었습니다.
[XX은행] 입금 알림 XXX원이 입금되었습니다.

SMS 권한이 있는 스크래핑 서비스 앱을 설치한 후에 우리 서비스 앱에 로그인하여 사용하다가 해당 단말기로 저런 메시지를 발송해 보아서 동일한 증상을 재현해 냈습니다.

아주 여러가지가 얽힌 문제라 원인을 확인했을 때 쾌감이 제법 있었습니다. 하지만 해결이 애매했습니다.

해결

해결책은 크게 두 가지 선택지가 있었습니다.

1. 가이드
   고객센터를 통해 해당 상황을 설명하고,
   해당 스크래핑 앱의 SMS 권한을 해제 처리하도록 안내함
2. 예외 처리
   해당 앱 서비스와 협의하여 user-agent로 예외 처리하는 방법
   해당 앱의 user-agent로 접근했을 경우 로그인 시 jSession Id를 update 하지 않음

일단 고객들에게 아쉬운 소리를 하지 않으려면 2번 방법도 괜찮아 보였지만 서비스 앱마다 처리를 해야 한다는 점과 보안의 back-door를 만들 수 있다는 점에서 현업 부서와 협의하여 1번 방법으로 처리했습니다.

좋은 웹페이지 즐겨찾기