보안 — 데이터 보호와 취약점 방어
모바일 앱은 사용자 디바이스에 설치되므로 서버보다 공격 표면이 넓습니다. JS 번들 추출, 네트워크 스니핑, 로컬 저장소 접근이 가능합니다.
민감 데이터 저장
// 절대 하면 안 되는 것
import AsyncStorage from '@react-native-async-storage/async-storage';
await AsyncStorage.setItem('token', 'jwt_secret_token'); // 암호화 없이 평문 저장!
await AsyncStorage.setItem('password', 'user_password'); // 비밀번호 저장!
// 올바른 방법: Keychain/Keystore 사용
import * as Keychain from 'react-native-keychain';
// 토큰 안전하게 저장
await Keychain.setGenericPassword('auth', token, {
accessible: Keychain.ACCESSIBLE.WHEN_UNLOCKED_THIS_DEVICE_ONLY,
accessControl: Keychain.ACCESS_CONTROL.BIOMETRY_CURRENT_SET,
});
// 토큰 읽기
const credentials = await Keychain.getGenericPassword();
if (credentials) {
const token = credentials.password;
}
네트워크 보안
SSL Pinning
// 중간자 공격(MITM) 방지 — 서버 인증서를 앱에 고정
// react-native-ssl-pinning 사용
import { fetch as sslFetch } from 'react-native-ssl-pinning';
const response = await sslFetch('https://api.example.com/data', {
method: 'GET',
sslPinning: {
certs: ['server_cert'], // 고정할 인증서
},
headers: {
Authorization: `Bearer ${token}`,
},
});
API 키 보호
// 절대 하면 안 되는 것
const API_KEY = 'sk_live_abc123xyz'; // JS 번들에 노출!
// 올바른 방법 1: 환경변수 (빌드 시점)
// .env 파일은 gitignore에 추가
import Config from 'react-native-config';
const apiKey = Config.API_KEY;
// 올바른 방법 2: 네이티브 모듈로 숨기기
// API 키를 네이티브 코드에 저장 (완전히 안전하지는 않지만 JS 번들보다 나음)
// 가장 안전한 방법: 자체 백엔드 프록시
// 클라이언트 → 자체 서버 → 외부 API
// API 키는 서버에만 보관
JS 번들 보호
# Hermes 바이트코드로 소스 코드 난독화 (기본)
# Hermes가 활성화되면 소스 코드가 바이트코드로 변환되어 읽기 어려움
# 추가 난독화: react-native-obfuscating-transformer
# metro.config.js
module.exports = {
transformer: {
babelTransformerPath: require.resolve('react-native-obfuscating-transformer'),
},
};
앱 무결성 검사
// 루팅/탈옥 감지
import JailMonkey from 'jail-monkey';
if (JailMonkey.isJailBroken()) {
Alert.alert('보안 경고', '루팅/탈옥된 기기에서는 사용할 수 없습니다');
}
// 디버거 감지
if (__DEV__) {
console.log('개발 모드');
} else if (JailMonkey.isDebuggedMode()) {
// 릴리스에서 디버거 감지 → 앱 종료
}
보안 체크리스트
| 항목 | 방법 |
|---|---|
| 토큰 저장 | Keychain/Keystore |
| API 키 | 서버 프록시 또는 환경변수 |
| 네트워크 | HTTPS + SSL Pinning |
| 코드 보호 | Hermes + 난독화 |
| 입력 검증 | 클라이언트 + 서버 양쪽 |
| 루팅 감지 | jail-monkey |
| 화면 캡처 방지 | 플랫폼별 네이티브 설정 |
정리
- 민감 데이터는 AsyncStorage가 아닌 Keychain/Keystore 에 저장하세요
- SSL Pinning 으로 중간자 공격을 방어하세요
- API 키는 서버 프록시 를 통해 보호하는 것이 가장 안전합니다
- JS 번들은 Hermes 바이트코드 + 난독화 로 보호합니다
- 보안은 완벽할 수 없지만, 공격 비용을 높이는 것 이 목표입니다
댓글 로딩 중...