아리의 iOS 탐구생활

[iOS] Github에서 API KEY를 숨기기 위한 여러가지 방법들 본문

Swift/iOS

[iOS] Github에서 API KEY를 숨기기 위한 여러가지 방법들

Ari Lee 2023. 1. 31. 13:59
반응형

 

다들 API KEY 관리를 어떻게 하시나요?
개발자마다 각각 방식이 다 다른 것 같아요.
이 글에서는 제가 협업하면서, 개인 프로젝트를 진행하면서
알게 된 관리 방법들을 적어보았습니다.
혹시 또 다른 방법이 있다면 공유해주세요. 😊🙏🏻

 

 

 

 

 

왜 API KEY를 숨겨야 할까?

 

API Key를 숨기지 않고 깃허브에 그대로 올리면 다른 사람들도 API key를 볼 수 있어서 되돌릴 수 없는 일들이 벌어질 수도 있다.

AWS 해킹당한 경험담 실제로 Github에 API KEY를 숨기지 않고 올려서 150만 원 정도 청구된 사례가 있다.

 

따라서 아무나 API 요청을 하지 못하도록,

API KEY를 Github 레파지토리에 실수로라도 올리지 않도록

비밀스럽게 관리해주는 것이 중요하다.

 

 

 

 

 

 

static 변수 활용하기

아래와 같은 방법으로 static 변수를 두어 전역적으로 사용할 수 있게끔 구성하는 방법이다.

import Foundation

struct APIKey {
    static let weatherApiKey = "asdf"
    static let kakaoApiKey = "asdf"
}

// 혹은...

enum Secrets {
    static let apiKey = "asdf"
}

가장 쉽게 감출 수 있지만 개인적으로 선호하지 않는 방법 중 하나이다.

왜냐하면 remote에 코드를 올릴 때 key를 수동으로 지우고 올려야 하기 때문이다.

간혹 key를 지우지 않고 커밋을 하게 된다면 remote에 API KEY가 실수로 올라가는 상황이 발생하기도 한다. 🥲

 

 

 

 

 

.gitignore와 .plist 활용

.gitignore에 아래와 같이 숨길 .plist 파일을 추가한다.
# .gitignore 중...
Secrets.plist

 

 

그리고 .plist 내부에서 API KEY를 관리하는 방식이다.

 

 

코드상에서는 이런 식으로 Bundle을 확장하여 apiKey라는 변수를 구현해두고 사용한다.
extension Bundle {
    
    var apiKey: String? {
        guard let file = self.path(forResource: "Secrets", ofType: "plist"),
              let resource = NSDictionary(contentsOfFile: file),
              let key = resource["API_KEY"] as? String else {
            os_log(.error, log: .default, "⛔️ API KEY를 가져오는데 실패하였습니다.")
            return nil
        }
        return key
    }
    
}

// Bundle.main.apiKey 이런식으로 호출해서...

 

하지만 이 방법도 실수로 Xcode project.pbxproj 내부 경로에

Secrets.plist라는 경로를 별도로 제외시킬 수 없어서, 커밋때 항상 Secrets.plist 파일 경로를 따로 제외한 후

신경써서 커밋을 해야한다는 단점이 있었다.

 

물론 경로가 추가된다고 해서 remote에 실제 API KEY가 올라가는 것은 아니니 경로에 추가되든 말든 신경쓰지 않아도 무방하다.

(근데... 개인적으로 디렉토리에 빨간 글씨가..... 신경쓰여서.....)

 

그리고 간혹 info.plist에 API KEY를 설정해야하는 경우도 있는데

그럴 때는 이 방법이 통하지 않는다.

 

그럼 이런 경우에는 어떻게 하면 좋을까?

 

 

 

 

 

.xcconfig 활용하기

 

.xcconfig 파일을 생성한다.

 

생성한 .xcconfig 파일 안에 아래와 같이 환경변수를 정의해준다.
//
//  Secrets.xcconfig
//  My App
//
//  Created by Ari on 2023/01/31.
//

// Configuration settings file format documentation can be found at:
// https://help.apple.com/xcode/#/dev745c5c974

KAKAO_APP_KEY = 123
FACEBOOK_APP_ID = 1234
FACEBOOK_CLIENT_TOKEN = 12345

 

그리고 프로젝트에 configurations를 위에서 만들었던 .xcconfig 파일로 설정해준다.

 

info.plist에서는 아래와 같이 환경변수를 활용하여 api key를 설정한다.

 

마지막으로 .gitignore에 해당 .xcconfig 파일을 추가해주면 된다.
# .gitignore 내부...
*.xcconfig

 

 

나는 사용해본 방법 중 이 방법이 제일 좋았다. 

이것도 물론 커밋할 때마다 Xcode project.pbxproj 파일 내 경로가 추가되지 않도록 신경써서 커밋 해줘야 한다는 건 마찬가지다.

하지만 간혹 Facebook 같이 info.plist에 API 관련된 값들을 설정해주어야 하는 경우가 있는데,

이런 경우에도 remote에 올라가지 않도록 완벽하게 관리가 가능하다.

 

또 새롭게 알게되는 방법들이 있다면, 기록해둬야지!

 

 

 

 

 

 

 

 

 

 

 

 

제 글에 틀린 내용이 있거나 혹은 도움이 되셨다면,  공감💛 ㆍ 구독✅ ㆍ 공유🔗 ㆍ 댓글✍🏻  부탁드립니다. 🙏🏻
반응형
Comments