본문 바로가기
공부/Android

Android - android:exported=”true”는 무엇일까?

by hhhello 2024. 6. 15.

AndroidManifest.xml 파일에서 컴포넌트 코드를 보면 종종 exported속성이 설정 되어 있는 것을 볼 수 있다. 도대체 android:exported=”true”는 뭘까? 이번 포스팅에서 알아보자.

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">

    <application
        ... 
        >
        <activity
            android:name=".DetailActivity"
            android:exported="true" />
            ...
    </application>
</manifest>

Android 공식 문서에 보면 다음과 같이 나와있다.

android:exported 속성은 다른 애플리케이션의 구성요소에서 실행할 수 있는 구성요소(활동, 서비스, broadcast receiver 등)인지를 설정합니다.

  • true인 경우 모든 앱이 활동에 액세스할 수 있고 활동의 정확한 클래스 이름으로 활동을 실행할 수 있습니다.
  • false인 경우 같은 애플리케이션에 있는 구성요소나 동일한 사용자 ID를 가진 애플리케이션 또는 권한이 있는 시스템 구성요소만 활동을 실행할 수 있습니다.

이 속성의 기본값에 관한 로직은 시간이 지남에 따라 변경되었으며 구성요소 유형과 Android 버전에 따라 달랐습니다. 예를 들어 API 수준 16(Android 4.1.1) 이하에서는 <provider> 요소의 값이 기본적으로 true로 설정됩니다. 이 속성을 명시적으로 설정하지 않으면 기기 간에 서로 다른 기본값을 사용할 위험이 있습니다.

풀이하면 해당 컴포넌트가 다른 앱에 의해 실행 될 수 있는지 없는지를 나타낸다. true인 경우 모든 앱에서 해당 컴포넌트를 접근할 수 있지 false앱 내부나 동일한 사용자 ID를 가진 앱 또는 권한이 있는 시스템 컴포넌트가 접근할 수 있다.

또, 공식문서를 보면 ‘서비스 거부 공격, 앱의 내부 기능을 수정하기 위해 내부 구성요소에 부적절하게 액세스하는 다른 앱, 민감한 정보 유출, 취약한 애플리케이션 컨텍스트에서 코드 실행’의 영향이 있다고 한다.

android:exported가 있는 가장 큰 이유는 보안에 대한 문제인 것 같다.

공식문서에서는 항상 android:exported 속성을 명시적으로 설정하라고 권장한다. 이렇게 하면 코드를 추가적으로 해석할 필요없이 개발자의 의도를 명확하게 알 수 있다고 한다.