본문 바로가기

Android

[Android] API Key 관리 (key 쉽게 숨기는 방법)

개요

앱에서 서버와 통신을 위해 API를 사용하는데, API Key를 하드코딩하여 사용한다면 버전 관리(Git) 시 Key가 노출될 위험이 있다.

이 문제를 해결하고자 아래에는 API Key를 직접 숨기는 방법플러그인을 사용하여 쉽게 숨기는 방법을 설명하려고 한다.

직접 API Key를 숨기는 방법

1. local.properties 에서 key, value 방식으로 추가하고자 하는 API Key의 이름과 내용을 작성한다.

## This file must *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.
#Wed Dec 23 23:32:09 KST 2020
sdk.dir=/Users/.../Library/Android/sdk

BOOK_API_KEY="889...D2E"

 

2. .gitignore 파일에서 local.properties 추가하여 버전관리 시 포함되지 않게 Git에서 제외한다.

.gradle
.idea
*.iml
build/
.DS_Store
local.properties

 

 

3. build.gradle (app module)에서 local.properties 파일을 읽어와 BuildConfig에 직접 추가한다.

plugins {
    id 'com.android.application'
    id 'kotlin-android'
}

Properties properties = new Properties()
properties.load(project.rootProject.file('local.properties').newDataInputStream())

android {
    compileSdkVersion 30
    defaultConfig {
        applicationId "..."
        minSdkVersion 26
        targetSdkVersion 30
        versionCode 6
        versionName "1.5"
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
        buildConfigField "String", "BOOK_API_KEY", properties['BOOK_API_KEY']
    }
}

 

 

4. 빌드를 하면 BOOK_API_KEY라는 새로운 필드가 추가되었고, 싱글톤으로 API Key가 필요한 곳에서 사용하면 된다.

public final class BuildConfig {
  public static final boolean DEBUG = Boolean.parseBoolean("true");
  public static final String APPLICATION_ID = "...";
  public static final String BUILD_TYPE = "debug";
  public static final int VERSION_CODE = 6;
  public static final String VERSION_NAME = "1.5";
  public static final String BOOK_API_KEY = "889...D2E";
}
@GET("api/search.api")
suspend fun searchBook(
    @Query("key") key: String = BuildConfig.BOOK_API_KEY
    @Query("query") query: String,
    @Query("output") output: String = OUTPUT_TYPE,
    @Query("maxResults") maxResults: Int = MAX_RESULT,
): SearchBookResponse

플러그인을 사용하여 API Key를 쉽게 숨기는 방법

관리해야할 API Key들이 많아진다면 3번 과정에서 하나하나 BuildConfig 에 필드를 추가하는게 번거로울 수도 있다.

번거로움을 줄이고자 오픈소스로 나온 Secrets Gradle Plugin for Android 플러그인을 설치하면 3번 과정을 생략할 수 있다.

방법으로는 위의 1번, 2번 과정을 진행한 뒤

 

build.grdlde(root directory) dependencies에서 secrets-gradle-plugin 추가하고

buildscript {
    ext{
        kotlin_version = '1.5.20'
    }
    repositories {
        google()
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:4.2.2'
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
        classpath "com.google.android.libraries.mapsplatform.secrets-gradle-plugin:secrets-gradle-plugin:1.3.0"
    }
}

 

build.grdlde(app module) plugins에서 secrets-gradle-plugin 추가하면 된다

plugins {
    id 'com.android.application'
    id 'kotlin-android'
    id 'com.google.android.libraries.mapsplatform.secrets-gradle-plugin'
}

마무리

이런 방식으로 API Key들을 관리한다면 API 추가 시 마다 같이 협업하는 사람들과 local.properties 파일을 공유하야 하는 불편함이 있다. 하지만 기존 Key들을 하드코딩하여 관리 및 사용하는 방법보다는 보안상 안전할 것이라 생각한다.

 

이 방법은 버전관리(Git) 시 간단하게 Key들을 숨기는 방법으로 APK를 디컴파일링 하게 되면 API Key들이 노출될 위험이 있기에 보안상 완벽하다고 할 수는 없을 것 같다.


참고