안드로이드 앱 개발은 단순히 기능을 구현하는 것을 넘어, 보안 문제를 철저히 관리하는 것이 필수적인 시대가 되었습니다. 사용자 데이터를 보호하고 보안 위협을 예방하기 위해 어떤 점들을 체크해야 할까요? 📋
안드로이드 앱에서 데이터를 저장하는 방법은 보안성을 높이는 데 큰 영향을 미칩니다. 잘못된 저장소 사용은 데이터 유출이나 악성 공격에 노출될 위험이 있기 때문에, 올바른 저장소 방식을 선택하는 것이 중요합니다.
getFilesDir()
또는 getCacheDir()
메서드를 사용해 데이터를 저장하세요.
외부 저장소는 데이터를 쉽게 접근하고 수정할 수 있는 공간입니다. 외부 저장소 사용 시 다음 사항에 주의하세요:
외부 저장소의 데이터를 조작하거나 탈취할 수 있는 Man-in-the-Disk 공격은 안드로이드 앱에서 발생할 수 있는 대표적인 보안 문제입니다. 이를 방지하려면 외부 저장소 사용을 철저히 검토하고 대체 가능한 내부 저장소를 활용해야 합니다.
👉 Man-in-the-Disk 공격 연구 더 알아보기
안드로이드 앱 개발에서는 퍼미션(권한) 요청을 최소화하고, 필요한 권한만 사용하도록 설정해야 합니다. 잘못된 퍼미션 관리는 보안 위협을 초래할 수 있습니다.
퍼미션의 protectionLevel
속성을 활용해 데이터 접근 권한을 안전하게 관리하세요.
signature
보호 레벨: 동일 서명을 가진 앱 간 데이터 공유만 허용하여, 무단 접근을 방지합니다.
Normal Permission은 사용자 동의 없이 자동으로 허용됩니다. 따라서 다음 사항을 고려하세요:
안드로이드 앱에서 데이터 공유를 위해 ContentProvider를 사용할 때, 외부 접근을 제한하는 설정이 필요합니다.
exported=false
설정
ContentProvider가 데이터를 공유하지 않아도 된다면, AndroidManifest.xml 파일에서 exported=false
로 설정하세요. 이는 외부 애플리케이션이 ContentProvider에 접근하지 못하도록 차단합니다.
<provider
android:name="com.example.app.MyContentProvider"
android:exported="false" />
외부 앱이 ContentProvider에 접근해야 한다면, 반드시 URI 권한 검사를 수행하고 적절히 제한하세요.
안드로이드 앱에서 사용자 입력 검증(Input Validation)과 정제(Sanitization)는 모든 보안의 기본이 됩니다. 입력 값이 의도하지 않은 방식으로 애플리케이션의 동작을 제어하지 못하도록 방어해야 합니다.
사용자 입력으로 들어오는 데이터는 의심 없이 신뢰해서는 안 됩니다. 잘못된 데이터는 아래와 같은 보안 위협으로 이어질 수 있습니다:
WebView의 악성 URL 문제:
WebView에서 사용자 입력을 기반으로 URL을 로드할 때 적절한 검증이 이루어지지 않으면 XSS 공격에 노출됩니다.
Deeplink의 잘못된 처리:
Deeplink가 외부 앱에서 악의적으로 호출되어, 앱 내부의 민감 데이터에 접근하는 취약점 사례가 보고되었습니다.
검증과 정제 철저히 수행:
의도하지 않은 Intent 방어:
android:exported="false"
로 설정.
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Intent intent = getIntent();
String data = intent.getStringExtra("key");
if (data != null && data.matches("[a-zA-Z0-9]+")) {
// 안전한 데이터 처리
} else {
// 예외 처리
}
}
이어지는 글에서 더 다양한 주의사항과 사례들을 알아봅시다. 🌐
상담만 받아보셔도 좋습니다 긱다이브의 상담으로 업체 비교를 시작해보세요