오늘날의 모바일 애플리케이션은 다양한 보안 위협에 직면하고 있기에, 개발자가 적절한 보안 모범 사례를 찾아 서비스에 적용하는 것이 꼭 필요한 업무로 여겨지고 있습니다. Android Marketplace의 금융 앱 중 적절한 보안 조치가 적용된 앱이 50% 미만으로 알려져 있습니다. 다시 말해, 앱은 IP 도난, 앱 복제, 민감한 데이터 손실, 브랜드 평판 손상 등과 같이 다양한 위협에 취약하다고 할 수 있습니다. 보안 위협과 함께 또 하나의 중요하게 고려해야 하는 것은 앱 성능입니다. 애플리케이션에서 불필요한 코드와 요소를 제거하면 더 작고 빠른 앱을 만들 수 있습니다. 코드 난독화는 오픈 소스 애플리케이션에서 매우 중요합니다.
Android Studio에는 코드 난독화를 용이하게 하는 ProGuard 및 DexGuard와 같은 몇 가지 도구가 있습니다. 이 문서는 앱을 축소, 최적화, 난독화 할 수 있는 Java의 오픈 소스 난독화 중 하나인 ProGuard에 대해 설명합니다. 문서를 다 읽으면 ProGuard에 대해 알아야 할 모든 것을 알게 될 것입니다.
ProGuard
ProGuard는 축소, 최적화, 난독화와 같은 세 가지 주요 기능을 제공합니다. 또한 Java 클래스 파일을 축소, 최적화, 난독화, 사전 검증할 수 있는 무료 도구입니다. ProGuard는 Android 애플리케이션과 대형 Java 애플리케이션 및 라이브러리에서 사용됩니다. 이를 통해 리버스 엔지니어링을 완전히 막지는 못하지만 어렵게는 만들 수 있습니다.
Android 애플리케이션은 리버스 엔지니어링이 쉽기 때문에 개발자가 기본 보안 수단으로 ProGuard를 구축하는 것이 매우 중요합니다. SDK에 내장된 도구인 ProGuard는 최소한의 구성으로 앱의 코드베이스를 보호할 수 있는 효과적인 방법입니다.
하지만 ProGuard는 기본 보안 도구이므로 보안을 위한 포괄적이고 다 계층적인 기능을 제공한다고 여기면 안 됩니다. ProGuard는 사용하지 않는 변수를 안전하게 제거하고 이 명령줄 도구의 중요한 기능인 애플리케이션 크기를 줄입니다.
ProGuard의 특징
ProGuard는 앱 크기를 줄이고 애플리케이션을 최적화하는 중요한 기능을 제공합니다. 이러한 기능은 다양한 기술을 통해 지원할 수 있습니다. 축소(Shrinking), 최적화, 난독화, 사전 검증은 리버스 엔지니어링 시도를 차단하고 앱 크기를 줄이며 앱 성능을 일정 수준 향상시키는 ProGuard의 중요한 기능입니다. 이것들을 하나씩 자세히 살펴보겠습니다.
축소(Shrinking)
축소는 APK의 크기를 줄이는 것을 말합니다. ProGuard를 사용하면 앱내 사용되지 않는 변수, 메소드, 클래스를 탐지할 수 있습니다. 사용하지 않는 코드는 애플리케이션과 라이브러리에서 모두 제거됩니다. 축소는 두 단계로 이루어집니다.
- 코드 축소 – 사용하지 않는 변수, 메소드, 클래스, 속성을 애플리케이션과 해당 라이브러리 종속성에서 제거하는 것을 의미합니다.
- 리소스 축소: 애플리케이션과 해당 라이브러리 종속성에서 사용되지 않는 리소스 파일을 제거하는 것을 의미합니다.
최적화
최적화는 바이트코드를 최적화하는 것을 말합니다. 사용하지 않는 명령어는 앱 성능에 부정적인 영향을 미칠 수 있습니다. 생성된 코드의 작은 세그먼트에 있는 중복 명령어는 peephole 최적화 기술을 통해 제거됩니다. 이 단계에서 중복된 코드가 제거되고 더 짧은 명령어로 대체될 수 있는 명령어가 식별되어 제거됩니다.
난독화
난독화는 코드를 읽기 어렵게 만드는 과정입니다. 무단으로 액세스 권한을 얻은 제3자는 코드는 이해할 수 없습니다. 사용되지 않는 코드를 제거한 후 나머지 클래스, 필드, 메서드의 이름을 임의 문자를 사용하여 변경합니다. 코드 세그먼트의 원래 의도를 해커로부터 숨기기 위해 난독화가 사용됩니다.
사전 검증
사전 검증은 보다 빠른 클래스 로드를 최대한 활용하기 위해 특정 Java 버전(Java 6 또는 Java Micro Edition)의 클래스 파일에 사전 검증 정보를 삽입하는 것을 말합니다.
ProGuard를 활성화하는 방법
ProGuard는 최소한의 구성으로 애플리케이션을 보호하는 데 사용되며 릴리스 모드에서 사용하기에 적합한 오픈 소스 소프트웨어입니다. 다음은 ProGuard의 작동 방식을 이해하는 데 도움이 되는 몇 가지 예시입니다.
- build.gradle 파일의 minifyEnabled 속성을 사용하여 릴리스 빌드에 대해 ProGuard를 사용하거나 사용하지 않도록 설정합니다.
- 디버그 빌드에서 ProGuard를 활성화하지 마세요. 디버그 빌드에서 ProGuard가 활성화된 경우에는 디버깅이 매우 복잡해집니다.
- ProGuard를 활성화하려면 minifyEnabled 속성을 true로 설정해야 합니다.
- minifyEnabled 속성은 릴리스 빌드의 설정을 제어합니다.
- 기본 ProGuard 설정은 getDefaultProGuardFile을 사용하여 Android SDK 도구에서 가져올 수 있습니다.
- ProGuard 최적화를 위해서는 proguard-android.txt를 선택하기보다는 proguard-android-optimise.txt 구성 파일을 선택해야 합니다.
- 사용자 지정 ProGuard 규칙을 추가하도록 선택할 수도 있습니다. Android Studio는 모듈의 루트에 있는 proguard-rules.pro 파일로 이 문제를 해결합니다.
- ProGuard 규칙은 난독화, 최적화, 쉬링크 프로세스에서 분리해야 하는 코드를 결정하는 데 도움이 됩니다.
ProGuard 활성화에 대한 자세한 내용은 이 링크를 참조하세요.
ProGuard 구현의 이점
ProGuard는 Android 애플리케이션에 매우 권장되는 오픈 라인 명령 소스 도구로 코드의 가독성을 떨어뜨려 애플리케이션의 보안을 강화합니다. 이 도구는 보안을 강화할 뿐만 아니라 애플리케이션을 축소하여 컴팩트한 패키지를 전달합니다. 다음은 애플리케이션에서 ProGuard를 사용할 때의 주요 이점입니다.
컴팩트한 구성
ProGuard는 다른 Java 난독화기와 비교하여 템플릿 기반 구성을 가지고 있습니다. 이것이 ProGuard의 가장 큰 장점 중 하나입니다. 몇 가지 직관적인 명령줄 옵션이나 간단한 구성 파일을 사용하여 ProGuard를 사용할 수 있습니다.
정적 분석으로부터 보호
해커는 정적 분석을 사용하여 애플리케이션의 소스 코드에 액세스합니다. 해커는 정적 분석을 통해 앱의 소스 코드와 제어 흐름을 분석하여 앱을 실행하지 않고도 앱이 어떻게 작동하는지 파악할 수 있습니다. ProGuard는 디컴파일러로부터 애플리케이션을 보호할 수 있습니다.
더욱 어려워진 리버스 엔지니어링
적절한 ProGuard 규칙을 적용하면 리버스 엔지니어링이 어려워질 수 있습니다. ProGuard는 모호한 이름으로 코드를 축소하고 난독화합니다. 해커가 악의적인 목적으로 애플리케이션에 성공적으로 액세스할 경우 중요한 데이터가 유출되고 노출될 수 있습니다. ProGuard의 난독화 기능은 리버스 엔지니어링 시도를 억제합니다.
애플리케이션 효율성 향상
애플리케이션의 코드베이스는 ProGuard를 통해 보다 효율적으로 만들어집니다. 최적화 기능으로 애플리케이션의 성능을 향상시키고 애플리케이션의 불필요한 요소를 모두 제거합니다. ProGuard가 활성화된 애플리케이션은 상대적으로 속도가 빠릅니다.
비활성 코드 나열
ProGuard는 애플리케이션이 더 이상 사용하지 않는 비활성 코드를 식별하고 소스 코드에서 제거할 수 있습니다.
애플리케이션 크기 감소
ProGuard를 사용하면 APK 파일 크기를 줄일 수 있습니다. ProGuard는 애플리케이션 크기를 20%에서 90%까지 줄일 수 있습니다. 애플리케이션 및 라이브러리 종속성에서 사용되지 않는 코드와 리소스를 삭제하여 메모리 설치 공간이 더 작은 소형 패키지를 만들 수 있습니다.
ProGuard의 또 다른 중요한 이점은 Ant 및 JME Wireless Toolkit을 위한 선택적 그래픽 사용자 인터페이스 및 플러그인을 제공하는 것과 함께 몇 초 만에 몇 메가바이트를 처리할 수 있다는 것입니다.
ProGuard의 단점
ProGuard는 여러 가지 이점을 제공하지만 몇 가지 단점이나 제한 사항을 알아야 합니다. ProGuard는 모바일 앱 보안의 좋은 출발점이 될 수 있지만 다른 보안 조치와 함께 적용되어야 합니다. ProGuard에만 의존하는 것은 좋은 방법이 아닙니다. 이 섹션에서 ProGuard의 몇 가지 단점을 살펴보겠습니다.
- 구성이 잘못될 경우 애플리케이션이 충돌할 수 있습니다. 이러한 예상치 못한 결과는 부정적인 영향을 미칠 수 있습니다.
- 추가 테스트가 필요합니다.
- 메서드 이름이 난독화되어 Stacktrace를 해독하기 어렵습니다.
- ProGuard를 적용한다고 해서 해커가 애플리케이션에 액세스하지 못하게 되는 것은 아닙니다. 애플리케이션의 특정 부분이 여전히 공격에 취약할 수 있습니다.
- ProGuard는 Java 바이트코드를 최적화하므로 범용 최적화 도구입니다. 따라서 Android 애플리케이션 보호 전용으로 설계된 것이 아닙니다.
- ProGuard는 정적 분석에 대한 보호 기능만 제공합니다. 런타임 동안 동적 분석을 억제할 수 없습니다.
- ProGuard는 이름 난독화 기술을 사용하여 클래스 이름을 바꾸지만 코드에서 산술 및 논리 식을 난독화 하지는 않습니다.
- 바이트코드는 ProGuard의 주요 관심 영역입니다. 이 기능은 애플리케이션의 다른 구성 요소로 확장되지 않습니다.
- ProGuard는 라이브러리 jar를 읽는 동안 보이는 개인 또는 패키지 라이브러리 클래스를 간과하는 경향이 있으므로 -dontskipnonpubliclibraryclasses 옵션 또는 -dontskipnonpubliclibraryclassmembers 옵션을 사용하는 것이 좋습니다.
경우에 따라 -dontoptimize 옵션을 사용하여 최적화를 비활성화해야 할 수 있습니다.
마무리하며
대부분의 개발자들은 난독화 기능을 위해 ProGuard를 활용하지만 ProGuard의 장점은 보안 측면에만 국한되지 않습니다. ProGuard는 앱 크기를 크게 줄일 수 있습니다. 사용되지 않는 코드를 삭제하고 클래스 및 해당 멤버의 이름을 임의 문자로 바꿉니다.
ProGuard를 활성화하면 애플리케이션이 더 작아지고 최적화됩니다. 사용되지 않는 코드를 제거하는 것은 물론 더 이상 참조되지 않는 리소스도 제거합니다. ProGuard는 추가적인 종속성을 필요로 하지 않습니다. 식별자를 단축하고 클래스 및 인라인 메소드를 병합하며 불필요한 매개 변수를 제거할 수 있습니다. 소스 코드를 변경하지 않고도 ProGuard는 로깅 코드를 제거할 수 있습니다.
해커는 백 엔드 서버, 암호에 대한 정보에 액세스하고 리버스 엔지니어링에 성공하면 코드 수정을 수행할 수 있습니다. ProGuard는 정적 분석으로부터 기본적인 보호 기능을 제공합니다. 해커로부터 절대적인 보호를 보장하지는 않지만 애플리케이션을 리버스 엔지니어링하기 어렵게 만들어 해커를 단념 시킬 수 있습니다.
앱실링(AppSealing)은 제로 코딩을 통해 앱 보호를 가능하게 하는 차세대 애플리케이션 보안 솔루션 입니다. 게임 애플리케이션부터 민감함 데이터를 처리하는 핀테크 앱에 이르기까지, 앱의 매니페스트 파일, 기본 라이브러리, 리소스 파일, 자산 파일 등을 보호, 최적화, 암호화하는 런타임 보안 기능을 추가할 수 있습니다. 앱 성능을 저하시키지 않는 강력한 보안 솔루션을 통해 앱 시장에서 쉽게 경쟁력을 확보할 수 있습니다. 지금 바로 당사 팀에 문의하여 iOS, Android, 하이브리드 애플리케이션을 데이터 도난과 조작으로부터 보호하세요.