애플리케이션을 개발할 때, API 키와 같은 민감한 정보를 안전하게 관리하는 것은 매우 중요합니다. 특히 React Native 앱의 경우 APK 파일에 직접 API 키를 포함시키면, 사용자가 APK를 추출하여 키를 노출시킬 수 있는 위험이 있습니다. 이를 방지하기 위해 Firebase Remote Config를 활용하여 API 키를 안전하게 관리하는 방법을 소개합니다.
1. Firebase 콘솔에 접속하여 Remote Config 매개변수 추가하기
먼저, Firebase 콘솔에 접속하여 Remote Config를 설정해야 합니다.
- Firebase 프로젝트 선택: Firebase 콘솔에 로그인한 후, API 키를 관리할 프로젝트를 선택합니다.
- Remote Config로 이동: 왼쪽 사이드바 메뉴에서 Remote Config를 클릭합니다.
- 매개변수 추가:
- 새 매개변수 추가 버튼을 클릭합니다.
- api_key와 같은 이름으로 매개변수를 생성합니다.
- 기본 값에 실제 API 키 값을 입력합니다.
- 저장 버튼을 클릭하여 매개변수를 저장합니다.
- 배포: 매개변수를 설정한 후, 배포 버튼을 클릭하여 변경사항을 적용합니다.
2. React Native 앱에서 Firebase Remote Config 설정하기
Firebase 콘솔에서 매개변수를 설정한 후, React Native 애플리케이션에서 이를 불러와 사용하는 방법을 설정합니다.
2.1 Firebase 설정 및 패키지 설치
React Native 프로젝트에서 Firebase를 사용하려면 react-native-firebase 패키지를 설치해야 합니다.
npm install @react-native-firebase/app @react-native-firebase/remote-config 로 설치해줍니다 (프로젝트 루트 디렉토리)
- Firebase 설정 파일 추가:
- Android의 경우, google-services.json 파일을 프로젝트의 android/app 디렉토리에 추가합니다.
- iOS의 경우, GoogleService-Info.plist 파일을 Xcode 프로젝트에 추가합니다.
- Android 설정:
- android/build.gradle 파일에 Google 서비스 플러그인을 추가합니다.
-
buildscript { dependencies { // ... 기존 의존성 classpath 'com.google.gms:google-services:4.3.15' // 최신 버전 확인 } }
- android/app/build.gradle 파일에 다음을 추가합니다.
-
apply plugin: 'com.google.gms.google-services'
2.2 Remote Config Context 설정
애플리케이션 전체에서 Remote Config 값을 쉽게 접근하고 관리할 수 있도록 Context를 설정합니다. 아래는 RemoteConfigContext와 RemoteConfigProvider를 설정하는 코드입니다.
// src/services/RemoteConfigContext.js
import React, { createContext, useContext, useEffect, useState } from 'react';
import remoteConfig from '@react-native-firebase/remote-config';
const RemoteConfigContext = createContext();
export const RemoteConfigProvider = ({ children }) => {
const [configValues, setConfigValues] = useState({
FLASK_SERVER_URL: '', // 기본값
GOOGLE_WEB_CLIENT_ID: '', // 기본값
OPENAI_API_KEY: '', // 기본값
});
useEffect(() => {
const initializeRemoteConfig = async () => {
try {
// Remote Config 기본값 설정
await remoteConfig().setDefaults({
FLASK_SERVER_URL: '', // 기본 URL
GOOGLE_WEB_CLIENT_ID: '', // 기본 클라이언트 ID
OPENAI_API_KEY: '', // 기본 API 키
});
// Remote Config 데이터 가져오기 및 활성화
await remoteConfig().fetchAndActivate();
// 각각의 Remote Config 값을 가져오기
const flaskServerUrl = remoteConfig().getValue('FLASK_SERVER_URL').asString();
const googleWebClientId = remoteConfig().getValue('GOOGLE_WEB_CLIENT_ID').asString();
const openAiApiKey = remoteConfig().getValue('OPENAI_API_KEY').asString();
// 상태에 값 저장
setConfigValues({
FLASK_SERVER_URL: flaskServerUrl,
GOOGLE_WEB_CLIENT_ID: googleWebClientId,
OPENAI_API_KEY: openAiApiKey,
});
console.log('Remote Config Initialized:', {
flaskServerUrl,
googleWebClientId,
openAiApiKey,
});
} catch (error) {
console.error('Failed to initialize Remote Config:', error);
}
};
initializeRemoteConfig();
}, []);
return (
<RemoteConfigContext.Provider value={configValues}>
{children}
</RemoteConfigContext.Provider>
);
};
export const useRemoteConfig = () => useContext(RemoteConfigContext);
설명:
- RemoteConfigContext를 생성하여 애플리케이션 전체에서 Remote Config 값을 접근할 수 있도록 합니다.
- RemoteConfigProvider 컴포넌트는 Remote Config를 초기화하고, 가져온 값을 상태로 관리합니다.
- useRemoteConfig 훅을 통해 쉽게 Context 값을 가져올 수 있습니다.
2.3 API Key 사용하기
Remote Config에서 불러온 API 키를 애플리케이션 내에서 사용하는 방법을 설명합니다. 아래는 SavedResultsScreen 컴포넌트에서 Remote Config 값을 사용하는 예제입니다.
가져온 API 키를 애플리케이션 내에서 사용합니다. 예를 들어, axios를 사용하여 API 요청을 보낼 때 헤더에 API 키를 추가할 수 있습니다.
import { useRemoteConfig } from '../services/RemoteConfigContext'; // RemoteConfigContext 사용
const SavedResultsScreen = () => {
const { OPENAI_API_KEY } = useRemoteConfig(); // Remote Config에서 OPENAI_API_KEY 가져오기
const response = await axios.post(
{
model: 'gpt-4o-mini',
messages: [{ role: 'user', content: examplePrompt }],
max_tokens: 100,
temperature: 0.9,
top_p: 0.9,
},
{
headers: {
'Content-Type': 'application/json',
Authorization: `Bearer ${OPENAI_API_KEY}`, // 여기서 사용
},
}
);
'플러팅 AI > React-native' 카테고리의 다른 글
| android만 설계해서 빌드완료한 코드 IOS 빌드 전 체크하기 (1) | 2024.12.14 |
|---|---|
| 오늘 작업 내용 정리(Play store Console,헤더추가,크레딧 로직,플러팅멘트 제한로직) (0) | 2024.12.09 |
| 네이티브 스플래시와 커스텀 스플래시를 함께 사용할 때 발생한 문제와 해결 방안 (0) | 2024.12.02 |
| React Native 앱에서 Google Cloud Run 서버 초기화 및 WebSocket 안정화 해결 (1) | 2024.12.02 |
| React Native에서 AsyncStorage 문제 해결하기: 이미지 썸네일 로딩 실패 현상 (1) | 2024.11.24 |