Google Sign-In은 모바일 및 웹 애플리케이션에서 Google 계정을 통한 사용자 인증을 구현하는 Google의 SDK입니다. 이 기술은 OAuth 2.0 프로토콜을 기반으로 하며, 타사 애플리케이션에 비밀번호를 전달하지 않고 Google API에 대한 액세스 토큰을 얻을 수 있습니다. 30억 개 이상의 Android 기기가 Google Sign-In을 지원하여 모바일 앱에서 가장 일반적인 로그인 방식이 되었습니다. Google Identity Platform, 2025에 따르면 SDK 통합은 등록 시간을 60% 단축하고 사용자 전환율을 높입니다.
핵심 사항
Google Sign-In은 타사 애플리케이션에서 사용자 인증을 위해 Google이 제공하는 Single Sign-On(SSO) 서비스입니다. SDK를 통해 개발자는 자체 등록 시스템을 만들지 않고도 Google 계정을 통한 로그인을 통합할 수 있습니다. 이 기술은 OAuth 2.0 프로토콜과 OpenID Connect를 기반으로 하며, 사용자 이름, 이메일, 아바타, 고유 식별자 등의 신원 정보를 제공합니다.
기존의 이메일 및 비밀번호 인증과 달리 Google Sign-In은 비밀번호를 기억하거나 등록 절차를 거칠 필요가 없습니다. 사용자는 기기에서 Google 계정을 선택하고 권한을 확인하면 앱이 액세스 토큰을 받습니다. Google Identity Platform (2025)에 따르면 Google Sign-In이 있는 앱은 이메일/비밀번호 양식에 비해 성공적인 등록이 52% 더 많습니다.
Google Sign-In은 세 가지 사용 시나리오를 지원합니다: 사용자 인증(ID Token 획득), Google API 액세스 권한 부여(Access Token 획득), 이미 인증된 사용자를 위한 원활한 인증(Silent Sign-In)입니다. 각 시나리오에는 다양한 범위(scopes) 세트가 필요하며 다양한 유형의 토큰을 반환합니다.
OAuth 2.0은 앱이 사용자의 자격 증명을 노출하지 않고 사용자 리소스에 대한 제한된 액세스를 얻을 수 있도록 하는 인증 프로토콜입니다. Google Sign-In의 맥락에서 프로토콜은 다음과 같이 작동합니다: 앱이 Google을 통해 사용자에게 인증을 요청하고, 임시 인증 코드를 받아 액세스 토큰으로 교환한 후 해당 토큰을 사용하여 Google API를 호출합니다.
OAuth 2.0이 이전 프로토콜과 다른 주요 차이점은 리소스 소유자(사용자), 클라이언트(앱), 인증 서버(Google), 리소스 서버(Google API) 간의 역할 분리입니다. 앱은 사용자의 비밀번호를 절대 받지 않으며 — 취소할 수 있는 토큰만 받습니다. Google Identity Platform은 OAuth 2.0 위에 OpenID Connect 사양을 사용하여 JWT 형식의 표준화된 ID Token을 추가합니다.
// Credential Manager를 통해 ID Token을 얻는 예제
val googleIdOption = GoogleIdCredentialOption.Builder()
.setServerClientId(serverClientId)
.build()
val credentialManager = CredentialManager.create(this)
val request = GetCredentialRequest.Builder()
.addCredentialOption(googleIdOption)
.build()
credentialManager.getCredential(request)
.addOnSuccessListener { result ->
val credential = result.credential as GoogleIdCredential
Log.d("SignIn", credential.idToken)
}ID Token(JWT)은 세 가지 세그먼트로 구성됩니다: 서명 알고리즘이 있는 헤더, 사용자 데이터(sub, email, name, picture)가 있는 페이로드, 그리고 검증을 위한 서명입니다. 앱의 서버 측은 Google의 공개 키를 사용하여 ID Token 서명을 검증하고 사용자 식별자를 추출합니다. 이 접근 방식은 클라이언트 앱이 손상되더라도 공격자가 Google의 개인 키에 접근하지 않고는 토큰을 위조할 수 없음을 보장합니다.
Credential Manager는 2023년에 도입된 최신 Android API로, 모든 인증 방법(Google Sign-In, 비밀번호 로그인, Passkeys)을 단일 사용자 인터페이스에 통합합니다. 이전 GoogleSignInClient와 달리 Credential Manager는 로그인에 WebView가 필요하지 않으며 — 네이티브 Bottom Sheet를 사용하여 인증 속도를 높이고 사용자 경험을 개선합니다.
Credential Manager의 주요 장점은 모든 자격 증명 유형에 대한 통합 UX입니다. 사용자는 Google로 로그인, Passkey 사용, 비밀번호 입력 중에서 선택할 수 있는 하나의 대화상자를 봅니다. 개발자는 다양한 인증 흐름을 관리할 필요가 없으며 — Credential Manager가 Google Sign-In, Smart Lock 및 Passkeys와의 상호 작용을 추상화합니다. Google은 Android 14+용 Google Sign-In 통합의 기본 방법으로 Credential Manager를 권장합니다.
| 매개변수 | GoogleSignInClient(레거시) | Credential Manager |
|---|---|---|
| 최소 API | Android 4.4 (API 19) | Android 4.4 (API 19) |
| 인터페이스 | WebView / BottomSheet | 네이티브 BottomSheet |
| Passkey 지원 | 아니요 | 예 |
| SDK 크기 | ~500 KB | ~150 KB |
| 상태 | 더 이상 사용되지 않음(2024) | Google 권장 |
마이그레이션 GoogleSignInClient에서 Credential Manager로의 마이그레이션은 클라이언트 측 로직 변경이 필요합니다: GoogleSignInOptions 대신 GoogleIdCredentialOption을 사용하고, GoogleSignIn.getSignedInAccountFromIntent 대신 GetCredentialResponse를 통해 결과를 처리합니다. ID Token은 동일한 JWT 형식을 유지하므로 서버 측은 변경이 필요하지 않습니다. Google I/O 2024에 따르면 Google Play 앱의 약 40%가 이미 Credential Manager로 마이그레이션되었습니다.
Google Sign-In을 Android 앱에 통합하려면 Google Cloud Console에서 프로젝트를 구성하는 것으로 시작합니다. 첫 번째 단계는 Android용 OAuth 2.0 Client ID를 만드는 것입니다: 앱의 패키지 이름과 SHA-1 인증서 지문을 지정합니다. Google은 이 데이터를 사용하여 인증 요청이 가짜 클라이언트가 아닌 사용자의 앱에서 오는지 확인합니다.
Google Cloud Console에서 클라이언트를 만든 후, 개발자는 build.gradle에 Credential Manager 종속성을 추가하고 serverClientId로 GoogleIdCredentialOption을 구성합니다. 중요: serverClientId는 동일한 Google Cloud 프로젝트의 웹 애플리케이션 Client ID로, 서버 측이 ID Token을 검증하는 데 사용합니다. 클라이언트 앱은 토큰을 검증하지 않고 — 받기만 하여 서버로 전달합니다.
// build.gradle (app) dependencies
implementation("androidx.credentials:credentials:1.5.0")
implementation("androidx.credentials:credentials-play-services-auth:1.5.0")
implementation("com.google.android.libraries.identity.googleid:googleid:1.1.0")
// Credential Manager를 통해 Google Sign-In 요청
suspend fun requestGoogleSignIn(context: Context): String? {
val credentialManager = CredentialManager.create(context)
val googleIdOption = GoogleIdCredentialOption.Builder()
.setServerClientId(BuildConfig.SERVER_CLIENT_ID)
.setAutoSelectEnabled(true)
.build()
val result = credentialManager.getCredential(
context as Activity,
GetCredentialRequest.Builder()
.addCredentialOption(googleIdOption)
.build()
)
return (result.credential as GoogleIdCredential).idToken
}클라이언트에서 ID Token을 받은 후, 앱은 이를 서버로 보내 검증을 수행합니다. 서버는 Google의 공개 키(https://www.googleapis.com/oauth2/v3/certs에서 제공), 토큰 만료 시간(exp) 및 aud 필드 값을 사용하여 JWT 서명을 검증합니다 — serverClientId와 일치해야 합니다. 검증 후 서버는 자체 세션을 생성합니다(예: 내부 JWT 또는 Session Token 발행).
iOS에서 Google Sign-In 통합은 CocoaPods 또는 Swift Package Manager를 통해 사용할 수 있는 GoogleSignIn-iOS SDK를 통해 수행됩니다. 설정 과정에는 Google Cloud Console에서 iOS용 Client ID 생성(Bundle Identifier 지정), 콜백을 위한 URL Scheme 추가, 인증 후 Google이 반환하는 URL을 처리하기 위한 AppDelegate 구성이 포함됩니다.
Google Sign-In의 iOS 버전과 Android의 중요한 차이점은 URL Scheme 및 Info.plist 구성의 필요성입니다. GoogleSDK는 콜백에 Universal Links를 사용하지만, 폴백으로 `com.googleusercontent.apps.[CLIENT_ID]` 형식의 URL Scheme이 필요합니다. 앱 실행 간에 리프레시 토큰을 저장하기 위해 Keychain Sharing 구성도 필요합니다. Google Identity 문서에 따르면 iOS SDK는 iOS 15 이상을 지원합니다.
// iOS에서 Google Sign-In 설정
import GoogleSignIn
class SignInManager: ObservableObject {
func signIn(presenting viewController: UIViewController) {
GIDSignIn.sharedInstance.signIn(
withPresenting: viewController
) { signInResult, error in
guard let result = signInResult else {
print("Sign in failed: \(error)")
return
}
let idToken = result.user.idToken.tokenString
// ID Token을 서버로 전송
sendTokenToBackend(idToken)
}
}
}iOS에서 Google Sign-In은 이전에 인증한 사용자를 위한 Silent Sign-In을 지원합니다. restorePreviousSignIn 메서드는 리프레시 토큰이 Keychain에 저장된 경우 자동으로 세션을 복원합니다. 이는 사용자가 실행할 때마다 다시 로그인할 필요가 없는 앱에서 특히 중요합니다. Google에 따르면 활성 Google 세션이 있는 기기에서 Silent Sign-In은 85%의 경우 성공합니다.
Google Sign-In의 보안은 세 가지 수준으로 구축됩니다: 클라이언트 검증(SHA-1 앱 서명), 전송 암호화(HTTPS/TLS), 암호화 JWT 서명입니다. Google에서 받은 ID Token은 RS256 알고리즘(SHA-256을 사용한 RSA)으로 서명됩니다. 앱의 서버 측은 토큰 서명, 만료 및 발급자(iss) — accounts.google.com만 — 를 검증해야 합니다.
Access Token은 Google API(Google Drive, Google Calendar, YouTube 등)에 대한 액세스를 제공하는 임시 토큰(1시간 유효)입니다. ID Token과 달리 Access Token에는 사용자 정보가 포함되지 않으며 — Google API 서버가 요청 인증에 사용하는 불투명 문자열입니다. Refresh Token은 사용자가 다시 로그인하지 않고도 새 Access Token을 얻을 수 있는 장기 토큰입니다. Refresh Token은 첫 번째 로그인 시에만 발급되며 사용자가 Google 계정 설정에서 취소할 수 있습니다.
// 서버에서 ID Token 처리 예제 (의사 코드)
fun verifyGoogleToken(idToken: String): User? {
val verifier = GoogleIdTokenVerifier.Builder(
NetHttpTransport(), GsonFactory.getDefaultInstance()
).setAudience(listOf(CLIENT_ID))
.build()
val token = verifier.verify(idToken) ?: return null
val payload = token.payload
return User(
id = payload.subject,
email = payload.email,
name = payload.get("name") as String
)
}보안 권장 사항: 안전하지 않은 채널로 ID Token을 전송하지 말고, 모든 서버 요청에 HTTPS를 사용하며, 토큰 만료(exp 필드)와 발급자(iss)를 확인하세요. 클라이언트에서는 암호화 없이 SharedPreferences에 토큰을 저장하지 말고 — EncryptedSharedPreferences 또는 Android Keystore를 사용하세요. Google Sign-In은 서버 간 인증을 위한 것이 아니며 — 이를 위해서는 Service Accounts를 사용하세요.
Credential Manager와 ViewModel을 사용하여 Android 앱에 Google Sign-In을 통합하는 전체 예제입니다. 앱은 로그인 버튼을 표시하고, 인증 후 ID Token을 서버로 보내고 사용자 정보를 표시합니다. 코드는 Credential Manager와의 비동기 작업에 코루틴을 사용합니다.
class SignInViewModel: ViewModel() {
private val cm = CredentialManager.create(getApplication())
private val googleOption = GoogleIdCredentialOption.Builder()
.setServerClientId(BuildConfig.SERVER_CLIENT_ID)
.build()
suspend fun signIn(): SignInResult {
return try {
val response = cm.getCredential(
GetCredentialRequest.Builder()
.addCredentialOption(googleOption)
.build()
)
val credential = response.credential as GoogleIdCredential
SignInResult.Success(credential.idToken)
} catch (e: GetCredentialCancellationException) {
SignInResult.Cancelled
}
}
}
sealed class SignInResult {
data class Success(val idToken: String) : SignInResult()
data class Error(val message: String) : SignInResult()
data class Cancelled : SignInResult()
}인증 성공 후, 앱은 검증 및 세션 생성을 위해 ID Token을 서버로 보내야 합니다. HTTPS를 사용하고 POST 요청 본문에 토큰을 포함하는 것이 좋습니다. 서버는 자체 세션 토큰을 반환하며, 클라이언트는 이를 EncryptedSharedPreferences에 저장합니다. 서버에 대한 각 후속 요청에서는 Google ID Token이 아닌 내부 토큰이 사용됩니다.
첫 번째 일반적인 오류는 SHA-1 인증서 불일치입니다. Google Cloud Console은 OAuth 2.0 Client ID를 SHA-1 인증서 지문에 바인딩합니다. 앱이 디버그 키로 빌드되었지만 Client ID가 릴리스 키용으로 생성된 경우, Google Sign-In은 오류 12501(SIGN_IN_FAILED)을 반환합니다. 해결 방법: Google Cloud Console에 두 SHA-1 지문(디버그 및 릴리스)을 모두 추가하거나 개발용 Client ID와 프로덕션용 별도 Client ID를 사용합니다.
두 번째 빈번한 문제는 잘못된 serverClientId입니다. 개발자는 종종 Credential Manager의 serverClientId 매개변수에 웹 애플리케이션 Client ID 대신 Android Client ID를 사용합니다. Google은 서버 검증을 위한 ID Token 생성을 위해 웹 클라이언트 ID를 정확히 필요로 합니다. Android Client ID는 인증 중에 앱을 식별하는 데만 사용됩니다. serverClientId가 Google Cloud Console의 웹 애플리케이션과 일치하는지 확인하세요.
세 번째 오류는 취소 처리 무시입니다. 사용자가 인증을 완료하지 않고 Google Sign-In 대화상자를 닫을 수 있습니다. Credential Manager는 다른 오류와 별도로 처리해야 하는 GetCredentialCancellationException을 throw합니다. 많은 개발자가 모든 예외를 오류로 처리하여 사용자가 단순히 작업을 취소했음에도 “로그인 실패” 메시지를 표시합니다. 올바른 처리: 취소 시 — 아무것도 표시하지 않고 초기 상태로 돌아갑니다.
자주 묻는 질문
Android에는 Credential Manager(AndroidX Credentials)를, iOS에는 Swift Package Manager를 통한 GIDSignIn SDK를 사용하는 것이 좋습니다. Credential Manager는 Google Sign-In, Passkeys 및 비밀번호 로그인을 단일 인터페이스에 통합하는 Google 지원 최신 API입니다. 더 이상 사용되지 않는 GoogleSignInClient(com.google.android.gms:auth)는 더 이상 사용이 권장되지 않습니다.
ID Token은 사용자 정보(이름, 이메일, 고유 ID)를 포함하는 JWT입니다. 앱 서버 측의 인증에 사용됩니다. Access Token은 Google API(Google Drive, Calendar)에 액세스하기 위한 불투명 문자열입니다. ID Token은 1시간 동안 유효하며, Access Token도 1시간 동안 유효하지만 Refresh Token을 통해 갱신할 수 있습니다.
기술적으로는 가능하지만 안전하지 않습니다. 클라이언트에서만 ID Token을 검증하면 공격자가 앱을 디컴파일하여 검증 로직을 추출할 수 있습니다. Google의 공개 키를 사용한 서버 측 검증은 토큰이 실제로 Google에서 발급되었고 위조되지 않았음을 보장합니다. 서버가 없는 앱의 경우 Firebase Authentication을 사용하세요.
오류 12501(SIGN_IN_FAILED)은 앱의 SHA-1 인증서가 Google Cloud Console에 지정된 것과 일치하지 않을 때 발생합니다. 해결 방법: 디버그 인증서(Android Studio에서)와 릴리스 인증서의 SHA-1을 콘솔에 추가합니다. 또한 콘솔의 패키지 이름이 build.gradle과 일치하는지 확인하세요. 변경 후 전파되는 데 최대 24시간이 걸릴 수 있습니다.
아니요, Google Sign-In은 Google 서버와 통신하기 위해 인터넷 연결이 필요합니다. 기기가 오프라인인 경우 세션 캐싱 메커니즘을 사용하세요: 로그인 성공 후 EncryptedSharedPreferences에 토큰을 저장하고 다음 실행 시 유효성을 확인합니다. 네트워크가 없을 때는 저장된 데이터를 표시하고 나중에 로그인하도록 제안합니다.
요약
턴키 방식의 모바일 애플리케이션을 개발해 드립니다
IT Sectr는 2017년부터 스타트업과 기업을 위한 iOS 및 Android 애플리케이션을 만듭니다. 저희가 상담해 드리고 최적의 솔루션을 제안하겠습니다.