Android에서 API 키 안전하게 관리하기 – Secrets Gradle Plugin 사용법

프로젝트하다가 실수로 API 키를 GitHub에 푸시한 적 있으신가요? 저는 있습니다… Google Maps API 키를 하드코딩해놨다가 커밋하고 나서 식은땀이 났던 기억이 나네요. 오늘은 Google에서 제공하는 Secrets Gradle Plugin으로 API 키를 안전하게 관리하는 방법을 공유해볼게요.

기존에 어떻게 했나?

보통 이런 식으로 했죠:

// ❌ 절대 하면 안 되는 방법
class MapsActivity : AppCompatActivity() {
    private val API_KEY = "AIzaSyD_실제키값_여기에_하드코딩"
}

아니면 조금 나은 방법으로 local.properties에 넣고 BuildConfig에서 읽어오기도 했고요:

// local.properties
MAPS_API_KEY=AIzaSyD_xxx

// build.gradle
def localProperties = new Properties()
localProperties.load(new FileInputStream(rootProject.file("local.properties")))

android {
    defaultConfig {
        buildConfigField "String", "MAPS_API_KEY", "\"${localProperties['MAPS_API_KEY']}\""
    }
}

이것도 나쁘진 않은데, 매번 BuildConfig 필드 추가하고, Properties 읽는 코드 작성하고… 귀찮더라구요.

Secrets Gradle Plugin 설치

Google에서 만든 이 플러그인을 쓰면 훨씬 간단해집니다:

1. 프로젝트 레벨 build.gradle.kts

plugins {
    id("com.google.android.libraries.mapsplatform.secrets-gradle-plugin") version "2.0.1" apply false
}

2. 앱 레벨 build.gradle.kts

plugins {
    id("com.android.application")
    id("org.jetbrains.kotlin.android")
    id("com.google.android.libraries.mapsplatform.secrets-gradle-plugin")
}

android {
    // 기존 설정들...
}

3. local.properties에 키 추가

# local.properties (gitignore에 포함됨)
MAPS_API_KEY=AIzaSyD_실제키값
WEATHER_API_KEY=다른API키값
MY_SECRET_KEY=비밀키값

끝! 이제 코드에서 바로 사용할 수 있어요.

실제 사용법

AndroidManifest.xml에서

<application>
    <meta-data
        android:name="com.google.android.geo.API_KEY"
        android:value="${MAPS_API_KEY}" />
</application>

플러그인이 빌드 시점에 ${MAPS_API_KEY}를 실제 값으로 치환해줍니다.

코드에서 사용하기

// BuildConfig에 자동으로 추가됨
class WeatherRepository {
    private val apiKey = BuildConfig.WEATHER_API_KEY
    
    suspend fun getWeather(city: String) {
        val url = "https://api.weather.com/v1/forecast?city=$city&key=$apiKey"
        // API 호출...
    }
}

더 나은 설정들

1. 기본값 설정

CI/CD나 팀원들이 키 없이도 빌드할 수 있게 기본값을 설정할 수 있어요:

// build.gradle.kts
secrets {
    // 키가 없을 때 기본값 사용
    defaultPropertiesFileName = "secrets.defaults.properties"
    
    // 특정 키만 포함/제외
    ignoreList.add("keyToIgnore")
    ignoreList.add("ignore*")
}

2. 프로덕션/개발 환경 분리

// local.properties
MAPS_API_KEY_DEBUG=디버그용키
MAPS_API_KEY_RELEASE=프로덕션키

// build.gradle.kts
android {
    buildTypes {
        debug {
            manifestPlaceholders["mapsApiKey"] = localProperties['MAPS_API_KEY_DEBUG']
        }
        release {
            manifestPlaceholders["mapsApiKey"] = localProperties['MAPS_API_KEY_RELEASE']
        }
    }
}

실전 팁

1. secrets.defaults.properties 활용

# secrets.defaults.properties (이건 커밋해도 됨)
MAPS_API_KEY=REPLACE_WITH_YOUR_API_KEY
WEATHER_API_KEY=DEMO_KEY_FOR_DEVELOPMENT

이렇게 하면 새로운 팀원이 프로젝트 클론받고 바로 빌드할 수 있어요. 실제 키는 나중에 받아서 local.properties에 넣으면 됩니다.

2. CI/CD에서 사용하기

# GitHub Actions 예시
- name: Create local.properties
  run: |
    echo "MAPS_API_KEY=${{ secrets.MAPS_API_KEY }}" >> local.properties
    echo "WEATHER_API_KEY=${{ secrets.WEATHER_API_KEY }}" >> local.properties

3. ProGuard 설정

# proguard-rules.pro
-keep class com.myapp.BuildConfig { *; }

난독화해도 BuildConfig 필드는 유지되도록 설정해야 합니다.

주의사항

이 플러그인 쓰면서 겪은 이슈들:

  1. Sync 후 BuildConfig 안 보일 때: Clean → Rebuild 한 번 해주면 됩니다.
  2. 키 이름 규칙: 대문자와 언더스코어만 사용하세요. maps-api-key 이런 거 안 됩니다.
  3. 멀티모듈: 각 모듈마다 플러그인 적용해야 해요.

이점 정리

  • 간편함: Properties 파싱 코드 안 써도 됨
  • 안전함: local.properties는 기본적으로 gitignore에 포함
  • 유연함: 환경별로 다른 키 사용 가능
  • 호환성: AndroidManifest와 코드 모두에서 사용 가능

마무리

Secrets Gradle Plugin 쓰고 나서 API 키 관리가 정말 편해졌어요. 특히 팀 프로젝트할 때 “API 키 좀 공유해주세요” 이런 메시지 주고받을 필요 없이, README에 “local.properties에 키 넣으세요”만 써놓으면 끝!

Google Maps 뿐만 아니라 Firebase, 각종 API 키 관리할 때도 유용하니까 꼭 써보세요. 한 번 설정해놓으면 계속 편하게 쓸 수 있습니다.

혹시 다른 좋은 API 키 관리 방법 있으면 공유해주세요!

Leave a Comment