플러터 개발을 할 때 API 키와 같은 민감한 정보를 어떻게 안전하게 보호할 수 있을까? 이 포스팅에서는 다양한 방법과 각 방법의 장단점을 정리해 보도록 한다.
1. App Build 파일에 API 키를 포함하는 것은 위험하다.
App Build 파일에 포함된 거의 모든 정보는 복호화가 가능하다. 여기에는 주석으로 남겨둔 테스트 계정 정보, API 키, 혹은 실수로 포함된 개인적인 데이터까지 포함된다.
예: Android Studio의 APK 분석기를 사용하면 빌드 파일에 포함된 리소스를 쉽게 볼 수 있다.
2. 개선된 방법: .env 파일 사용
.env 파일을 사용하면 민감한 정보를 프로젝트 내에서 분리하여 관리할 수 있다. flutter의 경우 flutter_dotenv 패키지를 활용하면 .env 파일에 저장된 데이터를 손쉽게 접근할 수 있다.
다만, .env 파일은 pubspec.yaml에 assets로 등록해야 하며, 이는 결국 앱에 포함이 된다는 의미이다. 결론적으로, APK를 추출하면 여전히 접근 가능한 형태로 남아있다.
3. 조금 더 스마트한 방법: 환경 변수 사용
환경 변수를 사용하면 민감 정보를 안전하게 관리할 수 있으며, 이를 위해 launch.json 파일의 toolArgs에 --dart-define 플래그를 추가하여 실행 시 환경 변수를 전달할 수 있다.
{
"configurations": [
{
"name": "Flutter",
"request": "launch",
"type": "dart",
"toolArgs": [
"--dart-define",
"ANNIVERSARY=I_HAVE_NO_IDEA"
]
}
]
}
Flutter 코드에서는 아래와 같은 형태로 값을 불러올 수 있다.
String.fromEnvironment('NAME')
그러나 이 방법 역시 완벽하지는 않다. 모든 데이터를 런타임 설정에서 전달하기 때문에 대규모 프로젝트에서는 관리가 어려울 수 있다. 해결책으로 --dart-define-from-file을 사용해서 파일로 데이터를 전달하고, 해당 파일을 .gitignore에 추가하여 Git에 포함되지 않게 처리할 수 있다.
4. 오늘의 주제: Envied 라이브러리
Envied는 현재로서는 가장 안전한 방법으로 평가받고 있다.
Envied의 장점
1) .env 파일을 assets로 추가하지 않기 때문에 앱에 포함되지 않는다.
2) Dart 파일로 비밀 데이터를 변환하며, Base64로 인코딩하여 복호화를 어렵게 한다.
3) --obfuscate=true 옵션을 설정하여 보안을 더욱 강화할 수 있다.
4) 다양한 앱 flavor를 지원한다.
Envied 사용 방법
1) @Envied 어노테이션을 사용해 .env파일 경로를 지정하고, obfuscate=true로 설정한다.
2) 각 키를 @EnviedField로 선언하고, .env 파일에서 해당 키와 연결한다.
3) flutter pub run build_runner build 명령어를 실행하여 필요한 코드를 생성한다.
4) .env, production_secret.dart, production_secret.g.dart 파일을 .gitignore에 추가한다.
4. CI/CD 환경에서 Envied 사용
Github Actions, CodeMagic과 같은 CI/CD 도구를 사용한다면, 키를 플랫폼 내에 안전하게 저장한 뒤 워크플로우에서 동적으로 Envied 파일을 생성할 수 있다.
결론
Envied는 민감한 데이터를 안전하게 관리하기에 좋은 강력한 도구이다. 다만, 핵심 데이터 같이 치명적인 데이터가 있다면 여전히 보안 서버에서 관리하는 것이 가장 좋다.
아래 링크의 포스팅을 읽고 정리한 내용입니다. 원문을 확인하고 싶으시면 아래 링크를 참고하세요.
출처 - https://fnfidanci.medium.com/how-to-secure-api-keys-in-flutter-41cfb31ae52a
'Personal Posting > Flutter' 카테고리의 다른 글
Flutter 기반 함수형 에러핸들링 (0) | 2025.01.03 |
---|---|
SOLID 원칙 Flutter 프로젝트에 적용하기 (1) | 2025.01.03 |
Flutter에서 Android MacAddress 에러 (0) | 2024.04.23 |
Dart 내용 정리 (0) | 2023.12.20 |
Android 앱 빌드 후 API 호출 문 (0) | 2023.09.21 |