구글 소셜로그인 설정 가이드 (Flutter + Java)
Firebase Console과 Google Cloud Console을 활용한 구글 소셜로그인 전체 설정 과정을 정리한 가이드입니다.
전체 흐름
사용자 앱 (Flutter)
↓ 구글 로그인 버튼 클릭
Google Sign-In SDK
↓ 인증 요청
Google OAuth 서버
↓ ID Token 발급
백엔드 (Java)
↓ Token 검증
자체 서버 로그인 처리
Firebase vs Google Cloud Console 역할
Firebase Console = 앱 개발자용 간편 UI
Google Cloud Console = Firebase 뒤에서 돌아가는 실제 인프라
| 작업 | Firebase Console | Google Cloud Console |
|---|---|---|
| SHA-1 등록 | ✅ | ❌ |
| google-services.json 다운로드 | ✅ | ❌ |
| 구글 로그인 활성화 | ✅ | ❌ |
| Web Client ID 확인 | ✅ 자동 생성 후 확인 | ✅ 직접 생성 가능 |
| OAuth 클라이언트 ID 관리 | ❌ | ✅ |
| API 활성화 | ❌ | ✅ |
Firebase에서 SHA-1 등록 및 구글 로그인 활성화 시 → GCP에 OAuth 클라이언트 ID 자동 생성
STEP 1. SHA-1 추출
터미널(cmd)을 열고 아래 명령어를 입력합니다.
Windows:
keytool -list -v -keystore %USERPROFILE%\.android\debug.keystore -alias androiddebugkey -storepass android
Mac:
keytool -list -v -keystore ~/.android/debug.keystore -alias androiddebugkey -storepass android
실행 결과 예시:
SHA1: AA:BB:CC:DD:EE:FF:11:22:33:44:55:66:77:88:99:00:AA:BB:CC:DD
⚠️ keytool을 찾을 수 없는 경우
JDK가 환경변수에 미등록된 것
Windows: 제어판 → 환경변수 → Path에C:\Program Files\Java\jdk-XX\bin추가 후 cmd 재실행
⚠️ PC마다 SHA-1이 다름
디버그 키스토어는 PC 최초 실행 시 자동 생성되는 고유 파일
회사 PC, 집 PC 등 개발 환경이 여러 개라면 각 PC에서 추출 후 모두 등록 필요
STEP 2. Firebase Console 설정
2-1. SHA-1 등록
console.firebase.google.com 접속
↓
⚙️ 프로젝트 설정 → 일반
↓
내 앱 → Android 앱 선택
↓
SHA 인증서 지문 → + 추가
↓
SHA-1 값 붙여넣기 → 저장
2-2. google-services.json 재다운로드
⚠️ SHA-1 추가 후 반드시 재다운로드 필요 (파일 내용이 변경됨)
같은 페이지 상단
↓
google-services.json 다운로드 버튼 클릭
↓
android/app/ 폴더에 덮어쓰기
STEP 3. 구글 로그인 활성화
Firebase Console
↓
Authentication → Sign-in method
↓
Google 클릭 → 사용 설정 토글 ON
↓
프로젝트 지원 이메일 선택 → 저장
STEP 4. Web Client ID 확인
Firebase Console
↓
⚙️ 프로젝트 설정 → 일반
↓
내 앱 → 웹 앱
↓
웹 클라이언트 ID 복사
Web Client ID는 Flutter
serverClientId와 Java 백엔드 토큰 검증에 사용됨
STEP 5. GCP Console 확인
console.cloud.google.com 접속
↓
APIs & Services → Credentials
↓
아래 3가지 항목 생성 여부 확인
| 항목 | 있어야 하는 것 |
|---|---|
| Android | Android client for [앱이름] |
| iOS | iOS client for [앱이름] |
| Web | Web client (auto created by Google Service) |
⚠️ 아무것도 없는 경우
Firebase Authentication → Google 토글 OFF → 저장 → 다시 ON → 저장
→ GCP Credentials에 자동 재생성됨
STEP 6. Flutter 코드 적용
final GoogleSignIn _googleSignIn = GoogleSignIn(
serverClientId: "여기에 Web Client ID 입력",
);
⚠️
serverClientId누락 시idToken이 null로 반환됨
STEP 7. iOS 설정
7-1. Firebase iOS 앱 등록
Firebase Console
↓
⚙️ 프로젝트 설정 → 내 앱 → 앱 추가 → iOS 선택
↓
Bundle ID 입력 (예: com.company.appname)
↓
GoogleService-Info.plist 다운로드
↓
Xcode 프로젝트 루트에 배치
Bundle ID 확인: Xcode → Runner → General → Bundle Identifier
7-2. iOS URL Scheme 설정 (필수)
Xcode 실행
↓
Runner → Info → URL Types
↓
+ 버튼 클릭
↓
URL Schemes에 REVERSED_CLIENT_ID 입력
REVERSED_CLIENT_ID는GoogleService-Info.plist파일 내에 있음
예:com.googleusercontent.apps.XXXXXXX
⚠️ 이 설정 누락 시 iOS에서 구글 로그인 후 앱으로 복귀가 안 됨
Android vs iOS 설정 비교
| 항목 | Android | iOS |
|---|---|---|
| 필수 파일 | google-services.json | GoogleService-Info.plist |
| 추가 설정 | SHA-1 등록 | URL Scheme 등록 |
| 파일 위치 | android/app/ | Xcode 프로젝트 루트 |
| 고유 식별자 | 패키지명 + SHA-1 | Bundle ID |
STEP 8. 릴리즈 키스토어 SHA-1 등록
⚠️ 디버그 SHA-1만 등록하면 실제 출시 앱에서 구글 로그인이 동작하지 않음
릴리즈 키스토어 생성 (없는 경우)
keytool -genkey -v -keystore [키스토어파일명].jks -alias [alias명] -keyalg RSA -keysize 2048 -validity 10000
⚠️ 이 파일을 잃어버리면 앱 업데이트 영구 불가 → 반드시 안전한 곳에 백업
릴리즈 SHA-1 추출
keytool -list -v -keystore [키스토어경로].jks -alias [alias명]
Firebase에 릴리즈 SHA-1 추가 등록
Firebase Console → ⚙️ 프로젝트 설정 → 내 앱 → Android 앱
↓
SHA 인증서 지문 → + 추가 → 릴리즈 SHA-1 붙여넣기 → 저장
↓
google-services.json 재다운로드 → 덮어쓰기
디버그 vs 릴리즈 SHA-1 비교
| 구분 | 용도 | 키스토어 위치 |
|---|---|---|
| 디버그 | 개발 / 테스트 | %USERPROFILE%\.android\debug.keystore (자동 생성) |
| 릴리즈 | 실제 출시 앱 | 직접 생성한 .jks 파일 |
PC가 바뀌었을 때
디버그 키스토어는 PC마다 고유하게 자동 생성되므로 새 PC에서는 SHA-1이 달라짐
새 PC 추가 시 해야 할 것
| 작업 | 필요 여부 | 이유 |
|---|---|---|
| SHA-1 추출 | ✅ 필수 | PC마다 debug.keystore가 다름 |
| Firebase SHA-1 추가 등록 | ✅ 필수 | 미등록 시 12500 에러 발생 |
| google-services.json 재다운로드 | ✅ 필수 | SHA-1 추가 후 json 내용 변경됨 |
| Web Client ID | ❌ 그대로 사용 | PC가 바뀌어도 동일한 값 |
| Flutter serverClientId | ❌ 그대로 사용 | PC가 바뀌어도 동일한 값 |
새 PC 추가 순서
새 PC에서 cmd 실행
↓
keytool 명령어로 SHA-1 추출
↓
Firebase Console → SHA-1 추가 등록
↓
google-services.json 재다운로드
↓
android/app/ 폴더에 덮어쓰기
↓
완료 ✅
PC별 SHA-1 관리 예시
| PC | SHA-1 | Firebase 등록 여부 |
|---|---|---|
| 회사 PC | AA:BB:CC... | ✅ |
| 집 PC | DD:EE:FF... | ✅ |
| 신규 PC | GG:HH:II... | ✅ 추가 등록 필요 |
✅ SHA-1은 기존 값 삭제 없이 계속 추가하는 방식으로 관리
오류 해결 모음 (FAQ)
| 오류 | 원인 | 해결 |
|---|---|---|
ApiException 12500 | OAuth 클라이언트 ID 없음 or SHA-1 불일치 | Firebase 토글 OFF→ON / SHA-1 재등록 |
DEVELOPER_ERROR | SHA-1 불일치 | 현재 PC SHA-1 Firebase 등록 확인 |
idToken null | serverClientId 누락 | Flutter 코드에 Web Client ID 입력 |
Keystore does not exist | Windows ~ 경로 인식 불가 | %USERPROFILE% 로 교체 |
| iOS 로그인 후 앱 복귀 안됨 | URL Scheme 미설정 | Xcode URL Types에 REVERSED_CLIENT_ID 추가 |
| 출시 앱에서 로그인 실패 | 릴리즈 SHA-1 미등록 | 릴리즈 키스토어 SHA-1 Firebase 추가 등록 |
| 새 PC에서 로그인 실패 | 새 PC SHA-1 미등록 | 새 PC SHA-1 추출 후 Firebase 추가 등록 |
Web Client ID 사용 위치
Flutter (프론트엔드)
final GoogleSignIn _googleSignIn = GoogleSignIn(
serverClientId: "여기에 Web Client ID 입력",
);
Java (백엔드)
GoogleIdTokenVerifier verifier = new GoogleIdTokenVerifier.Builder(
new NetHttpTransport(),
new GsonFactory()
)
.setAudience(Collections.singletonList("여기에 Web Client ID 입력"))
.build();
전체 흐름
Flutter 앱
serverClientId로 구글 로그인 요청
↓
구글 서버가 idToken 발급
↓
Flutter가 idToken을 Java 백엔드로 전송
↓
Java 백엔드가 Web Client ID로 idToken 검증
↓
검증 성공 → 로그인 처리