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 속성을 명시적으로 설정하라고 권장한다. 이렇게 하면 코드를 추가적으로 해석할 필요없이 개발자의 의도를 명확하게 알 수 있다고 한다.