메인 컨텐츠로 가기

developerWorks 이용 약관에 동의하시는 경우 제출을 클릭하십시오. 이용 약관 보기.

developerWorks에 처음 로그인하면 developerWorks프로파일이 생성됩니다.귀하의 프로파일에서 동의하신 내용이 공개되지만 이 사항은 언제든지 변경 가능합니다. 귀하의 성명(숨김으로 체크되어 있어도 표시됩니다)과 디스플레이 이름은 게시한 컨텐츠나 사이트 엑세스시 표시됩니다.

모든 정보가 안전하게 전송되었습니다.

  • 닫기 [x]

처음 developerWorks에 로그인할 때 프로파일이 작성되므로, 이를 위해 디스플레이 이름을 선택해야 합니다. 선택하신 디스플레이 이름은 developerWorks에 게시한 컨텐츠에 표시됩니다.

3글자 이상 31글자 이하의 길이로 사용 가능합니다. dW커뮤니티 내에서는 보안상 이메일주소를 제외한 다른 이름을 지정하셔야 합니다.

developerWorks 이용 약관에 동의하시는 경우 제출을 클릭하십시오. 이용 약관 보기.

모든 정보가 안전하게 전송되었습니다.

  • 닫기 [x]

Android에서의 보안 이해하기

샌드박스, 애플리케이션 서명 및 권한을 통한 애플리케이션 보안 향상

C. Enrique Ortiz, Mobility Technologist and Writer, J2MEDeveloper.com
C. Enrique Ortiz is a software engineer with over 14 years of experience, most recently serving as Director of Mobile Applications at Aligo Inc., VP of Wireless at AGEA Corp., and as software engineer at Pervasive Software, Intelligent Reasoning Systems, and IBM. Enrique is a co-designer of the Mobile Java Developer Certification Exam of Sun Microsystems. He also co-authored of one of the first books on J2ME, the Mobile Information Device Profile for J2ME. Enrique is an active participant in the wireless Java community and in various J2ME expert groups. You can reach him at C. Enrique Ortiz.

요약:  Android 애플리케이션을 개발하는 경우에는 애플리케이션 프로세스 및 샌드박스, 코드 및 데이터 공유, 애플리케이션 서명을 통한 시스템 보호 및 권한 사용을 포함한 다수의 보안 관련 측면을 다루어야 합니다. 샘플 코드에 대해 작업할 때 Android 애플리케이션 개발에서 이러한 보안 측면을 강조하십시오.

원문 게재일:  2010 년 11 월 16 일 번역 게재일:   2011 년 3 월 01 일
난이도:  중급 원문:  보기 PDF:  A4 and Letter (592KB | 23 pages)Get Adobe® Reader®
페이지뷰:  7851 회
의견:  


개요

Android는 애플리케이션 프레임워크, 애플리케이션 라이브러리 및 Dalvik 가상 시스템 기반 런타임으로 구성된다(모두 Linux® 커널 위에서 실행됨). Linux 커널을 활용하여 Android는 네트워크 스택, 드라이버, 하드웨어 추상화 계층, 프로세스 및 메모리의 관리를 포함한 다수의 운영 체제 서비스와 본 기사의 주제와 관련된 보안 서비스를 제공받는다.

자주 사용하는 약어

  • ADT: Android Development Tools
  • API: Application Program Interface
  • IDE: Integrated development environment
  • JDK: Java Development Kit
  • URL: Uniform Resource Identifier
  • XML: Extensible Markup Language
선수조건

본 기사를 진행하려면 다음과 같은 스킬 및 도구가 필요하다.

  • Java™ 기술에 대한 지식과 Eclipse(또는 즐겨 사용하는 IDE) 사용 방법에 대한 지식
  • Java Development Kit(버전 5 또는 6이 필요함)
  • Eclipse(버전 3.4 또는 3.5)
  • Android SDK 및 ADT 플러그인

다운로드 및 설치 정보는 이 기사의 끝에 있는 참고자료 섹션을 참조한다.


샌드박스, 프로세스 및 권한

사용자 ID: Linux 대 Android

Linux에서는 사용자 ID가 지정된 사용자를 식별하지만 Android에서는 사용자 ID가 애플리케이션을 식별한다. 사용자 ID는 애플리케이션이 설치될 때 지정되며 애플리케이션의 수명 동안 디바이스에 남아 있다. 권한은 디바이스 자원에 대한 애플리케이션(사용자가 아님) 액세스의 허용 또는 제한에 관한 것이다.

Android는 샌드박스라는 개념을 통해 애플리케이션 간 분리와 파일 및 디렉토리와 같은 디바이스 자원에 대한 애플리케이션 액세스를 허용 또는 거부하는 권한을 적용한다. 이를 위해 Android는 프로세스 레벨 보안, 사용자 및 애플리케이션과 연관되는 그룹 ID와 같은 Linux 기능과 권한을 사용하여 애플리케이션이 수행할 수 있는 조작을 적용한다.

개념적으로 샌드박스는 그림 1과 같이 표시될 수 있다.


그림 1. 두 개의 Android 애플리케이션(각각 고유의 기본 샌드박스 또는 프로세스에 있음)
다이어그램: 두 개의 Android 애플리케이션(각각 다른 사용자 ID를 가진 고유의 기본 샌드박스 또는 프로세스에 있음)

Android 애플리케이션은 고유 Linux 프로세스에서 실행되며 고유 사용자 ID가 지정된다. 기본적으로 애플리케이션은 권한 지정 없이 기본 샌드박스 프로세스 내부에서 실행되므로 이러한 애플리케이션이 시스템 또는 자원에 액세스하는 것을 방지한다. 하지만 Android 애플리케이션은 애플리케이션의 매니페스트 파일을 통해 권한을 요청할 수 있다.

Android 애플리케이션은 다음을 통해 다른 애플리케이션에게 자원에 대한 액세스를 허용할 수 있다.

  • 적절한 매니페스트 권한 선언
  • 신뢰할 수 있는 기타 애플리케이션을 사용하여 동일한 프로세스에서 실행하여 데이터 및 코드에 대한 액세스 공유

후자가 그림 2에 설명되어 있다.


그림 2. 동일한 프로세스에서 실행 중인 두 개의 Android 애플리케이션
다이어그램: 동일한 디지털 서명 및 Linux 사용자 ID를 사용하여 동일한 프로세스에서 실행 중인 두 개의 Android 애플리케이션

서로 다른 애플리케이션이 동일한 프로세스에서 실행될 수 있다. 이를 위해서는 동일한 개인 키를 사용하여 해당 애플리케이션에 서명한 후 동일한 값/이름을 가진 매니페스트 속성 android:sharedUserId를 정의하여 매니페스트 파일을 사용하는 동일한 Linux 사용자 ID를 이들 애플리케이션에 지정해야 한다.


개발자 유스 케이스

그림 3에서는 Android 애플리케이션 개발 시 찾은 다수의 보안 관련 유스 케이스를 보여 준다.


그림 3. Android 애플리케이션 프로그래밍 시 존재하는 보안 영역
다이어그램: Android 애플리케이션 프로그래밍 시 존재하는 보안 영역
  • 애플리케이션 또는 코드 서명은 개인 키 및 공개 키와 공개 키 인증서를 생성하고 애플리케이션을 서명한 후 최적화하는 프로세스이다.
  • 권한은 제한된 API 및 자원에 대한 애플리케이션 액세스를 허용하거나 제한하는 데 필요한 Android 플랫폼 보안 메커니즘이다. 기본적으로 Android 애플리케이션에는 권한이 부여되지 않기 때문에 디바이스의 보호된 API 또는 자원에 대한 액세스 권한을 얻을 수 없어 안전성이 확보된다. 권한이 요청되고 사용자 정의된 권한이 정의되고 파일 및 컨텐츠 제공자가 보호되어야 한다. 런타임 시 권한을 검사, 적용, 부여 및 취소해야 한다.

다음으로 각각의 보안 영역에 대해 자세히 살펴본다.


애플리케이션 서명

모든 Android 애플리케이션에는 서명이 필요하다. 애플리케이션 또는 코드 서명은 다음을 수행하기 위해 개인 키를 사용하여 지정된 애플리케이션에 디지털 서명을 제공하는 프로세스이다.

  • 코드 작성자 식별
  • 애플리케이션이 변경되었는지 여부 감지
  • 애플리케이션 간 신뢰 구축

이러한 신뢰 관계를 기반으로 애플리케이션은 안전한 방법으로 코드와 데이터를 공유할 수 있다.

동일한 디지털 서명을 사용하여 서명된 애플리케이션은 서로에게 서명 기반 API에 액세스할 수 있는 권한을 부여할 수 있고 사용자 ID를 공유하는 경우 동일한 프로세스에서 실행될 수도 있어 서로의 코드 및 데이터에 대한 액세스를 허용한다.

애플리케이션 서명은 개인 키 및 공개 키 쌍과 관련 공개 키 인증서를 생성하는 것에서부터 시작한다.

Android 애플리케이션에 대해 작업하는 경우에는 디버그릴리스 모드에서 애플리케이션을 빌드할 수 있다.

  • Android 빌드 도구(명령행과 Eclipse ADT)를 사용하여 빌드된 애플리케이션은 디버그 개인 키를 사용하여 자동으로 서명되므로 이러한 애플리케이션을 디버그 모드 애플리케이션이라고 한다. 디버그 모드 애플리케이션은 테스트를 위해 사용되며 배포해서는 안 된다. 서명되지 않은 애플리케이션 또는 디버그 개인 키를 사용하여 서명된 애플리케이션은 Android Market을 통해 배포할 수 없다.
  • 애플리케이션을 릴리스할 준비가 되면 릴리스 모드 버전을 빌드해야 한다(즉, 개인 키를 사용하여 애플리케이션을 서명함).

Android에서의 코드 서명은 다른 모바일 플랫폼보다 훨씬 단순하게 수행된다. Android에서 인증서는 자체 서명될 수 있어 인증 기관이 필요없다. 이로 인해 프로세스 및 관련 비용 공개가 단순해진다.

다음으로 명령행에서 수동으로 또는 Eclipse ADT를 사용하여 Android 애플리케이션을 서명하는 방법에 대해 다룬다. 이 기사에서는 세 번째 방법인 Ant 사용에 대해서는 다루지 않는다.

수동으로 개인 키 및 공개 키와 공개 키 인증서 작성하기

디버그 모드 애플리케이션은 디버그 키/인증서를 사용하여 빌드 도구를 통해 자동으로 서명된다는 것을 떠올려 본다. 릴리스 모드 애플리케이션을 서명하려면 먼저 개인 키 및 공개 키 쌍과 공개 키 인증서를 생성해야 한다. 수동으로 또는 Eclipse ADT를 사용하여 애플리케이션을 서명할 수 있다. 두 접근방식 모두 JDK(Java Developer Kit) keytool 키와 인증서 관리 유틸리티를 사용한다.

개인 키 및 공개 키 정보를 수동으로 생성하려면 목록 1과 같이 명령행에서 keytool을 사용한다.


목록 1. keytool을 사용하여 개인 키/공개 키와 인증서 생성하기

keytool -genkey -v -alias <alias_name> -keystore <keystore.name> 
-keyalg RSA -keysize 2048 -validity <number of days>

참고: 목록 1에서는 JDK가 컴퓨터에 설치되어 있고 JAVA_HOME 경로가 JDK 디렉토리를 가리키도록 적절하게 정의되어 있다고 가정한다(다운로드 및 설치 정보는 참고자료 참조).

목록 1에서 -genkey는 공개 키 및 개인 키 쌍 항목은 물론이고 생성된 공개 키를 포함하는 X.509 v1 자체 서명된 단일 요소 인증서 체인도 표시한다. -v는 상세 모드를 표시한다. -alias는 생성된 개인 키와 인증서를 저장하는 키 저장소 항목에 사용할 별명이다. -keystore는 사용할 키 저장소의 이름을 표시한다. -keyalg는 키 쌍을 생성하기 위해 사용할 알고리즘이다. -keysize는 생성할 키의 크기이다(기본값은 1024이지만 2048이 권장됨). -validity는 유효 기간(일)이며 1000보다 큰 값이 권장된다.

참고: 키를 생성한 후에는 개인 키를 안전하게 보호하는 것이 매우 중요하다. 개인 키를 공유하지 않고 명령행 또는 스크립트에서 개인 키를 지정하지 않는다. 비밀번호 입력을 위해 keytool 및 jarsigner가 프롬프트되는 것에 유의한다. 이에 대한 내용과 기타 팁에 대한 내용은 Android Developers 웹 사이트에서 "Securing Your Private Key"를 참조한다(링크는 참고자료 참조).

Keytool은 X.500 식별 이름이 생성되는 국가, 주, 도시, 조직 및 이름(성 포함)(자세한 정보는 참고자료 참조) 입력을 위해 프롬프트된 후 개인 키와 키 저장소 자체를 보호하기 위한 비밀번호 입력을 위한 프롬프트를 표시한다.

유효 기간에 대해서는 애플리케이션 및 관련 애플리케이션의 예상 수명을 초과하는 기간을 사용해야 한다. 애플리케이션을 Android Market에 공개하는 경우에는 유효 기간이 2033년 10월 22일 이후에 끝나야 한다. 그렇지 않으면 해당 애플리케이션을 업로드할 수 없다. 또한 유효 기간이 긴 인증서를 사용하면 애플리케이션 업그레이드 시 작업이 수월해진다. 다행히 Android Market은 이러한 상황을 예방할 수 있도록 유효 기간이 긴 인증서를 적용한다.

수동으로 애플리케이션 서명하기

다음으로 JDK의 일부인 jarsigner 도구를 사용하여 서명되지 않은 애플리케이션을 서명한다.

jarsigner -verbose -keystore <keystore.name> <my_application.apk> <alias_name>

이 코드에서 -verbose는 상세 모드를 표시하고 -keystore는 사용할 키 저장소의 이름을 표시한다. 그 다음은 애플리케이션의 이름(.apk)이고 마지막은 개인 키에 사용할 별명이다.

Jarsigner는 키 저장소 및 개인 키를 사용하기 위해 필요한 비밀번호 입력을 위한 프롬프트를 표시한다.

애플리케이션은 여러 키를 사용하여 여러 번 서명될 수 있으며 동일한 개인 키를 사용하여 서명된 애플리케이션은 서로 신뢰 관계를 구축할 수 있고 동일한 프로세스에서 실행되고 코드 및 데이터를 공유할 수 있다.

수동으로 애플리케이션 최적화하기

서명 프로세스의 마지막 단계는 애플리케이션을 최적화하여 파일의 시작과 관련하여 데이터 경계가 메모리에 맞춰지도록 한다(이를 통해 런타임 성능 및 메모리 활용도가 향상됨). 애플리케이션을 정렬하려면 zipalign을 사용한다.

zipalign -v 4 your_project_name-unaligned.apk your_project_name.apk

이 코드에서 -v는 상세 출력을 표시한다. 숫자 4는 4바이트 정렬을 사용하는 것을 표시한다(항상 4바이트를 사용함). 다음 인수는 개인 키를 사용하여 서명되어야 하는 입력 서명 애플리케이션의 파일 이름(.apk)이고 마지막 인수는 출력 파일 이름이다. 기존 애플리케이션을 대체하는 경우에는 -f를 추가한다.

애플리케이션이 서명되었는지 수동으로 확인하기

애플리케이션이 서명되었는지 확인하려면 Jarsigner를 사용하며 이번에는 -verify 플래그를 전달한다.

jarsigner -verify -verbose -certs my_application.apk

이 코드에서 -verify는 애플리케이션을 확인하고 -verbose는 상세 모드를 표시하고 -certs는 키를 작성한 사용자의 CN 필드를 표시하며 마지막 인수는 확인할 Android 애플리케이션 패키지의 이름이다.

참고: CN이 "Android Debug"인 경우 이는 애플리케이션이 디버그 키를 사용하여 서명되었기 때문에 공개될 수 없다는 것을 나타내므로 Android Market에 애플리케이션을 공개하려는 경우에는 개인 키를 사용해야 한다.

여기서는 수동으로 개인 키 및 공개 키를 작성하고 애플리케이션을 서명하고 최적화하는 방법에 대해 살펴봤다. 다음에는 Eclipse ADT를 사용하여 자동으로 개인 키 및 공개 키를 작성하고 애플리케이션을 서명하고 최적화하는 방법에 대해 살펴본다.


Eclipse ADT를 사용하여 키 및 인증서를 작성하고 애플리케이션을 서명하고 최적화하기

Eclipse ADT를 사용하여 키를 생성하려면 애플리케이션을 내보내야 한다. 두 가지 방법으로 애플리케이션을 Eclipse에서 내보낼 수 있다.

  • 수동으로 서명해야 하는 애플리케이션의 서명되지 않은 버전 내보내기
  • 애플리케이션의 서명된 버전 내보내기(ADT가 모든 단계를 수행함)

서명되지 않은 애플리케이션 내보내기

수동으로 서명해야 하는 애플리케이션의 서명되지 않은 버전을 내보낼 수 있다. 즉, 수동으로 keytool을 실행하여 이전에 설명한 대로 키를 생성하고 Jarsigner를 실행하여 애플리케이션을 서명해야 하며 앞서 설명한 대로 zipalign 도구를 사용하여 애플리케이션을 최적화해야 한다.

ADT를 사용하여 애플리케이션의 서명되지 않은 버전을 내보내려면 프로젝트를 마우스 오른쪽 단추로 클릭한 후 Android Tools>Export Unsigned Application Package를 선택한다(그림 4 참조).


그림 4. 서명되지 않은 애플리케이션 내보내기
서명되지 않은 애플리케이션 내보내기의 화면 캡처

ADT는 선택되고 나면 서명되지 않은 애플리케이션을 내보낼 디렉토리를 입력하라는 프롬프트를 표시한다. 애플리케이션을 내보내고 나면 앞서 설명한 대로 애플리케이션을 수동으로 서명하고 최적화해야 한다.

서명된 애플리케이션 내보내기

Eclipse ADT를 사용하면 애플리케이션의 서명된 버전을 내보낼 수 있다. 이 방법을 사용하면 ADT가 다음을 입력하라는 프롬프트를 표시한다.

  • 기존 KeyStore를 사용하거나 새로운 보호된 KeyStore를 작성하기 위해 필요한 정보
  • 보호된 개인 키를 작성하기 위해 필요한 정보
  • 공개 키 인증서를 생성하기 위해 필요한 정보

서명된 애플리케이션을 내보내려면 프로젝트를 마우스 오른쪽 단추로 클릭한 후 이번에는 그림 5와 같이 Android Tools->Export Signed Application Package 메뉴 항목을 선택한다.


그림 5. 서명된 애플리케이션 내보내기
서명된 애플리케이션 내보내기의 화면 캡처

이 지점에서 그림 6과 같이 내보내기 마법사가 실행된다.


그림 6. 내보내기 마법사
내보내기 마법사의 화면 캡처

그림 7에서 기존 키 저장소를 선택하거나 새로운 키 저장소와 사용할 신임 정보를 작성한다.


그림 7. 내보내기 마법사: 키 저장소 선택
내보내기 마법사: 키 저장소 선택의 화면 캡처

그림 8에서 개인 키와 디지털 인증서를 작성하기 위해 필요한 정보를 입력한다.


그림 8. 내보내기 마법사: 개인 키 및 디지털 인증서 작성하기
내보내기 마법사: 내보낼 프로젝트 선택하기의 화면 캡처

그림 9에서 대상 파일의 경로 및 이름을 입력하고 유효 기간을 확인한다.


그림 9. 대상 파일의 경로 및 이름 입력하기
대상 파일의 경로 및 이름 입력하기의 화면 캡처

완료되면 공개할 수 있는 릴리스 모드의 서명되고 최적화된 애플리케이션을 가지게 된다.

또는 그림 10과 같이 Android Manifest 도구를 사용하여 내보내기 마법사를 호출할 수도 있다.


그림 10. Android Manifest 도구를 사용하여 내보내기 마법사 호출하기
Android Manifest 도구를 사용하여 내보내기 마법사 호출하기의 화면 캡처

애플리케이션이 서명되고 나면 다음 단계는 애플리케이션에 필요한 권한을 매니페스트에 정의하는 것이다. 이 프로세스가 다음에 설명된다.

Android 개발자 웹 사이트에는 Android 플랫폼의 새로운 릴리스를 사용할 수 있게 될 때 항상 최신 상태를 유지하는 애플리케이션 서명에 관한 매우 적절한 문서가 들어 있다(자세한 정보는 참고자료 참조).


권한 사용하기

권한은 제한된 API 및 자원에 대한 애플리케이션 액세스를 허용하거나 제한하는 데 필요한 Android 플랫폼 보안 메커니즘이다. 기본적으로 Android 애플리케이션에는 권한이 부여되지 않기 때문에 디바이스의 보호된 API 또는 자원에 대한 액세스 권한을 얻을 수 없어 안전성이 확보된다. 권한은 매니페스트 파일을 통해 애플리케이션에 의해 요청되고 설치 중에 사용자에 의해 부여되거나 부여되지 않는다.

Android는 긴 매니페스트 권한 목록을 정의하여 시스템 또는 기타 애플리케이션의 다양한 측면을 보호한다. 권한을 요청하려면 매니페스트 파일에서 <user-permission> 속성을 선언한다.

<uses-permission android:name="string" />

여기서 android:name은 권한의 이름을 지정한다.

모든 Android 정의 매니페스트 권한의 목록을 확인하려면 Manifest.permisson 페이지를 참조한다. 목록 2는 인터넷 사용 권한 및 외부 스토리지에 대한 쓰기 권한을 요청하는 매니페스트 파일의 예이다.


목록 2. 권한 선언(요청)하기

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      android:versionCode="1"
      android:versionName="1.0"
      package="com.cenriqueortiz.tutorials.datastore" 
      android:installLocation="auto">

    <application 
        :
        :
        :
    </application>

    <uses-permission 
        android:name="android.permission.INTERNET"/>
    <uses-permission 
        android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
</manifest>

애플리케이션은 고유의 사용자 정의 권한을 정의하여 애플리케이션 자원을 보호할 수 있다. 애플리케이션의 보호된 자원에 액세스하려는 다른 애플리케이션은 고유 매니패스트 파일을 통해 적절한 권한을 요청해야 한다. 목록 3에서는 권한 정의 방법의 예제를 보여 준다.


목록 3. 사용자 정의 권한 선언하기

<permission
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:name="com.cenriqueortiz.android.ACCESS_FRIENDS_LIST"
        android:description="@string/permission_description"
        android:label="@string/permission_label"
        android:protectionLevel="normal"
    >
</permission>

목록 3에서 고객 권한은 최소 속성인 name, description, labelprotectionLevel을 지정하여 정의된다. 기타 속성도 정의할 수 있지만 여기서는 다루지 않는다.

특히 관심 가는 부분은 요청하는 애플리케이션에 지정된 권한을 부여하거나 부여하지 않을 때 시스템이 따라야 하는 메소드를 표시하는 android:protectionLevel 속성이다. 보호 레벨에는 자동으로 권한을 부여(사용자는 설치 전에 언제나 검토할 수 있음)하여 서명을 기반으로 권한을 부여하는(즉, 요청하는 애플리케이션이 동일한 인증서를 사용하여 서명되는 경우) 정상과 권한이 개인용 데이터에 대한 액세스를 제공하거나 잠재적으로 부정적인 또다른 영향을 가진다는 것을 나타내는 위험이 포함된다. <permission> 매니페스트 속성에 대한 자세한 정보는 <permission> 페이지를 참조한다(참고자료 참조).

애플리케이션은 애플리케이션과 애플리케이션이 사용하는 시스템 컴포넌트(예: 활동, 서비스, 컨텐츠 공급자 및 브로드캐스트 수신기)에 대한 액세스를 제한할 수 있다. 이러한 제한은 목록 4와 같이 android:permission 속성을 정의하여 쉽게 수행된다. 이러한 보호 수준을 사용하면 애플리케이션이 시스템 자원에 대한 다른 애플리케이션의 액세스를 허용하거나 제한할 수 있다.


목록 4. 활동에 대한 권한 정의하기

<activity 
    android:name=".FriendsListActivity" 
    android:label="Friends List">
    android:permission="com.cenriqueortiz.android.ACCESS_FRIENDS_LIST"
    <intent-filter>
        :
        :
    </intent-filter>        
</activity>  


컨텐츠 공급자와 파일 권한

컨텐츠 공급자는 데이터를 고유하게 식별하는 공용 URI를 노출한다(참고자료 참조). 이러한 컨텐츠 공급자를 보호가기 위해 호출자는 시작하거나 활동의 결과를 리턴할 때 Intent.FLAG_GRANT_READ_URI_PERMISSIONIntent.FLAG_GRANT_WRITE_URI_PERMISSION을 설정하여 수신하는 활동에 의도하는 특정 데이터 URI에 액세스할 수 있는 권한을 부여할 수 있다.

애플리케이션 파일은 기본적으로 보호된다. 파일은 사용자 ID를 기반으로 보호되기 때문에 동일한 사용자 ID를 가진 소유자 애플리케이션에만 액세스할 수 있다. 앞서 언급했듯이 동일한 사용자 ID를 공유하고 동일한 디지털 인증서를 사용하여 서명되는 애플리케이션은 동일한 프로세스에서 실행되기 때문에 애플리케이션에 대한 액세스를 공유한다.

애플리케이션은 다른 애플리케이션 또는 프로세스에 대한 파일의 액세스를 허용할 수 있다. 이러한 허용은 적절한 MODE_WORLD_READABLEMODE_WORLD_WRITEABLE 작동 모드를 표시하여 파일에 대한 읽기 또는 쓰기 액세스를 허용하거나 MODE_PRIVATE을 표시하여 개인용 모드에서 파일을 열어 수행된다. 파일을 작성하거나 열 때 다음 메소드를 사용하여 작동 모드를 지정할 수 있다.

  • getSharedPreferences(filename, operatingMode)
  • openFileOutput(filename, operatingMode)
  • openOrCreateDatabase(filename, operatingMode, SQLiteDatabase.CursorFactory)

런타임 Permission API

Android는 런타임 시 권한을 검사, 적용, 부여 및 취소하는 데 필요한 API를 제공한다. 이러한 API는 애플리케이션 환경에 대한 글로벌 정보를 제공하는 android.content.Context 클래스의 일부이다. 예를 들어, 권한을 단계적으로 처리하려는 경우 애플리케이션에 인터넷에 대한 액세스 권한이 부여되었는지 판별할 수 있다(목록 5 참조).


목록 5. 런타임 Permission API를 사용하여 런타임 시 권한 검사하기

if (context.checkCallingOrSelfPermission(Manifest.permission.INTERNET)
        != PackageManager.PERMISSION_GRANTED) {
            // The Application requires permission to access the  
            // Internet");
} else {
    // OK to access the Internet
}

런타임 시 권한을 검사, 적용, 부여 및 취소하는 데 필요한 기타 권한 API를 확인하려면 컨텍스트 클래스를 참조한다.


결론

이 기사에서는 샌드박스, 애플리케이션 서명, 애플리케이션 권한, 파일 및 컨텐츠 공급자 권한을 포함한 Android 플랫폼의 보안에 대해 소개했다. 이러한 소개 이후 사용자는 수동으로 또는 Eclipse를 사용하여 디지털 인증서를 작성하고 애플리케이션 권한을 요청하고 애플리케이션의 파일 및 컨텐츠 공급자에 대한 액세스를 허용 또는 불허할 수 있다. 또한 런타임 시 권한을 검사, 적용, 부여 및 취소할 수 있는 권한 런타임 API에 대해서도 간단하게 살펴봤다.


참고자료

교육

  • Android란?: Android Developers 웹 사이트에서 제공하는 개요를 읽어보자.

  • Develop Android applications with Eclipse(Frank Ableson,developerWorks, 2008년 2월): 이 튜토리얼에서 Android 애플리케이션을 개발하는 가장 쉬운 방법이 Eclipse라는 것에 대해 자세히 살펴보자.

  • Android 개발 소개(Frank Ableson, developerWorks, 2009년 5월): Android 플랫폼에 대한 소개 기사를 읽고 기본적인 Android 애플리케이션을 코딩하는 방법을 배울 수 있다.

  • X.509 Certificates: 인증서에 포함될 수 있는 정보를 정의하고 이러한 정보를 작성하는 방법(데이터 형식)에 대해 설명하는 X.509 표준을 읽어보자.

  • Extended Permissions: 애플리케이션이 개인용일 수 있는 사용자 프로파일의 다른 부분에 액세스해야 하거나 사용자를 위해 컨텐츠를 Facebook에 공개해야 하는 경우 애플리케이션에 대한 확장 권한을 요청해 보자.

  • Securing Your Private Key: Android Developers 웹 사이트에서 개인 키의 보안을 유지하는 방법에 대해 살펴보자.

  • Signing Your Applications: Android Developers 웹 사이트로부터 모바일 디바이스 사용자를 위해 Android 애플리케이션을 공개하기 전에 Android 애플리케이션에 서명하는 것에 대해 읽어보자.

  • Manifest.permission 페이지: 모든 Android 정의 매니페스트 권한의 목록을 확인하려면 Android Developers 웹 사이트를 방문해 보자.

  • Content Providers: 데이터를 저장하고 검색하는 방법과 데이터가 모든 애플리케이션에 액세스 가능하게 만드는 방법에 대해 살펴보자.

  • Context 클래스: Android Developers 웹 사이트에 설명된 글로벌 정보에 대한 이 인터페이스를 사용하여 애플리케이션 특정 자원 및 클래스에 대한 액세스를 허용해 보자.

  • Networking with Android(Frank Ableson, developerWorks, 2009년 6월): Android의 네트워크 기능을 살펴보자.

  • Working with XML on Android(Michael Galpin, developerWorks, 2009년 6월): Android에서 XML을 처리하는 다양한 옵션과 이러한 옵션을 사용하여 자신만의 Android 애플리케이션을 빌드하는 방법을 배운다.

  • Under the Hood of Native Web Apps for Android: 하이브리드 Android 애플리케이션에 관해 배워보자.

  • Unlocking Android(Frank Ableson, Manning Publications, 2010년): 이 책에서 Android 개발의 모든 측면을 살펴보자.

  • Mobile Design and Development(Brian Fling, O'Reilly Media, 2009년): 이 책에서 모바일 제품을 빌드하는 데 필요한 실용적 지침, 표준, 기술 및 우수 사례를 읽어보자.

  • Data Storage 개발자 안내서: Android 개발자 공식 웹 사이트에 언급된 대로 지속적 애플리케이션 데이터를 저장하는 데 필요한 올바른 솔루션을 선택해 보자.

  • Intent: Android 개발자 사이트에서 수행될 조작에 관한 추상적인 설명에 대해 살펴보자.

  • Android SDK 문서: Android API 참조에서 최신 정보를 얻자.

  • Open Handset Alliance: Android를 후원하는 OHA(Open Handset Alliance)를 방문해보자.

  • developerWorks의 XML 영역: XML 영역에서 기술 향상에 도움이 되는 참고자료를 얻을 수 있다.

  • My developerWorks: developerWorks와 관련된 경험을 개인화할 수 있다.

  • IBM XML 인증: XML 및 관련 기술에 대한 IBM 인증 개발자가 되는 방법을 찾아볼 수 있다.

  • XML 기술 자료: developerWorks XML 영역에서 다양한 기술 관련 기사와 팁, 튜토리얼, 표준 및 IBM Redbook을 볼 수 있다. 또한 더 많은 XML 팁을 읽어본다.

  • developerWorks 기술 행사 및 웹 캐스트: 이러한 세션에 참가하여 최신 기술에 대한 정보를 얻을 수 있다.

  • Twitter의 developerWorks 페이지: 오늘 가입하여 developerWorks 트윗을 팔로우하자.

  • developerWorks podcasts: 소프트웨어 개발자의 흥미로운 인터뷰와 토론을 확인할 수 있다.

  • developerWorks on-demand demos: 입문자를 위한 제품 설치 및 설정 과정에서 숙련된 개발자를 위한 고급 기능의 활용에 이르기까지 다양한 데모를 제공한다.

제품 및 기술 얻기

  • <permission> 페이지: <permission> 매니페스트 페이지에 대한 자세한 정보를 찾아보자.

  • keytool: 이 키 및 인증서 관리 도구를 사용해 보자.

  • jarsigner: 이 JAR 서명 및 검증 도구를 사용하여 JAR(Java ARchive) 파일에 대한 서명을 생성하고 서명된 JAR 파일의 서명을 검증해 보자.

  • Android SDK: 공식 Android 개발자 사이트에서 SDK를 다운로드하고 API 참조에 액세스하고 Android 관련 최신 뉴스를 확인해 보자. 1.5 이상의 버전을 사용할 수 있다.

  • Android Open Source Project: Android 호환 디바이스를 빌드하기 위해 필요한 오픈 소스 정보 및 소스 코드를 찾아보자.

  • JDK 6 Update 21: Java Platform, Standard Edition을 얻을 수 있다.

  • Eclipse: 최신 Eclipse IDE를 얻을 수 있다.

  • IBM 제품 평가판: IBM SQA Sandbox의 온라인 시험판을 다운로드하거나 살펴보고 DB2®, Lotus®, Rational®, Tivoli® 및 WebSphere®의 애플리케이션 개발 도구 및 미들웨어 제품을 사용해 볼 수 있다.

토론

필자소개

C. Enrique Ortiz is a software engineer with over 14 years of experience, most recently serving as Director of Mobile Applications at Aligo Inc., VP of Wireless at AGEA Corp., and as software engineer at Pervasive Software, Intelligent Reasoning Systems, and IBM. Enrique is a co-designer of the Mobile Java Developer Certification Exam of Sun Microsystems. He also co-authored of one of the first books on J2ME, the Mobile Information Device Profile for J2ME. Enrique is an active participant in the wireless Java community and in various J2ME expert groups. You can reach him at C. Enrique Ortiz.

잘못된 도움말 신고

부정사용 신고

감사합니다. 이 항목은 운영자가 관심을 표시했습니다.


잘못된 도움말 신고

부정사용 신고

제출실패 신고. 나중에 다시 실행해주세요.


디벨로퍼웍스 로그인


IBM ID가 필요하세요?
IBM ID를 잊으셨습니까?


비밀번호를 잊으셨습니까?
비밀번호 변경

developerWorks 이용 약관에 동의하시는 경우 제출을 클릭하십시오. 이용 약관.

 


developerWorks에 처음 로그인하면 developerWorks프로파일이 생성됩니다.귀하의 프로파일에서 동의하신 내용이 공개되지만 이 사항은 언제든지 변경 가능합니다. 귀하의 성명(숨김으로 체크되어 있어도 표시됩니다)과 디스플레이 이름은 게시한 컨텐츠나 사이트 엑세스시 표시됩니다.

화면상에 보여지는 닉네임을 정하세요.

처음 developerWorks에 로그인할 때 프로파일이 작성되므로, 이를 위해 디스플레이 이름을 선택해야 합니다. 선택하신 디스플레이 이름은 developerWorks에 게시한 컨텐츠에 표시됩니다.

3글자 이상 31글자 이하의 길이로 사용 가능합니다. dW커뮤니티 내에서는 보안상 이메일주소를 제외한 다른 이름을 지정하셔야 합니다.

3개의 &이나 대쉬를 포함해주시고 31글자내로 제한해주세요.


developerWorks 이용 약관에 동의하시는 경우 제출을 클릭하십시오. 이용 약관.

 


아티클 순위

의견

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=20
Zone=XML, 오픈 소스
ArticleID=629580
ArticleTitle=Android에서의 보안 이해하기
publish-date=11162010
author1-email=eortiz@j2medeveloper.com
author1-email-cc=

태그

Help
검색 필드를 사용하여 My developerWorks 내에서 해당 태그가 사용된 모든 종류의 컨텐츠를 검색하십시오.

태그를 더 많이 보거나 적게 보기 위해 슬라이더 막대를 사용하십시오.

인기 태그는 특정 컨텐츠 존(예를 들어, 자바, 리눅스, WebSphere)의 최고 인기 태그를 보여줍니다.

내 태그는 특정 컨텐츠 존(예를 들어, 자바, 리눅스, WebSphere)의 귀하의 태그를 보여줍니다.

검색 필드를 사용하여 My developerWorks 내에서 해당 태그가 사용된 모든 종류의 컨텐츠를 검색하십시오. 인기 태그는 특정 컨텐츠 존(예를 들어, 자바, 리눅스, WebSphere)의 최고 인기 태그를 보여줍니다. 내 태그는 특정 컨텐츠 존(예를 들어, 자바, 리눅스, WebSphere)의 귀하의 태그를 보여줍니다.