루피도 코딩한다

앱을 출시를 했는데요, 출시를 못했습니다 (2편/ Kakao Login) 본문

Android

앱을 출시를 했는데요, 출시를 못했습니다 (2편/ Kakao Login)

xiaolin219 2022. 10. 6. 17:36

0. 지난 글 요약

1) 개인정보처리방침 url이 문제가 되어 3번의 리젝을 당함

2) url 수정끝에 릴리즈에 성공

3) 심사 통과를해서 프로덕션 출시가 시작됐는데, 앱 다운로드가 안됨

4) Leakcanary와 관련된 문제를 해결

5) ?? : 이제 다운로드는 잘 되는데, 카카오 로그인이 안돼요

 

그리하여 오늘은 카카오 로그인 에러를 해결한 경험에 대해 기록하고자 한다.

 

https://developer-rim.tistory.com/8

 

앱을 출시를 했는데요, 출시를 못했습니다 (1편/ Leakcanary)

0. 발단 지난 반년 간 사이드 프로젝트로 틈틈이 진행해오던 'ReadMe'가 드디어 릴리즈를 했다. 그러나 리젝만 3번 당하고 v1.0.4가 되어서야 프로덕션 릴리즈에 성공했다. 너무나도 기쁜 나머지 나

developer-rim.tistory.com

 

1. 문제 분석

분명 디버그시에는 카카오 로그인이 잘 작동했는데, 왜 릴리즈 모드에서 문제가 되는 것일까.

kakao developers 문서에 따라 릴리즈 키 해시도 등록해 두었는데 나는 또 조금 억울했다.

그렇지만 컴퓨터는 죄가 없는 법..

결론부터 말하자면, 릴리즈 키 해시를 잘못 등록한 것이 원인이었다.

 

 

2. 키 해시 추출 방법

Kakao Developers에서는 디버그/ 릴리즈 키 해시를 추출하는 2가지 방법을 제안한다.

1. 터미널에서 생성

2. Kakao SDK로 확인

https://developers.kakao.com/docs/latest/ko/getting-started/sdk-android#add-key-hash 

 

Kakao Developers

카카오 API를 활용하여 다양한 어플리케이션을 개발해보세요. 카카오 로그인, 메시지 보내기, 친구 API, 인공지능 API 등을 제공합니다.

developers.kakao.com

 

2-1. 터미널에서 키 해시 뽑아내기

본 프로젝트에서 나는 터미널을 활용하여 디버그/릴리즈 키 해시를 추출해냈다. 

터미널 명령어는 mac과 window 운영체제별로 차이가 있고, 아래는 mac에서 디버그 키 해시를 추출하는 명령어이다.

 

[Debug 키 해시 추출]

keytool -exportcert -alias androiddebugkey -keystore ~/.android/debug.keystore -storepass android -keypass android | openssl sha1 -binary | openssl base64

[Release 키 해시 추출]

keytool -exportcert -alias <RELEASE_KEY_ALIAS> -keystore <RELEASE_KEY_PATH> | openssl sha1 -binary | openssl base64

위 명령어 두 개를 위아래-위위 아래로 훑어보면 명령어의 구조는 거의 비슷하나 3가지 차이점이 있다.

 

1. debug 키 해시 추출 명령어의 경우 모든 유저가 일괄적으로 사용 가능하다. 

2. debug 키 해시 추출 명령어의 경우

<RELEASE_KEY_ALIAS> 자리에  androiddebugkey가,

<RELEASE_KEY_PATH> 자리에 ~/.android/debug.keystore가 들어간다.

3. debug 키 해시에는 -storepass android -keypass android가 자리 잡고 있다.

 

첫 번째로, 디버그 키 해시 추출 명령어에 대해 살펴보자.

 

디버그 명령어의 경우 ~/.android/debug.keystore  경로에 있는 keystore를 가져와 파싱 하는 코드로 추측할 수 있다. 맥에서 cmd + shift + . 의 단축키를 누르면 finder에서 숨김 파일을 볼 수 있는데, 실제로 확인해보면 .android 폴더 내부에 이런저런 비밀스러운 파일들이 있으며 거기서 디버그 키를 가져오는 듯하다.(하단 이미지 참고)

디버그 키 해시 추출

 

두 번째로, 화근이 되었던 릴리즈 키 해시 추출이다.

릴리즈 키의 경우 디버그 키와 달리 <RELEASE_KEY_ALIAS>와 <RELEASE_KEY_PATH>를 직접 입력해주어야 한다.

여기서 말하는 RELEASE_KEY의 ALIAS와 PATH는 keystore과 관련이 있다.

 

잠깐 keystore와 관련된 이야기를 해보자.

릴리즈를 위해서는 Signed 된 Bundle/APK를 생성해야 하는데, 'Signed'된 파일을 생성하기 위해서 우리는 keystore 정보를 입력해야 한다. Signed Bundle / APK 추출이 처음이라면, 아래 우측 이미지에서 Create new를 눌러 keystore를 생성하게 된다.

 

 

 

keystore를 생성하는 화면은 아래와 같고, 우리는 빈 값을 채워 우측과 같은 형태로 만들어 준다.

이때 우리는 'Key Store Path'와 'Alias'를 지정할 수 있고, 이 값이 카카오 릴리즈 키를 추출할 때 필요한 값이니 기억해두자.

 

 

그렇다면 이제 keystore 생성까지 완료했으니, 카카오에서 제공해주는 명령어를 보고 < > 내부에 올바른 값을 채워 넣어 보자.

keytool -exportcert -alias <RELEASE_KEY_ALIAS> -keystore <RELEASE_KEY_PATH> | openssl sha1 -binary | openssl base64

 

 

<RELEASE_KEY_ALIAS> 자리에 key0

<RELEASE_KEY_PATH> 자리에 /Users/kimhyorim/AndroidStudioProjects/ReadMe-KeyStore/ReadMeKeyStore가 들어간다.

keytool -exportcert -alias key0 -keystore /Users/kimhyorim/AndroidStudioProjects/ReadMe-KeyStore/ReadMeKeyStore | openssl sha1 -binary | openssl base64

 

 

리눅스 명령어에 대해 조금이라도 아는 분들에겐 당연한 얘기겠지만, 아래와 같이 터미널의 현재 경로 자체를 keystore가 위치하는 폴더로 이동하고, <RELEASE_KEY_PATH> 자리에 상대 경로를 입력해주어도 좋다. 

(base) kimhyorim@gimhyolim-ui-MacBookPro ~ % cd /Users/kimhyorim/AndroidStudioProjects/ReadMe-KeyStore/              
(base) kimhyorim@gimhyolim-ui-MacBookPro ReadMe-KeyStore % keytool -exportcert -alias key0 -keystore ReadMeKeyStore | openssl sha1 -binary | openssl base64
Enter keystore password:  ******
Oc*********************=

 

 

참고로, 경로의 경우 finder > keystore 우클릭 > 정보 가져오기를 누른 후, 위치를 복사하면 폴더의 절대 경로를 쉽게 가져올 수 있다.

 

그래서.. 무엇이 문제였는가?

실수는 간단했다. <RELEASE_KEY_PATH> 자리에 keystore의 확장자 (. jks)까지 붙여서 입력했다는 것.

올바르게 작성하기 위해서는, 상단 코드 블록에 기재해둔것 처럼 ..생략/ReadMe-KeyStore/ReadMeKeyStore으로 입력해야 한다.

그러나 나의 경우 ..생략/ReadMe-KeyStore/ReadMeKeyStore.jks 라고 입력했던 것이다.

 

경로를 올바르게 입력하지 않아도 키 해시가 튀어나온다.

그러나, 올바르게 경로를 입력한 경우에는 'Enter Keystore password : '라는 멘트가 나온다.

RELEASE_KEY_ALIAS와 RELEASE_KEY_PATH를 열심히 입력했음에도 불구하고 password를 나에게 물어보지 않는다면..

허공에 은은한 미소를 지어 보이고 다시 해보자..^^

 

2-2. 카카오 SDK를 사용하여 키 해시 뽑아내기

터미널 좀 써보겠다고 멋 부리지 않고, 카카오 sdk를 사용하여 키 해시를 뽑는 것도 상당히 현명한 방법이라 생각한다.

아무 Activity, Fragment 파일에서 작업해도 되지만, 편의를 위해 앱의 가장 첫 번째 진입 지점인 Activity에 아래와 같이 코드를 추가하면 된다. 나의 경우 로그인을 담당하는 AuthActivity에서 키 해시를 찍어보았다.

 

어차피 Key Hash만 추출하고 지울 코드이기 때문에, 아무렇게나 생명주기 함수 안에 대충 입력해도 상관없다.

import com.kakao.sdk.common.util.Utility

class AuthActivity : BindingActivity<ActivityAuthBinding>(R.layout.activity_auth) {

    override fun onCreate(savedInstanceState: Bundle?) {

        val keyHash = Utility.getKeyHash(this)
        Log.d(TAG, "onCreate: $keyHash")

        super.onCreate(savedInstanceState)
    }
}

 

디버그 키 해시 추출 법

우리가 일반적으로 실행시킬 때 사용하는 ▶️ 버튼은 debug 모드로 실행이 된다.

따라서 ▶️ 버튼을 눌러 실행시킨 후 로그를 확인하면, 디버그 키 해시를 추출할 수 있다.

 

릴리즈 키 해시 추출 법

릴리즈 모드에서도 디버그 시와 동일한 코드를 활용한다. 단, 디버그 모드가 아닌 릴리즈 모드의 앱을 실행시켜야 한다.

릴리즈 모드로 실행은 어떻게 시킬까? 이런저런 방법이 있겠지만, 내가 느끼기에 가장 편했던 방법은, Signed 된 apk를 생성한 뒤 이를 에뮬레이터로 실행시키는 것이었다. 릴리즈 키 해시 추출 과정을 담은 영상은 아래에 첨부해두겠다.

 

 

 

3. Google Play Console 앱 서명? 두둥등장

kakao developer 문서를 쿰척쿰척 복사해왔다. 말이 초큼 어렵지만 그냥 하라는 대로 하면 된다.

 

Google Play 앱 서명(App Signing)을 사용한다면 직접 릴리즈 키 해시를 생성하지 않고, Google Play Console에서 얻은 SHA-1 인증서 지문(SHA-1 certificate fingerprint)을 Base64로 인코딩하여 사용해야 합니다. 자세한 내용은 Play Console 고객센터 > 앱 서명 사용하기를 참고합니다.

  1. [Google Play Console] > [설정] > [앱 무결성] 메뉴의 [앱 서명키 인증서] 항목에서 [SHA-1 인증서 지문] 값을 복사합니다. (아래 이미지 참고)
  2. 1번 단계에서 얻은 SHA-1 인증서 지문 값을 터미널에 다음과 같이 입력합니다. ${PRINTCERT} 부분에 실제 SHA-1 인증서 지문 값을 입력해야 합니다.
echo "${PRINTCERT}" | xxd -r -p | openssl base64 

SHA-1 인증서 지문 겟겟~~
SHA-1 인증서 지문 겟겟~~

 

그러나 공식문서에서 한 가지 의문이 드는 부분이 있었다.

글의 앞부분을 보면, '직접 릴리즈 키 해시를 생성하지 않고'라고 되어있다.

만약 release 모드의 앱을 별도로 테스트해보지 않고, Google Play Store에서만 다운받아서 사용할 것이라면 2번에서 언급한 릴리즈 키 해시 추출 및 등록을 하지 않아도 된다. 그렇지만, 우리 팀의 경우 본격적인 출시 전에 release 버전의 앱으로 QA를 진행한다. 따라서 릴리즈 키 해시도, SHA-1을 Base64로 인코딩한 것도 모두 등록해주어야 한다. 카카오에서도 그렇게 하라고 한다.

 

https://devtalk.kakao.com/t/sdk/120479/5

 

SDK 이용한 카카오로그인 안됩니다

ID 573048

devtalk.kakao.com

 

릴리즈 키 해시를 제대로 추가한 것인지 확인하는 것은 위에서 이미 알아보았다.

그렇다면 Google Play Console에서 얻은 SHA-1 certificate fingerprint를 Base64로 인코딩한 값을 제대로 추출한 것인지는 어떻게 확인할 수 있는가? 앱의 심사가 끝나고 프로덕션 출시가 완료될 때까지 기다려야 할까?

 

Google Play App 서명을 사용한 apk를 google play console에서 다운받을 수 있다.

다운받은 apk를 에뮬레이터로 드래그해서 실행시켜보면, google play app 서명을 활용한 경우에서도 카카오 로그인이 잘 작동하는지 확인할 수 있다!

 

이렇게 키 해시까지 등록하고 확인까지 마무리하면 카카오 로그인 

찐으로

끝! 🎉🎉

 

[번외] 정규표현식 고치기

| 여기서부터는 카카오 로그인과 관계없는 내용입니다.

 

나 : 카카오 로그인 고쳤어!!!

나의 안드 팀원 문** 언니와 이** 오빠는 요즘 취준때문에 바쁘다.

때문에, Leakcanary 에러를 잡는 시간도.. 카카오 로그인 키 해시 문제를 해결한 것도.. 외로운 사투의 시간이었다.

 

카카오 로그인을 해결하고 신난 마음에, 로그인 다음 화면인 닉네임 입력을 하고 있었는데 버그를 발견했다.

이** 오빠의 담당 뷰였는데, 복잡한 문제는 아닌 것 같아서 내가 해결을 했다.

 

1. 정규표현식 목록에 천지인 문자 추가 (ㆍ,ᆢ)

    내 이름의 '효'를 천지인 키보드로 입력한다고 생각해보자.

    ㅎ ㆍㆍㅡ 이렇게 4개의 문자를 눌러야 하는데, ㆍ를 한글로 인식하지 못하는 것이 첫 번째 버그였다.

2. 닉네임 관련 안내 메시지 분기 처리 버그 수정

    1) 닉네임 최대 7글자 길이 제한이 있음

    2) 7글자 입력함

    3) 닉네임 확인 버튼 클릭 -> '사용 가능한 닉네임입니다' 멘트 나옴

    4) 백스페이스로 한 글자 지워서 6글자 만듦

    5) '닉네임은 최대 7글자까지 설정 가능합니다'라고 뜨지 말아야 할 것이 뜸

    -> 메소드를 분리하여 의존성을 떨어뜨려 해결함!

 

 

그렇게 하루 만에 릭카나리, 카카오 로그인, 정규표현식 에러를 모두 수정하고 v1.0.5 릴리즈에 성공했다 🎉

 

Comments