
React Native Expo 환경에서 Google 로그인을 구현하는 방법을 정리합니다.
Expo의 expo-auth-session을 활용하여 OAuth 2.0 인증을 처리하는 방식으로 진행됩니다.
https://auth.expo.iohttps://auth.expo.io/@your-username/your-app-slugexpo install expo-auth-session expo-secure-store @react-native-async-storage/async-storage
.env 파일을 생성하고 아래 내용을 추가합니다.
EXPO_PUBLIC_GOOGLE_CLIENT_ID=your-client-id.apps.googleusercontent.com
import React, { useState, useEffect } from 'react';
import { View, Button, Text } from 'react-native';
import * as WebBrowser from 'expo-web-browser';
import * as Google from 'expo-auth-session/providers/google';
import AsyncStorage from '@react-native-async-storage/async-storage';
WebBrowser.maybeCompleteAuthSession();
export default function GoogleLogin() {
const [userInfo, setUserInfo] = useState(null);
const [request, response, promptAsync] = Google.useAuthRequest({
clientId: process.env.EXPO_PUBLIC_GOOGLE_CLIENT_ID,
redirectUri: 'https://auth.expo.io/@your-username/your-app-slug',
scopes: ['profile', 'email'],
});
useEffect(() => {
if (response?.type === 'success' && response.authentication?.accessToken) {
fetchUserInfo(response.authentication.accessToken);
}
}, [response]);
async function fetchUserInfo(token) {
try {
const res = await fetch('https://www.googleapis.com/userinfo/v2/me', {
headers: { Authorization: `Bearer ${token}` },
});
const user = await res.json();
setUserInfo(user);
await AsyncStorage.setItem('user', JSON.stringify(user));
} catch (error) {
console.error('Failed to fetch user info:', error);
}
}
return (
<View>
{userInfo ? (
<Text>Welcome, {userInfo.name}!</Text>
) : (
<Button title="Login with Google" onPress={() => promptAsync()} disabled={!request} />
)}
</View>
);
}
로그인 후 AsyncStorage를 사용하여 사용자 정보를 저장하고 가져옵니다.
async function saveUserData(user) {
await AsyncStorage.setItem('user', JSON.stringify(user));
}
async function getUserData() {
const user = await AsyncStorage.getItem('user');
return user ? JSON.parse(user) : null;
}
async function logout(setUserInfo) {
await AsyncStorage.removeItem('user');
setUserInfo(null);
}