
React Native 앱에서 로그인 상태를 유지하는 것은 매우 중요한 기능입니다.
사용자가 앱을 종료했다가 다시 실행하거나, 새로고침을 했을 때도 로그인 상태가 유지되어야 좋은 사용자 경험을 제공할 수 있습니다.
// ❌ 잘못된 방식(처음 시도)
<Stack.Navigator>
{isLoggedIn ? (
<Stack.Screen name="MainTab" component={MainTabNavigator} />
) : (
<>
<Stack.Screen name="Start" component={StartScreen} />
<Stack.Screen name="Login" component={LoginScreen} />
</>
)}
</Stack.Navigator>
이 방식의 문제점:
import AsyncStorage from "@react-native-async-storage/async-storage";
import { NavigationContainer } from "@react-navigation/native";
import { createStackNavigator } from "@react-navigation/stack";
const Stack = createStackNavigator<RootStackParamList>();
export default function App() {
const [isLoading, setIsLoading] = useState(true);
const [isLoggedIn, setIsLoggedIn] = useState(false);
useEffect(() => {
const checkLoginStatus = async () => {
try {
// 로그인 상태와 토큰 모두 확인
const [loginStatus, token] = await AsyncStorage.multiGet([
"isLoggedIn",
"accessToken",
]);
// multiGet의 반환값 형태:
// [
// ["isLoggedIn", "true"], // loginStatus = ["isLoggedIn", "true"]
// ["accessToken", "eyJhbG..."] // token = ["accessToken", "eyJhbG..."]
// ]
if (loginStatus[1] === "true" && token[1]) {
setIsLoggedIn(true);
} else {
// 불완전한 상태일 경우 클리어
await AsyncStorage.multiRemove(["isLoggedIn", "accessToken"]);
setIsLoggedIn(false);
}
} catch (error) {
console.error("Error checking login status:", error);
setIsLoggedIn(false);
} finally {
setIsLoading(false);
}
};
checkLoginStatus();
}, []);
}
// ✅ 권장되는 방식
return (
<NavigationContainer>
<Stack.Navigator
screenOptions={{ headerShown: false }}
initialRouteName={isLoggedIn ? "MainTab" : "Start"}
>
<Stack.Screen name="Start" component={StartScreen} />
<Stack.Screen name="Login" component={LoginScreen} />
<Stack.Screen name="Signup" component={SignupScreen} />
<Stack.Screen name="MainTab" component={MainTabNavigator} />
</Stack.Navigator>
</NavigationContainer>
);
if (isLoading) {
return null; // 또는 로딩 스피너 표시
}
토큰 관리
const [loginStatus, token] = await AsyncStorage.multiGet([
"isLoggedIn",
"accessToken",
]);
에러 처리
try {
// 로그인 상태 확인
} catch (error) {
console.error("Error checking login status:", error);
setIsLoggedIn(false); // 안전한 기본값 설정
}
상태 초기화
await AsyncStorage.multiRemove([ // 사용자가 로그아웃 시
"isLoggedIn",
"accessToken",
"refreshToken",
]);
React Native에서 인증 상태를 영구적으로 저장하고 관리하는 것은 복잡할 수 있지만, 올바른 접근 방식을 따르면 안정적이고 사용자 친화적인 구현이 가능합니다.
이러한 가이드라인을 따르면 새로고침에도 견고하게 동작하는 인증 시스템을 구축할 수 있습니다.