카카오 SDK를 적용하는 안드로이드 개발자분들이 이 글을 보시고 "저는 잘 되는데요." 사태가 일어나지 않기를 바랍니다.

김운호제품길드 G파티 테크리드

카카오 로그인은 OAuth 2.0 기반의 소셜 로그인 서비스입니다. 카카오 로그인을 사용하면 사용자가 카카오톡 또는 카카오계정으로 손쉽게 서비스에 로그인할 수 있는데요. 서비스는 서비스 ID 및 비밀번호를 입력받고 검증하는 과정을 직접 구현하지 않고도 사용자에 대한 인증과 인가를 간편하고 안전하게 처리할 수 있습니다.

카카오 로그인이 안돼요!

그럴 리가 없는데, 저는 잘 되는데요…

폰이 너무 오래돼서 그런 게 아닐까? (갤럭시 노트 안드로이드 7.0)

처음에는 문제의 기기가 갤럭시 노트라는 사실에 일시적인 문제로 판단할 뻔했지만 정말 혹시나 하는 마음으로 테스트를 시작했습니다. 다른 기기에서는 잘만 되던 로그인이 갤럭시 노트에서 가입 동의 팝업까지도 잘 띄워주더니 자연스럽게 돌아온 클라이언트는 카카오 계정의 인증 성공이나 실패 여부마저 콜백으로 받을 수 없었습니다 😳  (정적…)

카카오톡 공유 기능 업데이트할 때 뭐 잘못했나? 🤯

일단 카카오 로그인이 고장 난 거니까 카카오톡 공유 업데이트할 때 뭔가 잘못된 걸까 싶은 생각이 들면서 여느 때와 같이 표적수사를 시작했습니다. 표적은 카카오톡 공유 업데이트 시점으로 정하고 로그인과 공유 두 개의 연동 문서에서 누락했거나 잘못 작성한 부분이 없나 확인해 보기 시작했습니다.

가 아니라,

시작하자마자 마치 “나 범인” 으로 의심되는 공통점 하나를 찾을 수 있었습니다.

카카오 로그인
https://developers.kakao.com/docs/latest/ko/kakaologin/android

카카오톡 공유
https://developers.kakao.com/docs/latest/ko/message/android-link

android:scheme=“kakao${YOUR_NATIVE_APP_KEY}”

이 동일한 스키마를 각각의 연동 문서에서 확인할 수 있었습니다.

각각 로그인과 공유 scheme의 딥링크 실행을 위한 액티비티에 선언되는 인텐트 필터입니다. 물론 서로 다른 host(auth, kakaolink)를 사용하니 문제가 없어야 했지만 테스트 결과는 그렇지 못했습니다.

당장 한쪽의 인텐트 필터를 제거하자마자 문제가 해결이 돼버린 겁니다.

로그인이 안됐던 원인

우선, 카카오 로그인 모듈은 위의 scheme을 사용해서 모듈과 클라이언트의 브릿지 역할을 하는 AuthCodeHandlerActivity를 실행하면 카카오 계정의 인증 성공 여부를 클라이언트가 전달받을 수 있도록 설계되어 있습니다.

그런데 이 과정에서 AuthCodeHandlerActivity가 실행되지 않은 것입니다.

Android 7.0 갤럭시 노트가 AuthCodeHandlerActivity를 실행하지 못한 이유는 scheme://host 선언에서 host 별로 분리하여 intent filter 되지 않았기 때문입니다. 그리고 더 큰 문제는 삼성에서 포팅 된 OS가 host 별로 액티비티를 분리하지도 못했으면서 intent chooser도 보여주지 않고 다짜고짜 우선순위가 높은 액티비티를 자동으로 실행하는 부분입니다.

이때 실행된 액티비티가 로그인 모듈이 원했던 액티비티가 아니라 카카오톡 공유 딥링크 실행을 위한 액티비티였다 보니 카카오 계정의 인증 성공 여부를 전달해 주지 못하고 클라이언트의 다음 로직이 중단되면서 로그인이 안 됐던 것이었습니다.

해결한 방법

일단 저는 아주 단순한 방법으로 수정했습니다.

  1. AuthCodeHandlerActivity에 있는 scheme 선언을 제거하여 scheme 선언의 단일화
  2. 카카오톡 공유 딥링크 실행 액티비티에 단일화된 scheme을 선언
  3. 단일화된 액티비티가 카카오 scheme을 전달받으면 host를 확인해서 auth라면 AuthCodeHandlerActivity로 uri를 그대로 담아서 실행

카카오 로그인 연동 문서를 따르지 않았다는 점에서 마음이 아주 불편하지만 로그인이 안 되는 것보다는 백배 낫다고 판단했습니다. 그나마 카카오톡 공유 딥링크 실행 액티비티가 사실은 kakaolink host뿐만 아니라 앱 자체 딥링크(상품 상세 등의)도 모두 수행하는 브릿지 페이지라는 부분이 마음의 위안이 되어주었습니다.

카카오의 또 다른 모듈을 연동할 때 이런 이슈를 깜빡하고 공식 문서를 따라 릴리즈 했다가는 또다시 로그인이 안 된다는 CS가 돌아올 수 있으니 이렇게 긴 글을 남깁니다!

원인은 같지만 또 다른 문제

신제품 Z FLIP 4에서 카카오 로그인을 하면 intent chooser가 나오게 되는데 이것 또한 scheme 중복 선언으로 인한 이슈로 위에서 언급한 두 개의 액티비티가 선택지로 나타난 것이었습니다.

갤럭시 노트는 chooser 없이 다짜고짜 실행하는 반면에 최신 기기라서 그런지 선택지라도 나오게 고쳤다는 점이 그나마 다행이라고 할 수 있겠습니다!

요약
  • 일부 디바이스에서 카카오 로그인 이슈 발생
  • 카카오 로그인・카카오톡 공유 연동시 공식 문서대로 연동하면 안 됨
  • 카카오 로그인 연동 문서에서 intent filter 선언은 적용하지 않고, 별도의 카카오 scheme 브릿지 페이지를 추가해서 이슈 해결