[Android] API 키 숨기기

1 분 소요

동아리에서 벡엔드를 직접 구축하며 앱을 개발하고 있다. 앱에서는 벡엔드 팀에게서 전달받은 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...

참조

댓글남기기