1. Broadcast

Broadcast 네트워크, 안드로이드에서 주로 사용하는 방법으로 안드로이드에서는 모든 package intent 전달하는 역할을 한다.

 

송신 package에서 bradcast 통해 intent 보내면 수신 package에서는 receive() API 통해서 intent 받을 있다.

 

 

 

1) broadcast 던지는 이유

 

여기서 intent broadcast 하는 이유에 대해서 간단히 알아보면 다음과 같다.

안드로이드는 보안이슈를 해결하기 위해 package 데이터를 자유롭게 주고받을 수가 없도록 강제했다. 하지만 package간의 데이터 송수신이 없을 수는 없기 때문에 intent라는 일종의 데이터를 주고받기위한 포맷을 제공한다.

 

Intent 하나의 택배박스라고 생각하면 이해하기 편할 같다. 예를들어 송신자는 data 수신자에게 전달하고 싶을때 다음과 같은 과정을 거쳐야 한다.

 

  • Intent 생성
  • 전달하고자 하는 data intent객체 안에 넣어
  • intent broadcast 송신

 

해당 과정을 코드로 옮기면 아래와 같다.

  • 송신부 코드
Intent().also { intent ->
        intent.setAction("com.example.broadcast.MY_NOTIFICATION")
        intent.putExtra("data", "Notice me senpai!")
        sendBroadcast(intent)
}

이렇게 broadcast intent 넣어서 전달하게되면 수신자는 receive 통해서 intent 받을 있다.

 

 

  • 수신부 코드
 public class MyBroadcastReceiver extends BroadcastReceiver {
            private static final String TAG = "MyBroadcastReceiver";
            @Override
            public void onReceive(Context context, Intent intent) {
                String sb = nintent.getAction();
            }
       }

마찬가지로 receive 수행하는 부분을 코드로 보면 위와 같다. receive 진행하기 위해서는 xml receive permission 주어야하고 위와 같이 onReceve() 메소드를 구현하게되면 임의의 package broadcast 보낼때 onReceive() 자동으로 호출되며 매개변수 intent broadcast 수신해서 얻은 intent 된다.

수신한 intent안의 데이터를 얻고 처리하는 방법은 onReceive() 메소드 안에 Android API 통해서 얻어와서 특정 변수 등에 저장해주면 된다.

 

broadcast 통한 데이터의 송수신은 하나의 package내부에서 동작할 수도 있고 package 데이터 송수신을 목적으로 사용할 수도 있다. 보통은 package 송수신을 위해 사용하며 내부 데이터 송수신의경우 AIDL 활용한 Service bind방법을 이용한다.

 

 

 

 

 

 

2. Protected Broadcast

Broadcast 수신자를 정하지 않고 모두에게 보내는 방법이다. 수신측에서 데이터를 받아보고 내가 처리해야하는 데이터면 처리하고 아니면 폐기하는 방법이다.

이러한 방법은 의도치않은 수신자에게도 데이터를 매번 보내기 때문에 보안상 이슈가 발생할 있다.

 

그래서 Android에서는 protected broadcast 제공한다.

protected broadcast 특정 권한을 가진 package 수신할 있도록 보안 기능이 향상된 broadcast이다. 틀에서는 broadcast 보내는 방법과 크게 다르지 않다.

 

  • 송신부 코드
sendBroadcast(new Intent("com.example.NOTIFY"),
                  Manifest.permission.SEND_SMS);

기본 broadcast 차이점은 sendBroadcast() 사용할 permission부분을 추가로 넣어주는게 전부이다.

 

  • 수신부 코드
<uses-permission android:name="android.permission.SEND_SMS"/>

수신부에서는 위와같이 xml파일 Activity 권한을 선언해야지만 broadcast 받을 있다. 해당 권한이 없다면 broadcast 받을 없다.

 

여기서 이게 과연 보안적인 의미가 있을까? 하는 의문이 들 수 있는데…

보안성이 높아지는 이유는 다음과 같다. 가지 관점에서 보면

 

첫번째로 시스템권한을 얻기위해서는 app이 system uid(시스템권한)를 가져야한다.
두번 째로 안드로이드에서 패키지 네임은 고유의 값으로 중복해서 사용할 수 없다.

 

 

1) 시스템 권한

 

android.permission.SEND_SMS는 안드로이드 시스템에서 기본적으로 제공하는 system권한이다.

app system권한을 주어야만 <uses-permission android:name="android.permission.SEND_SMS"/> 사용해서 권한을 얻고 broadcast수신이 가능하다.

하지만 시장에 나온 바이너리환경에서 app 만들면서 system권한을 얻을 없다.

 

 

2) 고유의 패키지 네임

 

그럼 <uses-permission android:name="android.permission.SEND_SMS"/> 선언된 app 동일한 패키지 네임을 가지는 app 만들어서 broadcast 수신하는 방법은 어떨까?

 

Android 모든 권한관리를 package기반으로 하기 때문에 가정처럼 <uses-permission android:name="android.permission.SEND_SMS"/>권한을 가지고 있는 package name 동일한 app을만들면 protected broadcast 수신할 있다.

 

하지만 Android에서는 package name 보안적으로 중요한 요소이기 때문에 고유의 값으로 특별하게 관리한다.

 

예를들어 Galaxy 22, Android 12 OS 설치된 단말을 가지고 있다고 생각하자

 

휴대폰은 Android OS 사용하므로 여러 App들로 구성되어 있다. 여기서 key 포인트는 모든 앱들이 각각 다른 패키지 네임을 가지고 있다는 것이다.

구체적으로 설명하면 만약 내가 새로운 app 만들어서 설치를 진행할 내가 지정한 package name 이미 휴대폰에 설치된 app 하나와 패키지 네임이 동일하다면 내가 생성한 app 설치할 없다.

정리하면 안드로이드 단말 자체를 루팅하지 않는이상은 기존에 설치된 패키지를 수정 변경할 없기 때문에 패키지네임으로 장난질 수가 없다.

 

이러한 이유로 protected broadcast 기존 broadcast보다 높은 보안수준을 제공할 있다.

 

 

 

  • ref

https://developer.android.com/guide/components/broadcasts?hl=ko

+ Recent posts