Flutter Google Sign-In with google_sign_in 7: 새로운 인증 흐름 이해하기
Source: Dev.to
google_sign_in ^7.0.0의 변경 사항
google_sign_in ^7.0.0부터 플러그인이 Android Credential Manager와 최신 Google Identity Services를 지원하도록 대대적인 리팩터링이 이루어졌습니다. 이 과정에서 전통적인 “all‑in‑one” signIn() 메서드를 대체하는 여러 파괴적 변화가 도입되었습니다. 최근에 Flutter 프로젝트를 업그레이드했다면 다음과 같은 컴파일 오류나 예상치 못한 동작을 마주할 수 있습니다:
GoogleSignIn()생성자가 더 이상 존재함signIn()메서드가 제거됨GoogleSignInAuthentication에서accessToken이 사라짐initialize()를 호출하지 않으면 계정 선택기가 나타나지 않음
이러한 변화는 인증(Authentication)과 인가(Authorization)를 이제 별도로 처리하도록 하는 아키텍처 전환에서 비롯되었습니다.
해결 방법 1 — GoogleSignIn 생성자 제거 (싱글톤 패턴)
GoogleSignIn 클래스는 이제 GoogleSignIn()으로 직접 인스턴스를 만들 수 없습니다.
싱글톤 인스턴스를 사용하세요:
final googleSignIn = GoogleSignIn.instance;
해결 방법 2 — 초기화가 이제 필수
플러그인을 사용하기 전에 정확히 한 번 초기화를 수행해야 합니다. 앱 시작 시(main() 등) 혹은 인증 서비스 초기화 시점에 호출합니다:
await GoogleSignIn.instance.initialize();
이 단계를 건너뛰면 인증 시트가 나타나지 않을 수 있습니다.
해결 방법 3 — signIn()이 authenticate()로 교체
이전 signIn() 메서드는 authenticate()로 대체되었습니다. 이 메서드는 지원되는 Android 버전에서 새로운 시스템 수준 계정 선택기 / Credential Manager 시트를 호출합니다:
final GoogleSignInAccount googleUser =
await GoogleSignIn.instance.authenticate();
해결 방법 4 — accessToken 누락 (인증 vs. 인가)
Google은 인증(사용자가 누구인지)과 인가(앱이 어떤 권한을 갖는지)를 분리했습니다. authenticate() 호출 후 googleUser.authentication을 통해 idToken을 얻을 수 있지만, accessToken은 자동으로 반환되지 않습니다. 필요한 스코프를 명시적으로 요청해 주세요:
final clientAuth = await googleUser.authorizationClient
.authorizeScopes(['email', 'profile']);
예시: Google과 Firebase 연동 로그인
두 토큰이 모두 필요할 경우(예: Firebase) 다음 패턴을 사용합니다:
Future signInWithGoogle() async {
// 1. 초기화 보장
final googleSignIn = GoogleSignIn.instance;
await googleSignIn.initialize();
// 2. 인증 (Identity)
final GoogleSignInAccount googleUser =
await googleSignIn.authenticate();
// 3. 인가 (Permissions)
final List scopes = ['email', 'profile'];
final clientAuth =
await googleUser.authorizationClient.authorizeScopes(scopes);
// 4. Firebase Credential 생성
final credential = GoogleAuthProvider.credential(
idToken: googleUser.authentication.idToken,
accessToken: clientAuth.accessToken,
);
// 5. Firebase 로그인
return await FirebaseAuth.instance.signInWithCredential(credential);
}
중요:
signInWithGoogle()를 호출하기 전에 앱 시작 시 한 번GoogleSignIn.instance.initialize()를 실행하세요.
마무리 생각
새로운 google_sign_in API는 익숙한 메서드들이 제거되거나 재설계되면서 처음엔 헷갈릴 수 있습니다. 인증과 인가를 구분하는 방식을 이해하면 새로운 흐름을 파악하기 쉬워지고, 플러그인이 최신 아이덴티티 시스템에 맞춰진다는 점을 알 수 있습니다. 이 가이드가 디버깅 시간을 절약하는 데 도움이 되길 바랍니다.