plist를 활용한 API Key 보호에 관한 글을 기반으로 작성된 글입니다.
개인 프로젝트를 진행할 때, 보통 기록을 위해 github을 활용하는 경우가 많은데, GitGuardian에게 보안 관련 이메일을 받은 경우가 많습니다. 있습니다.
이런 경우 보통 repository를 private으로 돌리는 주먹구구식으로 대응했지만, 효과적으로 민감정보를 가리는 방법을 알아보았기 때문에 글로 작성해보겠습니다.
Info.plist
는 xcode 프로젝트를 생성하면 생성되는 구조화된 텍스트 파일로, 해당 프로젝트의 실행 패키지에 대한 필수 설정 정보가 포함되어있습니다. Key-Value 형태로 구성되어있으며, 필요에 따라 추가할 수 있습니다. API Key를 사용하기 위해 key에 API_KEY
, value에 해당 키 값을 입력합니다.
연산 프로퍼티
란, 다른 저장 프로퍼티의 연산을 통해서 실행된 연산의 값을 저장하는 프로퍼티입니다. 저장되어있는 Info.plist의 filepath에서 Key를 API_KEY
로 갖고있는 딕셔너리의 value를 apikey라는 연산 프로퍼티에 지정해주기만 하면, 기존의 String 변수에 API key를 그대로 사용하는 것과 같은 형태로 사용할 수 있습니다.
// Use Plist for get API_KEY
private var apiKey: String {
get {
// 1
guard let filePath = Bundle.main.path(forResource: "Info", ofType: "plist") else {
fatalError("Couldn't find file 'Info.plist'.")
}
// 2
let plist = NSDictionary(contentsOfFile: filePath)
guard let value = plist?.object(forKey: "API_KEY") as? String else {
fatalError("Couldn't find key 'API_KEY' in 'Info.plist'.")
}
return value
}
}
.gitignore
파일은 현재 연결된 repository의 가장 상위 폴더에 생성될 시 해당 파일 안에 들어있는 파일 및 디렉토리에 대한 추적(commit, push)를 진행하지 않도록 하는 파일입니다. API key의 github 업로드를 방지하기 위해서 Info.plist를 활용했기 때문에, API key는 Info.plist에 존재하고, 그에 따라 당연히 Info.plist가 repository에 올라가지 않도록 처리를 해주어야 하기 때문에 .gitignore에 Info.plist를 추가해줍니다.
하지만 이 과정을 프로젝트의 처음 시작이 아니고, 저의 경우와 같이 이미 GitGuardian에게 한소리를 듣고 시작하는 경우, 이미 올라가있는 해당 파일에 대한 처리도 필요합니다.
해당 경우에는 지금까지 작업한 내용을 commit/stash 후에 아래 코드를 통해 적용해줄 수 있습니다.
git rm -r --cached .
git add .
git commit -m "fix: Apply .gitignore"
reference 링크를 통해 정확한 내용을 확인할 수 있습니다.