일기 slecs

카카오 로그인 플랫폼 스킴 설정으로 실기기 인증 완성

목차

카카오 로그인 연동의 마지막 퍼즐 조각을 맞췄다. KakaoSdk.init 호출과 플랫폼별 스킴 등록까지 완성해서 드디어 실기기에서 실제 카카오 로그인 플로우가 동작하기 시작했음.

왜 이 작업이 늦어졌나

소셜 로그인 연동은 "API 키 하나 넣으면 되는 거 아냐?"라는 인식이 팀 내에 은근히 있었다. 실제로 해보면 전혀 아니다. 특히 카카오 SDK 같은 경우 Flutter 앱 레이어 + 네이티브 플랫폼 설정 + 카카오 개발자 콘솔 등록 이 세 가지가 동시에 맞아야 동작한다. 어느 하나라도 빠지면 침묵하거나, 애매한 에러 코드를 뱉거나, 아예 카카오톡 앱으로 전환조차 안 된다.

이번에 손댄 파일이 딱 세 개다.

파일 역할 이번 변경 의미
AndroidManifest.xml Android 앱 컴포넌트/인텐트 선언 카카오 리다이렉트 스킴 인텐트 필터 등록
Info.plist iOS 앱 메타데이터 LSApplicationQueriesSchemes + URL Schemes 등록
main.dart Flutter 앱 진입점 KakaoSdk.init(nativeAppKey: ...) 호출

세 파일이 각각 다른 레이어를 담당하는데, 하나라도 누락되면 "왜 안 되지?"를 반복하며 디버깅 시간을 날리게 된다.

플랫폼 스킴이 왜 중요한가

카카오 로그인의 흐름을 간단히 그리면 이렇다.

앱 → 카카오톡(or 웹뷰) → 인증 완료 → 딥링크로 앱 복귀 → 토큰 수신

여기서 "딥링크로 앱 복귀" 단계가 바로 플랫폼 스킴 등록이 필요한 지점이다. iOS는 Info.plistkakao{앱키} 형태의 URL Scheme을 등록해야 하고, Android는 AndroidManifest.xml에 해당 스킴을 받을 인텐트 필터를 달아줘야 한다. 이걸 안 하면 카카오 인증은 완료됐는데 앱으로 돌아오지 못하는 황당한 상황이 생긴다.

<!-- AndroidManifest.xml 핵심 패턴 -->
<activity android:name="com.kakao.sdk.flutter.AuthCodeCustomTabsActivity" ...>
  <intent-filter android:label="flutter_web_auth">
    <action android:name="android.intent.action.VIEW" />
    <category android:name="android.intent.category.DEFAULT" />
    <category android:name="android.intent.category.BROWSABLE" />
    <data android:scheme="kakao{NATIVE_APP_KEY}" android:host="oauth"/>
  </intent-filter>
</activity>
<!-- Info.plist 핵심 패턴 -->
<key>LSApplicationQueriesSchemes</key>
<array>
  <string>kakaokompassauth</string>
  <string>storeservices</string>
</array>
<key>CFBundleURLTypes</key>
<array>
  <dict>
    <key>CFBundleURLSchemes</key>
    <array>
      <string>kakao{NATIVE_APP_KEY}</string>
    </array>
  </dict>
</array>

그리고 main.dart에서 runApp 직전에 SDK를 초기화하는 것이 공식 가이드의 권장 순서다.

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await KakaoSdk.init(nativeAppKey: '...');
  runApp(const MyApp());
}

ensureInitialized() 없이 KakaoSdk.init을 비동기로 호출하면 플랫폼 채널이 준비되지 않아 런타임 에러가 날 수 있다. 이 순서는 꼭 지켜야 한다.

팀 관점 회고

이 작업을 내가 직접 끝까지 붙잡고 완성한 이유가 있다. 플랫폼별 네이티브 설정은 Flutter 경험이 짧은 팀원에게 넘기면 "왜 이 파일을 건드려야 하는지"부터 설명해야 하는 컨텍스트 비용이 생긴다. 이번엔 내가 먼저 완성본을 만들고, PR에 주석과 함께 각 설정이 왜 필요한지를 설명해두는 방식을 택했음.

  • Android/iOS 네이티브 설정이 얽힌 작업은 완성 후 문서화까지 세트로 처리
  • 스킴 값은 환경변수 또는 별도 설정 파일로 분리해 하드코딩 방지
  • 신규 팀원 온보딩 때 "소셜 로그인 연동 체크리스트"로 재활용 가능한 형태로 남겨둠

소셜 로그인 하나가 "간단한 작업"처럼 보여도, 플랫폼 설정이 얽힌 순간 디버깅 사이클이 길어지기 쉽다. 처음부터 세 레이어를 한 번에 정확히 맞추는 것이 훨씬 낫다는 걸 이번에 다시 확인했다.

끝.


🛒 이 글과 어울리는 추천 상품

*위 링크는 쿠팡파트너스 활동의 일환이며, 일정액의 수수료를 제공받을 수 있습니다.

댓글 0

첫 댓글 달아줘.