Flutter 앱에서 Firebase Authentication과 함께 구글, 애플, 카카오 로그인을 모두 구현한 경험을 정리했다. 각 플랫폼별 특징과 주의사항, 그리고 실제 구현 과정에서 마주한 문제점들까지 기록해보자.
⚡ 이 글의 특징:
firebase_core: 4.0.0, firebase_auth: 6.0.0, google_sign_in: 7.1.1, sign_in_with_apple: 7.0.1, kakao_flutter_sdk: 1.9.6Firebase Auth (중심축)
├── Google Sign-In
├── Apple Sign-In
└── Kakao Sign-In → Firebase Custom Token
가장 간단하고 Firebase와 연동이 쉬운 방식이다. 하지만 7.1.1 버전부터 API가 크게 변경되었으니 주의!
처음엔 GitHub Copilot과 ChatGPT가 추천한 구 버전 코드를 그대로 사용했다가 계속 오류가 발생했다. 알고보니 google_sign_in 7.1.1부터 API가 완전히 바뀌었던 것!
구 버전 (7.0.0 이전) 방식:
// ❌ 이제 안 되는 방식
final GoogleSignInAccount? googleUser = await GoogleSignIn().signIn();
신 버전 (7.1.1+) 방식:
// ✅ 새로운 방식
final GoogleSignIn signIn = GoogleSignIn.instance;
await signIn.initialize();
final GoogleSignInAccount? googleUser = await signIn.authenticate();
💡 교훈: AI 도구들은 항상 최신 API를 반영하지 못한다. 공식 문서와 changelogs 확인이 필수!
# pubspec.yaml - 2025년 8월 기준 최신 안정 버전
dependencies:
firebase_core: 4.0.0
firebase_auth: 6.0.0
google_sign_in: 7.1.1 # 🔥 7.1.1부터 API 대폭 변경!
Future<void> signInWithGoogle() async {
try {
final GoogleSignIn signIn = GoogleSignIn.instance;
await signIn.initialize();
final GoogleSignInAccount? googleUser = await signIn.authenticate();
if (googleUser == null) {
debugPrint('Google 로그인 취소 또는 사용자 없음');
return;
}
final GoogleSignInAuthentication googleAuth = await googleUser.authentication;
final credential = GoogleAuthProvider.credential(
idToken: googleAuth.idToken,
);
await _auth.signInWithCredential(credential);
notifyListeners();
} catch (e, st) {
debugPrint('Google 로그인 오류: $e\n$st');
rethrow;
}
}
✅ 장점: Firebase 공식 지원, 구현 간단
⚠️ 주의점: iOS에서는 URL Scheme 설정 필요
iOS 13+ 필수 요구사항이며, 개인정보 보호에 특화되어 있다. 7.0.1 버전에서 안정성이 크게 개선되었다!
바이럴 코딩으로 찾은 예전 글들은 대부분 5.x 버전 기준이었는데, 7.0.1에서는 다음과 같은 개선이 있었다:
# pubspec.yaml - 2025년 8월 기준 최신 안정 버전
dependencies:
sign_in_with_apple: 7.0.1 # 🔥 7.0.1 최신 버전 사용!
애플 로그인은 오히려 바이럴 코딩이 빛을 발한 케이스였다! GitHub Copilot이 Info.plist 설정을 완벽하게 제안해주었다:
<!-- ✅ iOS Info.plist - 바이럴 코딩으로 빠르게 완성! -->
<key>CFBundleURLTypes</key>
<array>
<!-- Google 로그인 -->
<dict>
<key>CFBundleURLSchemes</key>
<array>
<string>com.googleusercontent.apps.36163303930-1shl4p0i3fm7jsd01ir542pd0jnq5g0a</string>
</array>
</dict>
<!-- Apple 로그인: 실제 번들 ID 사용 -->
<dict>
<key>CFBundleURLSchemes</key>
<array>
<string>com.byseungje.myApp</string>
</array>
</dict>
<!-- Kakao 로그인 -->
<dict>
<key>CFBundleURLSchemes</key>
<array>
<string>kakaoa{네이티브 앱 키}</string>
</array>
</dict>
</array>
💡 iOS는 바이럴 코딩 천국: URL Scheme부터 Xcode 설정까지 AI가 거의 완벽하게 도와줬다!
Future<UserCredential?> signInWithApple() async {
try {
final appleCredential = await SignInWithApple.getAppleIDCredential(
scopes: [
AppleIDAuthorizationScopes.email,
AppleIDAuthorizationScopes.fullName,
],
);
final oauthCredential = OAuthProvider("apple.com").credential(
idToken: appleCredential.identityToken,
accessToken: appleCredential.authorizationCode,
);
return await FirebaseAuth.instance.signInWithCredential(oauthCredential);
} catch (e) {
debugPrint('Apple Sign-In Error: $e');
return null;
}
}
✅ 장점: 개인정보 보호 우수, iOS 생태계 완벽 지원, 바이럴 코딩으로 빠른 개발 가능
⚠️ 주의점: 이메일 숨기기 기능으로 실제 이메일 접근 어려움
한국 서비스라면 필수! 하지만 Firebase 직접 연동이 안 되어 Custom Token 방식을 사용해야 한다. 1.9.6 버전에서 Flutter 3.8+ 완벽 지원!
예전 AI 도구들이 추천한 1.7.x 버전과 달리, 1.9.6에서는:
# pubspec.yaml - 2025년 8월 기준 최신 안정 버전
dependencies:
kakao_flutter_sdk: 1.9.6 # 🔥 1.9.6 최신 버전 사용!
코파일럿의 추천을 따라 intent-filter만 추가했다가 계속 오류가 발생했다. 카카오 디벨로퍼 문서를 다시 읽어보니 새로운 activity 전체를 추가해야 하는 것이었다!
<!-- 카카오 로그인을 위한 AuthCodeHandlerActivity -->
<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" />
<!-- Redirect URI: "kakao${NATIVE_APP_KEY}://oauth" -->
<data android:scheme="kakaoa9f72088774650dd0f2413f8df7a4c92" android:host="oauth"/>
</intent-filter>
</activity>
💡 교훈: intent-filter 추가가 끝이 아닌, 새로운 activity 추가였다. 새로운 기능 구현에 앞서 문서 정독은 필수라는 걸 다시 한번 깨달았다.
카카오 로그인 구현 중 가장 큰 삽질이었다. Firebase와 카카오를 연동하려고 할 때마다 AI들이 계속 OIDC 방식을 추천했는데, 막상 구현해보면 오류가 발생했다.
AI가 자꾸 추천한 OIDC 방식:
// ❌ AI가 추천했지만 실제로는 안 되는 방식
final provider = OAuthProvider("oidc.kakao");
// 계속 오류 발생...
실제로 작동하는 Custom Token 방식:
// ✅ 결국 이 방식으로 해결
Future<UserCredential?> signInWithKakao() async {
try {
OAuthToken token = await UserApi.instance.loginWithKakaoTalk();
// Firebase Custom Token 생성을 위해 서버로 카카오 토큰 전송
final customToken = await createFirebaseCustomToken(token.accessToken);
return await FirebaseAuth.instance.signInWithCustomToken(customToken);
} catch (e) {
debugPrint('Kakao Sign-In Error: $e');
return null;
}
}
💡 교훈: AI가 이론적으로 가능하다고 추천해도, 실제 카카오-Firebase 연동은 Custom Token이 정답이었다!
// functions/src/index.ts
exports.createCustomToken = functions.https.onCall(async (data, context) => {
const { kakaoAccessToken } = data;
// 카카오 사용자 정보 검증
const userInfo = await verifyKakaoToken(kakaoAccessToken);
// Firebase Custom Token 생성
const customToken = await admin.auth().createCustomToken(userInfo.id, {
provider: 'kakao',
email: userInfo.kakao_account?.email,
name: userInfo.properties?.nickname
});
return { customToken };
});
모든 로그인 방식을 하나의 Provider로 관리해서 일관성을 유지했다.
class AuthProvider extends ChangeNotifier {
User? _user;
LoginType? _loginType;
Future<bool> signIn(LoginType type) async {
try {
switch (type) {
case LoginType.google:
await signInWithGoogle();
break;
case LoginType.apple:
await signInWithApple();
break;
case LoginType.kakao:
await signInWithKakao();
break;
}
if (FirebaseAuth.instance.currentUser != null) {
_user = FirebaseAuth.instance.currentUser;
_loginType = type;
notifyListeners();
return true;
}
return false;
} catch (e) {
debugPrint('로그인 실패: $e');
return false;
}
}
}
이번 프로젝트를 통해 바이럴 코딩(AI 도구 활용)의 명암을 확실히 경험했다.
intent-filter만 추가하라고 해서 계속 오류 발생<intent-filter> 태그만 추가<activity> 태그 전체를 추가해야 함GoogleSignIn().signIn()) 추천initialize() + authenticate() 방식으로 변경OAuthProvider("oidc.kakao")) 추천Firebase와 소셜 로그인을 모두 구현하면서 각 플랫폼의 특징을 이해할 수 있었다. 특히 카카오 로그인에서 문서를 제대로 읽지 않아 삽질한 경험과, 구글 로그인에서 바이럴 코딩만 믿다가 API 변경사항을 놓친 경험이 가장 기억에 남는다.
🚨 바이럴 코딩의 현실적 한계:
핵심 교훈:
이 글은 2025년 8월 기준 최신 안정 버전으로 작성되었다:
firebase_core: 4.0.0firebase_auth: 6.0.0 google_sign_in: 7.1.1sign_in_with_apple: 7.0.1kakao_flutter_sdk: 1.9.6하지만 Flutter와 Firebase 생태계는 빠르게 변화한다.
📝 지속적인 업데이트 다짐:
⚠️ 주의: 이 글을 참고하실 때는 현재 사용 중인 패키지 버전을 확인하고, 필요시 최신 공식 문서를 함께 참조해주세요!