공공데이터 포털에서 API키를 발급받고 그것으로 API요청을 하는 안드로이드 앱을 만들었다. 무료라도 API Key까지 배포하는 것은 역시 문제가 있기 때문에 방법을 생각해보았다.
이전에 만든던 것들은 서버사이드까지 구현했기 때문에 서버에서 환경변수를 관리하면되었다. 하지만 이것것은 안드로이드 앱이고 클라이언트에서 직접 API를 요청하고 받는 방식이기 때문에 클라이언트에서 환경변수를 만드는 것은 안된다. 물론 AWS를 이용해서 중간에 서버를 끼우면 되지만 지속적인 비용이 필요할 것이다.
제일 단순하지만 보안에 문제가 되는 행위다. 특히 내가 API 키를 받아온 공공데이터포털은 하나의 key가 러가지 API에서 똑같이 쓰이기 때문에 유출 됐을 때 횟수초과가 나기 쉬울 것이다.
두 가지 문제가 있다.
암호화 된 키를 그대로 보내는 것은 불가능하다. 이것은 공공데이터포털쪽에 문의를 해서 알아낸 것이기 때문에 확실히 사용이 불가능한 방법이다.
복호화 과정을 앱에 구현해두면 마찬가지로 누군가가 알아낼 수 있다. 숙련된 프로그래머라면 마음만 먹는다면 복호화 과정을 분석하거나 최종 요청에서 복호화 된 키가 url의 형태로 전달 되는 것을 탈취할 수 있을 것이다.
깃 허브에서 제공하는 기능이며, 이것을 사용해도 클라이언트에 API키가 전달되기 때문에 보안문제는 똑같이 발생한다.
프로가드, R8과 같은 도구를 사용해서 코드를 읽기 어렵게 만들 수 있다고한다.
코드를 분석하기 어려울 뿐이지만 코드를 암호화-복호화 하는 방법과 함께 사용한다면 유용할 것 같다.
공공데이터 포털 API의 특성으로 인해 보안성이 높은 방식으로 배포하지는 못할 것 같다.
내가 요청해둔 API들은 모두 무료 API이기 때문에 유출되어도 큰 문제가 없고, 요청 횟수도 늘릴 수 있지만 많이 아쉽다.
최소한의 방어로 생각해둔 방법은 둘이다.
API키를 코드에서 최대한 숨기고 암호화한다.
HTTPS로 요청을 해서 제 3자가 알 수 는 없게한다.
코드를 난독화 한다(프로가드,R8 등)
클라이언트 > 백엔드 서버 > 공공데이터 포털 > 백엔드 서버 > 클라이언트 라는 단계를 거쳐서 API통신을 하게 한다.
여전히 문제는 존재한다.
1~3의 방법을 이용하면 공공데이터포털의 한계로 인해 사용자 측에서 API키를 알아내려고 한다면 얼마든지 쉽게 API키를 알아낼 수 있기 때문이다.
4의 방법은 클라이언트에서 직접 요청하는 것에 비해서 느리고, 백엔드 서버가 항상 켜져 있어야하기에 지속적으로 관리해야하며, 서버비용이 든다는 단점이 있다.
결국 공공데이터포털에서 발급받는 API는 무료 API만 사용하고, 필요에 따라서는 사용량 증가를 요청하는 소극적인 대책밖에 없을 것 같다.
Is it safe to expose your Firebase API key?
React(CRA) 개발 시 API Key 설정,보안 (with Github Actions, Secrets)