본문 바로가기

성장하는 개발 일지

[Flutter 카카오 소셜 로그인] Failed host lookup: 'kauth.kakao.com' (OS Error: No address

  정말정말 길고 길었던 소셜 로그인과의 싸움.😞 정말 간단하다고들 다들 말하는 카카오 로그인이 하필 마지막까지 안되어서 고생을 좀 했다. 이 기록은 특히나 이번 에러의 원인을 찾아나가던 나의 생각의 흐름이 길고도 또 그만큼 마음에 들어서 기억해두고자 적는 글 :>
 
  일단 문제 현상은 다음과 같았다. 
 

 
  공식 문서와 수많은 블로그들 어느 것을 보더라도 플러터 자체 모듈(kako_flutter_sdk)을 활용한 방법은 잘 나와 있었기에 이 화면까지 도달하는 데까지 큰 어려움은 없었다. 일차적인 문제는 여기서 터졌다. 카카오 화면에서 로그인 정보를 잘 입력하고 돌아왔는데 느닷없이 해당 에러가 뜬 것이다.

 

SocketException (SocketException: Failed host lookup: 'kauth.kakao.com' (OS Error: No address associated with hostname, errno = 7))

 
  ..다행이었던 점은 해당 SocketException을 큰 따옴표를 달아 구글에 검색해 봤을 때 바로 많은 사람들이 입을 모아 똑같은 해답을 제시해주고 있었단 점이다.
 

<uses-permission android:name="android.permission.INTERNET"/> 

 
  해당 코드를 android/app/src/main/AndroidManifest.xml에 넣지 않을 시 발생하는 문제라니! 하지만 정말 불행이었던 점은, 모두가 입을 모아 제시하는 이 해답이 내 케이스엔 정답이 아니었다는 슬픈 사실.
 
  정말 웃기게도 flutter를 Android와 iOS 둘 다 돌려 보았을 때 똑같은 카카오 로그인 코드로 아이폰은 잘 작동했다.🤯 그대로 공식 문서에서 가져다 쓴 카카오 로그인 로직은 문제될 일이 없었다. 그렇기에 당연히 Android와 iOS의 카카오 세팅 차이에 문제가 있었겠거니 하며 며칠간 AndroidManifest만 죽어라 이 잡듯이 뒤졌다.
 
  하지만 그곳엔 답이 없었다. 정말 답이 없었다. 카카오 공식 문서에서 요구하는 Android 기본 세팅은 아래의 간단한 코드 몇 줄이 전부였다.

<activity 
    android:name="com.kakao.sdk.auth.AuthCodeHandlerActivity"
    android:exported="true">
    <intent-filter>
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
        
        <!-- Redirect URI: "kakao${NATIVE_APP_KEY}://oauth" -->
        <data android:host="oauth"
                android:scheme="kakao${NATIVE_APP_KEY}" />
    </intent-filter>
</activity>

 
  kakao Native key를 혹시나 정말 멍청하게도 잘못 입력한 것일까 체크도 여러 번 해봤지만 이 코드블럭은 문제가 없었다. 그렇게 돌고 돌아 태초마을로 돌아오게 됐다. 

kakao developes &amp;amp;gt; 내 애플리케이션 &amp;amp;gt; 앱 설정 &amp;amp;gt; 플랫폼

 
  ..바보. 디버그 키 해시와 릴리즈 키 해시, 둘 중 릴리즈 키 해시밖에 등록해 두지 않았었던 것이다. 혹시나 해서 flutter run --release를 터미널에 실행시켜 안드로이드 실기기에 테스트해보았을 땐(릴리즈 모드) 정말 거짓말같이 에러가 뜨지 않았다.
 

keytool -list -v -keystore ~/.android/debug.keystore -alias androiddebugkey -storepass android -keypass android

 

  부랴부랴 해당 명령어로 디버그 키를 구해 카카오 개발자 플랫폼에 등록해 두고 디버깅을 다시 한 번 해봤다. 침을 꼴깍 삼키는 동시에 에러는 너구리의 솜사탕마냥 사르르 사라져 버렸다.
 

😊😊
 

  아주 행복하게 소셜 로그인을 끝냈다 자부하며 앱스토어 플레이스토어 양측에 올리고 잠들길, 바로 다음날, 정말 어이없게도 자신만만하게 동료 개발자 분께 테스팅 해봐달라 부탁한 우리 금쪽이 카카오 로그인이 처참한 몰골이 되어 되돌아왔다.
 

😳

 

  말도 안 돼.. 어떻게 릴리즈 키와 디버그 키 모두 잘 넣었는데 나에게 이런 시련을. 아니 하지만 난 정말 억울했다. 릴리즈 모드로 flutter run을 돌렸을 때 분명 성공하는 걸 몇 번이고 내 두 눈으로 똑똑히 지켜봤단 말이다.. 무엇보다 가장 큰 의문은 이거였다.
 

apk로는 되는데, 왜 aab를 거쳐 간 구글 플레이 스토어 다운로드 버전은 안 되는 거지?

 
  이 기회에 처음으로 알게 되었다. APK(Android Package)는 이미 완성된 안드로이드 앱 파일이고, AAB(Android App Bundle)는 APK를 완성해주는 요소를 담은 패키지라는 사실을. 아니 근데 그렇다면 더더욱이나 특정 기능이 되고 안되고 하는 이런 큰 차이가 둘 간에 발생할 리가 없지 않는가.

User
So, the thing is that, even if I build AAB and install it in my android device, it will still have the same APK that I install with 'flutter run --release', if the aab is just for the google to produce the APKs in different versions?

GPT
Yes, exactly!

 
 
  그렇게 한참을 구글링하다가, 정말 한 줄기 희망처럼 보였던 수많은 썩은 동앗줄들을 손수 잡아가며 어느덧 chatGPT와 이런 대화에 이르렀다. "생각해 봐. 잘되는 앱 번들이 구글 플레이 스토어만 거치면서 이상해졌어. 범인은 구글 플레이스토어야."
 


  🥳 그렇게 해답에 이르르게 되는데!

GPT
⋯ You need to register both the SHA-1 of your own upload key and the SHA-1 of the app signing key used by Google Play.

 

  와,, 난 그동안 릴리즈 키라 함은 내 컴퓨터 로컬에 있는 SHA-1 키만 말하는 건줄 알았다. 하지만 AAB를 구글 플레이가 직접 APK로 변환해 플레이 스토어에 다양한 APK 버전들로 올려주는 구조인 이상, 구글 플레이 콘솔의 SHA 키도 필요했던 거다. 드디어 마지막 관문, 비장한 얼굴 표정을 하고 문을 두드려 마주한 구글 콘솔의 SHA키는 내가 예상한 것과는 다르게 생겼었다.
 

00:00:00:00:00:00:00:00:00:00:00:00: ⋯

 
  ..나는 '98AbrsHx23LsXF=' 뭐 이렇게 생긴, 적어도 '='로 끝나는 짧은 키를 만나보길 소망했는데.. 하지만 이게 같은 키일 뿐 다르게 생긴 형식에 불과하다는 사실은 조금 뒤에 깨닫게 되었다.
 

echo 00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00 | xxd -r -p | base64

 

  해당 명령어를 터미널에 돌리고 나면 원하는 이쁘고 짧은 'Google Play의 SHA-1 키'가 나온다. kakao developers 안드로이드 플랫폼에 이미 있던 업로드용 릴리즈 키 옆에 해당 키를 살포시 추가해두고 나오면 끝!
 
  여기까지 삽질한 끝에 구글 플레이스토어에 올린 Android 카카오 로그인은 다음날 아름답게 성공했다.