모바일 앱은 사용자 디바이스에 설치되므로 서버보다 공격 표면이 넓습니다. JS 번들 추출, 네트워크 스니핑, 로컬 저장소 접근이 가능합니다.


민감 데이터 저장

TSX
// 절대 하면 안 되는 것
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

TSX
// 중간자 공격(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 키 보호

TSX
// 절대 하면 안 되는 것
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 번들 보호

BASH
# Hermes 바이트코드로 소스 코드 난독화 (기본)
# Hermes가 활성화되면 소스 코드가 바이트코드로 변환되어 읽기 어려움

# 추가 난독화: react-native-obfuscating-transformer
# metro.config.js
module.exports = {
  transformer: {
    babelTransformerPath: require.resolve('react-native-obfuscating-transformer'),
  },
};

앱 무결성 검사

TSX
// 루팅/탈옥 감지
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 바이트코드 + 난독화 로 보호합니다
  • 보안은 완벽할 수 없지만, 공격 비용을 높이는 것 이 목표입니다
댓글 로딩 중...