[Android] API 키 숨기기
동아리에서 벡엔드를 직접 구축하며 앱을 개발하고 있다. 앱에서는 벡엔드 팀에게서 전달받은 API 키를 이용한다. 하지만 이 API 키가 온라인에 노출되는 경우 누군가 우리 서버를 작동하지 못하게 엄청난 부하를 거는 등 심각한 문제가 발생할 수 있다. 그렇다면 어떻게 API 키를 노출하지 않고 로컬에서만 이용할 수 있을까? 방법은 다음과 같다.
local.properties 파일 수정
이 파일은 안드로이드 스튜디오에서 자동으로 생성되며 .gitignore에 명시된 파일이다. 이것을 이용할 것이다(따로 apikey.properties와 같이 생성해서 이용해도 상관없다).
해당 파일에 아래와 같이 API 키 값을 추가해주자.
api_key="https://111.123.111/"
build.gradle 수정
local.properties에 명시한 API 키 값을 앱 내에서 이용하기 위해서는 앱 수준의 build.gradle을 수정해야한다. 아래와 같이 수정하면 앱 빌드시 build config에 필드가 추가된다.
def localPropertiesFile = rootProject.file("local.properties")
def localProperties = new Properties()
localProperties.load(new FileInputStream(localPropertiesFile))
android {
    defaultConfig {
        ...
        buildConfigField("String", "API_KEY", localProperties['api_key'])
    }
}
사용법
사용법은 간단하다. 앱을 빌드하면 다음과 같은 클래스가 생성되며 BuildConfig.API_KEY와 같이 이용하면 된다.
public final class BuildConfig {
  ...
  // Field from default config.
  public static final String API_KEY = "https://123.111.123/";
}
const val BASE_URL = BuildConfig.API_KEY
Github Action에서는 어떻게?
만약 CI 시스템으로 Github Actioin을 사용하고 있는 경우 별다른 조치를 하지 않는다면 빌드와 테스트에 실패할 것이다. Action 환경에서는 local.properties가 없기 때문이다.
해결 방법은 다음과 같다.
- Github Repository의 Setting으로 들어가 Secret에 API_KEY를 등록한다.
 - 기존에 사용하던 workflow 파일에 API_KEY에 엑세스하는 작업을 추가해준다. 
echo명령어로 마지막 줄에 텍스트를 추가하고 있다. 
jobs:
  build:
    ...
    steps:
      ...
      - name: Access API_KEY
        env:
          API_KEY: $
        run: echo API_KEY=\"API_KEY\" > ./local.properties
      Do build, testing...
      
댓글남기기