릴리즈 후 Flutter 앱의 메모리 누수 (출시 전에 잡는 방법)

발행: (2025년 12월 30일 오후 10:09 GMT+9)
5 min read
원문: Dev.to

Source: Dev.to

Cover image for What Your Flutter App Leaks After Release (And How to Catch It Before Launch)

몇 달 동안 Flutter 앱을 만들었습니다. QA를 통과했고, 사용자들은 앱을 좋아합니다. 이제 프로덕션에 배포합니다.
그런데 보안 연구원에게서 메일이 옵니다: “앱에 Firebase 키가 하드코딩돼 있는 걸 발견했어요.”

빌드된 Flutter 앱에서 공격자가 보는 것

Flutter 앱을 컴파일하면 최종 패키지에 UI 코드 외에도 여러 정보가 포함됩니다. 누출될 수 있는 항목은 다음과 같습니다:

하드코딩된 비밀

  • Dart 코드에 삽입된 API 키
  • Firebase 인증 정보(데이터베이스 URL, API 키, 프로젝트 ID)
  • OAuth 클라이언트 시크릿
  • 서드파티 서비스 토큰

이들은 컴파일 후에도 남아 최종 빌드에 포함되며, 앱을 디컴파일하는 사람이라면 누구나 읽을 수 있습니다.

Firebase 설정 오류

  • 제한 없는 데이터베이스 규칙
  • 공개 스토리지 버킷
  • 인증 요구사항 누락
  • 클라이언트 코드에 포함된 Admin SDK 인증 정보

위험한 권한

INTERNET                         (필수이지만 위험한 권한과 함께 사용되는 경우가 많음)
READ_EXTERNAL_STORAGE / WRITE_EXTERNAL_STORAGE   (정당한 이유 없이)
ACCESS_FINE_LOCATION            (불필요할 때)
CAMERA / MICROPHONE              (프라이버시 플래그 발생)

프로덕션에 포함된 디버그 빌드

  • AndroidManifest.xmldebuggable=true 남겨두기
  • 개발용 엔드포인트 노출
  • 스택 트레이스가 포함된 상세 오류 메시지
  • 리버스 엔지니어링을 쉽게 하는 디버그 심볼

이런 문제가 발생하는 이유

Flutter의 컴파일 과정:

  • Dart 코드 → 네이티브 코드로 컴파일
  • 에셋, 설정, 매니페스트 → 그대로 번들링
  • 문자열, URL, 키 → 종종 읽을 수 있는 형태로 남음
  • 트리‑쉐이킹(Tree‑shaking)으로 하드코딩된 비밀은 제거되지 않음

코드가 컴파일되었더라도 디컴파일 도구를 사용하면 다음을 추출할 수 있습니다:

  • 에셋 파일
  • Android 매니페스트 권한
  • 컴파일된 문자열 리터럴
  • 리소스 파일 및 설정

릴리즈 전에 이를 잡는 방법

사전 릴리즈 보안 체크리스트

  • 비밀을 절대 하드코딩하지 않기 – 환경 변수나 보안 금고 사용.
  • Firebase 규칙 감사 (키가 공개된다고 가정).
  • AndroidManifest.xml 검토 – 디버그 플래그와 과도한 권한 확인.
  • 프로덕션 빌드에서 디버그 심볼 제거.
  • 디컴파일 도구로 직접 앱 테스트.

자동 스캔

저는 FlutterGuard 를 만들었습니다. (Firebase 키를 프로덕션에 배포한 뒤(실제 사건) 보안 연구원이 발견했기 때문입니다.) 이 도구는 Flutter 앱을 디컴파일하고 공격자가 보는 내용을 정확히 보여줍니다:

  • 하드코딩된 비밀 / URL / Firebase 설정
  • 위험한 권한 및 디버그 빌드
  • 약 3분 안에 제공되는 명확하고 실행 가능한 보고서

제공: 하루에 3회 무료 스캔, 카드 정보 필요 없음.

사용해 보시고 개선할 점을 한 가지 알려 주세요—당일에 바로 수정해 드립니다.

안전하게 개발하고, 보안 있게 배포하세요. 🔒

Back to Blog

관련 글

더 보기 »

ASP.NET Core에서 Worldpay 웹훅 디버깅

소개 Worldpay를 프로덕션 ASP.NET Core 애플리케이션에 통합할 때, webhook 실패를 디버깅하는 것은 가장 어려운 문제 중 하나가 될 수 있습니다. 이벤트는 …