Flutter(플러터)란?
플러터(Flutter)는 구글이 출시한 오픈 소스 크로스 플랫폼 GUI 애플리케이션 프레임워크이며 안드로이드, iOS, 윈도우즈, 리눅스 및 웹용 애플리케이션과 구글 퓨시아용 앱의 주된 소스코드로 사용됩니다. 한번의 코딩으로 멀티 플랫폼에 대한 개발이 가능하기 때문에 최근 몇 년간 상당한 인기를 얻고 있지만, 특정 보안 리스크는 앱 보안에 위협이 됩니다. Flutter 앱은 적절한 보안 조치가 이루어지지 않을 경우 민감한 데이터가 노출될 수 있습니다. Flutter 앱에서 사용되는 프로그래밍 언어인 Dart 코드는 애플리케이션 구동을 쉽게 살펴볼 수 있는 메타데이터를 생성하기 때문에 리버스 엔지니어링은 Flutter 앱이 직면하고 있는 가장 일반적인 위협 중 하나입니다. 해커는 Flutter 앱의 보안을 손상시키고, 탬퍼링(tampering)을 시도할 수 있도록 정적 분석을 합니다. 이번 글에서는 Flutter 앱과 Flutter 앱의 보안을 보장하기 위한 방안을 살펴보겠습니다.
Flutter 보안 철학
Flutter는 단일 코드베이스에서 네이티브하게 컴파일된 다중 플랫폼 애플리케이션의 개발을 용이하게 합니다. Flutter 팀은 Flutter 프레임워크로 제작된 앱의 보안 결함을 해결하기 위한 강력한 조치를 제공합니다. Flutter 보안 전략의 기반을 이루고 있는 보안 철학에 대해 살펴보겠습니다.
- 식별: 핵심 자산, 위협과 취약성을 식별하여 주요 보안 리스크를 추적하고, 이에 대한 우선순위를 지정합니다.
- 탐지: 취약점을 찾아내기 위해 취약점 스캐닝, 정적 애플리케이션 보안 테스트, 퍼징(Fuzzing)과 같은 기술 및 도구를 사용하여 취약성을 정확히 찾아냅니다.
- 보호: 보안 리스크를 방지하기 위해 이미 알려진 취약성을 완화하고, 소스 위협의 근원으로부터 핵심 자산을 보호합니다.
- 대응: 취약점이나 침해행위를 보고, 심사 및 대응하기 위한 절차를 정의합니다.
- 복구: 앱의 피해를 억제하고, 영향을 최소화하여 침해로부터 복구할 수 있는 기능을 갖추도록 합니다.
Flutter 앱을 안전하게 보호하는 법
개발자는 개발에 필요한 노력을 최소화하고, 기존의 성능을 유지하기 위해 Flutter를 사용합니다. 지적 재산 도용, 복제 및 템퍼링은 Flutter 앱을 개발할 때 해결해야 할 여러 보안 문제 중 하나입니다. Flutter 앱을 보호하기 위한 가장 중요한 10가지 방법은 다음과 같습니다.
1. 코드 난독화 사용
해커는 앱 코드를 리버스 엔지니어링할 수 있습니다. 해커가 애플리케이션에 대한 공격을 시작하면 문자열, 메서드, 클래스 이름 및 API 키가 유출될 수 있으며, 데이터가 일반 텍스트로 저장되어 있는 경우 해커는 이러한 코드를 쉽게 악용할 수 있습니다. 난독화란 해커가 코드를 읽기 어렵게 만드는 과정입니다. 컴파일된 Dart 코드에서 함수와 클래스 이름을 숨깁니다. 앱의 바이너리를 수정하는 코드 난독화 기법을 통해 Flutter 앱의 보안을 유지할 수 있습니다. Dart 측면에 있어서 -obfuscate 매개변수를 사용하여 데이터를 난독화하십시오.
2. API 키에 대한 보안 유지
난독화 또는 암호화를 사용하여 보호되지 않는 API 키는 해커에 의해 악용될 수 있습니다. 애플리케이션 제한 제어를 적용하여 API 키에 액세스할 수 있는 애플리케이션, 웹사이트 또는 IP 주소를 제어할 수 있습니다. 런타임에 API 키 암호화/복호화하는 것은 API 키를 보호하고, 해커가 데이터를 해독하는 것을 방지하기 위한 또 다른 효과적인 방법입니다. 값이 노출되는 리스크를 최소화하려면 저장소에서 API 키를 추적하지 않아야 합니다. 민감한 데이터를 저장하기 위해 Firebase Remote Config를 사용하는 것은 권장하지 않습니다.
3. Flutter 탈옥 탐지기능 사용
Flutter의 Flutter_jailbreak_detection 패키지는 탈옥 또는 루팅된 기기의 보안 위협으로부터 앱을 보호하는 데 도움이 되며, 이 패키지는 앱이 손상된 기기에서 실행되고 있는지 여부를 감지하는 데 사용할 수 있습니다. 탈옥이나 루팅된 장치는 더 많은 권한을 가지며, 악성 소프트웨어나 바이러스를 쉽게 설치할 수 있습니다. 탈옥 감지기능이 있는 Flutter 앱은 Android의 경우 RootBeer, iOS는 DTTJailbreakDetection을 사용하여 앱이 탈옥 또는 루팅된 기기에서 실행 중인지 감지합니다.
4. 보안이 보장된 네트워크 연결 확인
모바일 앱과 서버 간의 보안 네트워크 연결은 앱 보호를 보장하기 위한 전제 조건입니다. 전송 보안 계층(Transport Secure Layer, TSL)을 사용하면 보안이 보장된 상태에서 안전하게 정보를 교환할 수 있습니다. 도메인을 화이트리스트에 추가하면 안전하지 않은 트래픽을 제한하는 데 도움이 될 수 있습니다. 인증서 피닝을 구현하는 것은 모든 연결의 보안을 보장해줄 또 하나의 모범 사례입니다. 이를 통해 해커가 불법 인증서를 사용하여 전송 중인 데이터를 템퍼링 하는 것을 방지할 수 있습니다.
5. 반드시 필요한 권한만 사용
애플리케이션은 앱 권한을 통해 하드웨어와 네이티브 API에 액세스할 수 있습니다. 불필요한 권한 요청이 포함되어 있는 플러그인을 추가하지 마십시오.
6. 사용자 데이터에 대한 보안 유지
때로는 애플리케이션에 PII와 같은 민감한 데이터를 저장해야 할 수도 있습니다. PII, 인증 토큰 또는 기타 민감한 데이터의 저장이 필요한 경우 Flutter_secure_storage 패키지를 사용하십시오. 이 패키지는 안드로이드에서는 Keystore을 사용하며, iOS에서는 Keychains를 사용합니다. 데이터를 로컬에 저장하고, 탬퍼링을 방지하기 위해 Dart 패키지인 Hive를 사용할 수 있습니다.
7. 백그라운드 스냅샷 보호
모바일 기기는 앱의 최종 상태에 대한 스냅샷을 표시하는 작업 전환기 기능이 있지만, 이 스냅샷이 민감한 정보를 노출할 수 있습니다. secure_application 패키지는 요청에 따른 보기에서 애플리케이션 콘텐츠를 보호하도록 설계되었습니다.
8. 로컬 인증 구현
Local_auth는 Flutter 앱에 대한 로컬 인증을 활성화해주는 Flutter 플러그인입니다. 생체 인증은 결제정보나 기타 중요 정보를 저장하는 앱을 보호하는 데 유용합니다. 또한, 로컬 인증은 기기가 도난당한 경우 보호를 위한 추가 계층을 제공하는데 도움이 됩니다.
9. 개발자 신원에 대한 보안 유지
개발자 신원을 노출할 수 있는 모든 데이터는 암호화해야 합니다. key.jks와 keystore.properties 등의 민감한 파일은 GPG로 암호화해야 합니다. 여러분의 저장소에서 암호화되지 않은 민감한 데이터는 추적하지 마십시오.
10. CI 인프라에 대한 보안 유지
CI 인프라는 개발자가 코드를 공유된 저장소에 수시로 통합하는 것을 의미합니다. 개발자는 앱이 보호된 환경에서 구동되고 있다는 것을 보장하기 위해 취약성을 지속적으로 모니터링하고, 가상머신을 업데이트해야 합니다. API 키와 기타 민감한 데이터를 코드에 추가하지 마십시오. 이러한 대상은 프로젝트의 비밀 설정에 포함되어 있어야 합니다.
보안에 관해 명심해야 할 중요한 모범 사례
- 최신 상태 유지: Flutter 앱의 보안을 강화하는 데 있어서 최신 Flutter SDK, 플러그인 및 패키지를 최신 상태로 유지하는 것이 필수적입니다. Flutter 팀은 이전 버전에서 식별된 보안 결함을 해결하기 위해 정기적으로 업데이트를 배포합니다.
- 애플리케이션의 종속성 최신화하기: 패키지 종속성을 적기에 업그레이드해야 합니다. 특정한 버전의 종속성에 고정하는 것은 권장하지 않으나, 고정하는 것으로 결정한 경우 적시에 검사를 수행하여 종속성이 제대로 업데이트되고 있는지 확인해야합니다.
- Flutter 버전 최신 상태로 유지하기: 개인별 맞춤형 Flutter 버전을 사용하는 경우 중요 보안 업데이트를 놓칠 수 있습니다. 이러한 버전에는 최신 버전에서는 일반적으로 확인할 수 있는 보안 수정사항이 포함되어 있지 않을 수 있습니다. 그러므로 여러분의 Flutter를 수시로 업데이트해야 합니다.
마무리하며
Flutter는 다중 플랫폼을 위한 네이티브 애플리케이션을 개발하기 위한 비용 효율적인 방안입니다. Flutter 앱은 네이티브 코드로 직접 컴파일되므로, 이로 인해 개발자는 Flutter 앱에서 보안이 주요 고려사항이 아니라고 생각하게 됩니다. 하지만, 다른 모든 기존의 모바일 앱과 마찬가지로 Flutter 앱도 해킹을 당할 수 있는 리스크가 있습니다. Flutter 앱은 악의적인 환경에서 구동되는 경우 탬퍼링과 동적 공격에 취약합니다. 바이너리를 어떻게 리버스 에니지니어링하는지 알고 있는 해커는 Flutter 앱의 보안 상 허점을 쉽게 악용할 수 있습니다. Flutter 앱에 대한 보안을 보장하기 위해서는 수정이나 탬퍼링을 식별하기 위한 런타임 탐지를 포함한 철저한 보안 조치가 필수적입니다. Flutter가 개발자들이 널리 사용하는 프레임워크로 부상하고 있지만, 적절한 보안 조치가 이루어지지 않은 상태에서 앱을 개발하면 치명적인 결과를 가져올 것입니다. 이번 글에서 살펴본 보안 조치는 다양한 위협으로부터 Flutter 모바일 앱을 보호하는 데 도움이 될 것입니다.