Flutter+Supabase 환경에서 iOS 카카오 로그인 후 리다이렉트(Custom Scheme)가 동작하지 않는 문제

문의 시 사용하시는 SDK 버전 정보와 플랫폼(Android / iOS) 및 디벨로퍼스 앱ID를 알려주세요.


안녕하세요. Flutter와 Supabase를 사용하여 iOS 카카오 로그인을 구현 중인데, 모든 설정을 마쳤음에도 불구하고 리다이렉트가 정상적으로 동작하지 않아 문의드립니다.

  • 네이티브 앱 키: a84f499584e8828a7aed6a1d574fae15
  • 번들 ID: net.wavecompany.tracme
  1. 앱에서 카카오 로그인 요청 시 카카오톡 앱이 정상적으로 열립니다.
  2. 카카오톡에서 로그인을 취소하고 앱으로 돌아오면, 앱이 무한 로딩 상태에 빠집니다.
  3. uni_links 패키지로 확인 결과, 앱으로 tracme://login-callback 형태의 링크가 전혀 들어오지 않는 것을 확인했습니다.

** 이미 확인한 사항**

  • Info.plistKAKAO_APP_KEY, CFBundleURLSchemes (tracme 포함), LSApplicationQueriesSchemes 모두 정확히 설정했습니다.
  • 카카오 콘솔에 Redirect URI (https://api.tracme.cc/auth/v1/callback), 번들 ID 모두 정확히 등록했습니다. (플랫폼 삭제 후 재등록까지 시도)
  • Supabase 대시보드에 Client ID (REST API 키)Client Secret 모두 정확히 등록했습니다.
  • iPhone의 Safari 브라우저에서 tracme://login-callback 주소를 직접 입력하면 저희 앱이 정상적으로 실행되는 것을 확인했습니다.**

질문 위 모든 설정이 정상인데도 리다이렉트가 발생하지 않습니다. 혹시 저희 앱ID(a84f499584e8828a7aed6a1d574fae15)로 들어온 로그인 요청에 대해, 카카오 서버 측에서 발생한 오류 로그가 있는지 확인 부탁드립니다.

Supabase에서는 REST-API KEY기반 OIDC 카카오로그인을 공식적으로 지원하고 있는데요.

네이티브앱키를 사용하셨네요? Supabase에는 어떤 설정을 하셨나요?

Supabase 설정은 공식 가이드를 따라

Provider 설정: Supabase의 Kakao Provider 설정에 카카오의 REST API 키를 Client ID로, Client Secret을 Secret으로 정확히 등록했습니다.
Redirect URLs 설정: Supabase의 Redirect URLs에 모바일 앱으로 돌아오기 위한 커스텀 스킴인 tracme://login-callback을 등록했습니다.
Flutter 코드: Flutter 앱에서는 signInWithOAuth 호출 시 redirectTo 파라미터에 동일하게 tracme://login-callback을 사용하도록 설정했습니다.

우선, 969298 디벨로퍼스앱 최근 7일간 로그상 오류는 조회되지 않습니다.
(Mac, android dptj 사용자 정보조회까지 REST_API_KEY로 정상 처리된 이력만 있습니다.)
(네이티브앱키로 요청들어온 것은 한건도 없습니다.)

슈파베이스와 개발하신 앱간 통신에 문제있을 것으로 추정되고

Supabase 설정을 그대로 하셨다면, REST-API 방식으로 동작하고 OIDC 스펙으로 작동합니다.
카카오SDK를 사용하는 NATIVE KEY와 다른 사용 패턴인데 이부분 위주로 살펴보시면 좋을 것 같습니다.

(1) REST-API 방식을 사용하는 경우 웹 리다이렉트 URI를 사용하셔야하고 카카오디벨로퍼스 설정과 코드내 리다이렉트 URI가 일치 해야합니다.

(2) SDK를 사용하는 NATIVE 방식을 사용하는 경우 SDK에서 설정한 init 스킴으로 되돌아오게됩니다.

Supabase를 통한 REST-API 방식의 로그인 요청이 들어왔을 때, 사용자가 '성공’이 아닌 '취소’를 선택한 경우, 카카오 서버는 최종적으로 어떤 동작을 하도록 설계되어 있나요?

저희가 예상하는 동작은 코드에 명시된 redirectTo(tracme://login-callback)에 error=access_denied와 같은 파라미터를 붙여 리다이렉트해주는 것입니다. 하지만 현재 아무런 리다이렉트가 발생하지 않습니다.

저희 앱 ID(969298)로 발생한 로그인 요청 중, 취소된 건에 대해 카카오 서버가 마지막에 어떤 동작을 했는지 로그 확인을 다시 한번 간곡히 부탁드립니다.

어떤 상황인지 확인위해 재현영상 및 로그인 시도 로그 전체
그리고 환경을 유추할 수 있게 관련 코드블럭 및 설정들 기재 부탁드려요.

Info.plist

<dict>
    <key>KAKAO_APP_KEY</key>
    <string>a84f499584e8828a7aed6a1d574fae15</string>
    <key>CADisableMinimumFrameDurationOnPhone</key>
    <true/>
    <key>CFBundleDevelopmentRegion</key>
    <string>$(DEVELOPMENT_LANGUAGE)</string>
    <key>CFBundleDisplayName</key>
    <string>Tracme Store</string>
    <key>CFBundleExecutable</key>
    <string>$(EXECUTABLE_NAME)</string>
    <key>CFBundleIdentifier</key>
    <string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
    <key>CFBundleInfoDictionaryVersion</key>
    <string>6.0</string>
    <key>CFBundleName</key>
    <string>tracme_store</string>
    <key>CFBundlePackageType</key>
    <string>APPL</string>
    <key>CFBundleShortVersionString</key>
    <string>$(FLUTTER_BUILD_NAME)</string>
    <key>CFBundleSignature</key>
    <string>????</string>
    <key>CFBundleVersion</key>
    <string>$(FLUTTER_BUILD_NUMBER)</string>
    <key>GADApplicationIdentifier</key>
    <string>ca-app-pub-7319269804560504~2979016973</string>
    <key>LSRequiresIPhoneOS</key>
    <true/>
    <key>UIApplicationSupportsIndirectInputEvents</key>
    <true/>
    <key>UILaunchStoryboardName</key>
    <string>LaunchScreen</string>
    <key>UIMainStoryboardFile</key>
    <string>Main</string>
    <key>UISupportedInterfaceOrientations</key>
    <array>
       <string>UIInterfaceOrientationPortrait</string>
       <string>UIInterfaceOrientationLandscapeLeft</string>
       <string>UIInterfaceOrientationLandscapeRight</string>
    </array>
    <key>UISupportedInterfaceOrientations~ipad</key>
    <array>
       <string>UIInterfaceOrientationPortrait</string>
       <string>UIInterfaceOrientationPortraitUpsideDown</string>
       <string>UIInterfaceOrientationLandscapeLeft</string>
       <string>UIInterfaceOrientationLandscapeRight</string>
    </array>
    <key>CFBundleURLTypes</key>
    <array>
       <dict>
          <key>CFBundleTypeRole</key>
          <string>Editor</string>
          <key>CFBundleURLSchemes</key>
          <array>
             <string>tracme</string>
             <string>kakaoa84f499584e8828a7aed6a1d574fae15</string>
          </array>
       </dict>
    </array>
    <key>LSApplicationQueriesSchemes</key>
    <array>
       <string>kakaokompassauth</string>
       <string>kakaolink</string>
       <string>app-prefs</string>
    </array>

    <key>NSMotionUsageDescription</key>
    <string>사용자의 움직임을 감지하여 스쿼트, 런지 등 운동 동작의 횟수를 자동으로 세고, 운동 자세를 분석하기 위해 기기의 동작 및 피트니스 데이터에 접근합니다.</string>
    <key>NSBluetoothPeripheralUsageDescription</key>
    <string>외부 피트니스 기기와 연결하여 운동 데이터를 정확하게 측정하고 기록하기 위해 블루투스 권한이 필요합니다.</string>
    <key>NSBluetoothAlwaysUsageDescription</key>
    <string>외부 운동 기기와의 연결을 백라운드 상태에서도 유지하여 운동 기록이 끊기지 않도록 하기 위해 블루투스 권한이 필요합니다.</string>
    <key>NSCameraUsageDescription</key>
    <string>운동 기록을 위한 사진 또는 동영상 촬영 기능이 필요합니다.</string>
    <key>NSPhotoLibraryUsageDescription</key>
    <string>운동 중 촬영한 사진을 저장하거나 업로드하기 위해 사진 라이브러리 접근이 필요합니다.</string>
    <key>NSMicrophoneUsageDescription</key>
    <string>운동 영상에 음성을 녹음하거나 분석하기 위해 마이크 접근이 필요합니다.</string>
    <key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
    <string>백그라운드에서도 위치 기능 제공을 위해 필요합니다.</string>
    <key>NSLocationAlwaysUsageDescription</key>
    <string>백그라운드에서도 위치 기능 제공을 위해 필요합니다.</string>
    <key>NSLocationWhenInUseUsageDescription</key>
    <string>앱 사용 중 위치 권한이 필요합니다.</string>

    <key>ITSAppUsesNonExemptEncryption</key>
    <false/>
    <key>FLTEnableImpeller</key>
    <false/>
</dict>




Dart 3.7.0
Flutter 3.29.1
kakao_flutter_sdk: ^1.9.7+3
supabase_flutter: ^2.5.2
플랫폼: iOS

영상과 코드를 보니 카카오 측을 먼저 호출하는게 아니군요.
code(인가코드)도 카카오에서 발급하는 패턴이 아니구요.

개발하신앱에서 슈파베이스 호출하고 카카오측은 전혀 호출하지 않은 것으로 보입니다.
카카오측 로그에도 요청이 없구요.
(kakao_flutter_sdk: ^1.9.7+3의 NATIVE APP KEY로 카카오 로그인 요청이 없고 슈파베이스에 카카오 로그인 연동 설정하셨다면 kakao_flutter_sdk: ^1.9.7+3가 필요 없는데, 어떤 방법으로 SDK사용하시는지도 부연 설명해주시면 좋을 것 같습니다.)

Supabase를 통한 REST-API 방식의 로그인 요청이 들어왔을 때, 사용자가 '성공’이 아닌 '취소’를 선택한 경우, 카카오 서버는 최종적으로 어떤 동작을 하도록 설계되어 있나요?

위에 문의 주신 내용은 카카오 동의창에서 "취소"를 선택한 상황이라 이해 했는데 영상에는 관련 내용이 없네요?
카카오측을 호출 했을 것이라 판단하신 이유가 어떻게 되나요?