안드로이드 프로젝트를 Github와 같은 코드 호스팅 플랫폼에 공유를 하는 경우는 많다. 이 때 애플리케이션에서 사용하는 각종 키나 정보들이 있을 수 있다. 특히 보안에 민감하여 외부로 노출되어서는 안되는 인증 키의 경우에는 Github에 노출되어서는 안된다.
이 글에서는 각종 키들을 루트 프로젝트 경로에 존재하는 local.properties 파일을 사용하여 외부에 노출시키지 않고 개인이 사용하는 방법에 대해서 정리한다. 만약 local.properties 파일이 git(+ 다른 버전관리툴)에서 관리되는 파일이라면 제거한다. (git은 .gitignore에 등록하는 방법을 사용한다.)
local.properties파일은 안드로이드 스튜디오 툴에서 자동으로 생성해주는 파일이다. 처음 생성되는 아래와 같은 포맷을 포함하여 파일이 생성된다. 이 파일은 로컬환경 관련된 정보가 포함되므로 git(+버전관리툴)에서 관리되지 않도록 해야한다.
## This file is automatically generated by Android Studio.
# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
#
# This file should *NOT* be checked into Version Control Systems,
# as it contains information specific to your local configuration.
#
# Location of the SDK. This is only used by Gradle.
# For customization when using a Version Control System, please read the
# header note.
sdk.dir=The Sdk Directory path
버전관리에 포함되지 않는 local.properties
파일을 이용하면 키가 노출되지 않기에 키 관리에 사용할 수 있다. 그 방법을 정리해본다.
local.properties를 사용하여 키 관리하기
1. local.properties 파일에 키 추가하기.
sdk.dir
아래에 EXAMPLE_API_KEY란 이름으로 키를 추가한다.
sdk.dir=/Your/Android/Sdk/Path
EXAMPLE_API_KEY="this-is-example-key"
2. app/build.gradle에서 local.properties의 값을 가져오기
app 레벨의 bulid.gradle 파일에서 local.properties에 선언된 값을 가져오기 위한 코드를 추가한다. localProperties를 확인하면, 루트프로젝트 경로에 존재하는 local.properties 파일을 파일입력스트림을 사용하여 로드한다. 해당 로드된 값은 키-값 형태로 로드되어 사용되어 진다. 사용되는 정보는 debug 빌드 시 해당 값을 ConfifField로 설정하여 준다.
def localProperties = new Properties()
localProperties.load(new FileInputStream(rootProject.file("local.properties")))
android {
...
buildTypes {
debug {
buildConfigField("String", "EXAMPLE_API_KEY", "" + localProperties['EXAMPLE_API_KEY'] + "")
}
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
...
}
3. 빌드하여 BuildConfig.java 파일에 정상적으로 생성되었는지 확인하기.
위에서 설명한 1, 2번 작업 이후 빌드를 진행하면 BuildConfig.java 파일이 생성되고, 해당 파일내에 선언한 EXAMPLE_API_KEY가 정상적으로 선언되어 있는지 확인할 수 있다.
public final class BuildConfig {
...
// Field from build type: debug
public static final String EXAMPLE_API_KEY = "this-is-example-key";
}
이렇게 키-값이 선언되었다면, 필요한 곳에서 사용할 수 있다. 사용하는 방법은 BuildConfig.EXAMPLE_API_KEY 와 같은 방식으로 접근하여 사용할 수 있다.
Github Action에서는 어떻게 사용해야 하는가?
만약 개발자가 CI/CD를 위해 Github Action을 이용하는 경우에는 빌드 에러가 발생한다. local.properties 파일은 버전관리를 하지 않는 파일로써 해당 파일이 존재하지 않은 상태에서 빌드를 하면 API 키 값의 정의가 되지 않아 문제가 발생한다. 이러한 문제는 Github의 secret을 사용하여 해결한다.
Github Action secret으로 Key값을 등록하자. 해당 값을 등록하면, github action yaml 파일에서 변수로 접근할 수 있다. 여기서는 github action을 사용하는 방법에 대해서는 정리하지 않는다. Secret에 정의한 변수를 접근하는 방법으로 아래와 같은 방법을 사용한다. 이 방법으로 local.properties 파일에 키 값을 작성해주고, 해당 파일을 참조하여 빌드하도록 한다.
- name: Access EXAMPLE_API_KEY
run: |
echo EXAMPLE_API_KEY=\"$API_KEY\" > local.properties
shell: bash
env:
API_KEY: ${{ secrets.EXAMPLE_API_KEY }}
문제해결) 빌드 시 에러 발생 - Debug 빌드 시에만 사용가능.
Github Action에서 gradlew 이용 시 빌드하는 경우, ./gradlew build와 같은 단순한 빌드 방식은 에러가 발생한다. 코드를 자세히 살펴보면, local.properties를 가져오는 정보는 Debug 빌드 시에만 정의하도록 되어있다. Release 시에도 필요하다면 추가적인 작업이 필요하다.
정리
생각보다 보안이 필요한 정보를 저장하는 방법이 다양하지 않다는 것에 조금 놀랐다. 현재 이 글에서는 보안 정보를 다루는 방법을 하나만 정리하였다. 만약 여러명과 작업을 하는 프로젝트의 경우에는 local.properties 파일의 내용을 개인적으로 공유해야 하는데, 이는 매우 비효율적이다.
'Android > Component' 카테고리의 다른 글
[Android] WearOS HealthServicesClient 성능 문제 분석기 (0) | 2022.08.16 |
---|---|
[Android] Google Map Key 관리 (0) | 2022.08.16 |
[Android] 위치(Location) (1) | 2022.07.14 |
[Android Wear] Ambient Mode에서 Display 정보 업데이트하기 (0) | 2022.07.10 |
Application Foreground/Backgroud 상태 확인하기 (0) | 2022.06.13 |