[Flutter / run] 중요한 값은 env 대신 --dart-define 사용하기
2023.06.30 - [Flutter/외부 패키지, 라이브러리] - [Flutter / dotenv] flutter에서 1분 만에 환경변수 설정하기(flutter_dotenv)
일반적으로 개발 환경을 세팅할 때 .env
파일에 환경 변수를 세팅해 줍니다.
Flutter에서도 dotenv
라는 패키지를 활용해서 환경변수를 세팅할 수 있습니다. (세팅 가이드는 위의 포스팅에서 확인할 수 있습니다.)
저도 환경변수 노출 문제가 제기되기 전까지는, 무지성으로 dotenv
패키지를 이용해서 중요한 값들까지 세팅을 했었습니다.
이게 무슨 의미냐? Flutter로 만든 앱이 디패키징이 가능하다면, 우리가 주로 프로젝트 루트 경로 상에 저장하는 .env
파일의 내용들이 노출될 수 있다는 뜻입니다.
참고 | Why not to use dotenv on flutter
보안상 이슈가 없는 값들이라면 dotenv
로 환경변수를 세팅해도 문제될 일은 없겠지만,
중요 정보에 접근할 수 있는 토큰이나, apiKey, DB 비밀번호 등 민감한 값들은 보다 주의깊게 다뤄야 할 것입니다.
그렇기 때문에, 공식적으로도 --dart-define
이라는 방법을 적극 활용하기를 권장합니다.
(물론 cmd 명령을 직접 입력하는 순간 항상 안전하다는 인식은 버려야 합니다.. 이 부분도 추후에 다뤄볼 예정)
1. --dart-define
이란?
--dart-define
은 플러터 앱의 옵션을 지정하는 커맨드 라인 명령어입니다.
앱을 빌드하거나 실행할 때 즉, 컴파일 타임에 값을 액세스할 수 있습니다.
-> 명령어를 입력하여 정의(definition)하기 전에는 해당 변수를 알 수 없습니다.
2. --dart-define
사용법
- 프로젝트의 성격과 보안 요구 사항에 따라 적절한 방법을 선택하는 것이 중요합니다.
1) 단일 변수 사용: 값 한 개만 이용하고 싶을 때
(1) 커맨드 라인 세팅
flutter [명령어] --dart-define=키=밸류
# ex) API URL 세팅
flutter run --dart-define=API_URL=https://ejayjeon.tistory.com
# ex) BUILD MODE 세팅
flutter build apk --dart-define=DEBUG_MODE=true
(2) Flutter에서 키값으로 환경변수 접근
컴파일 타임에 값을 확정받아야 하므로 const
변수를 써야 합니다.
const 타입 변수명 = [String|bool|int].fromEnvorinment(키, {defaultValue});
// main.dart
// defaultValue: 입력한 키 값으로 변수를 불러오지 못할 때 지정할 값. 안써도 무방
const String apiUrl = String.fromEnvironment('API_URL', defaultValue: '디폴트 값 지정');
const bool debugMode = bool.fromEnvironment('DEBUG_MODE'); // true
2) 복합 변수 사용: 값 2-3개 정도만 이용하고 싶을 때
(1) 커맨드 라인 세팅
flutter [명령어] --dart-define=키1=밸류1 --dart--define=키2=밸류2 ...
# ex) API URL과 DEBUG_MODE 동시에 세팅
flutter run
--dart-define=API_URL=https://ejayjeon.tistory.com
--dart-define=DEBUG_MODE=true
(2) Flutter에서 키값으로 환경변수 접근
-> (1)과 동일
3) 파일 사용: 3개 이상 중요한 값들을 저장해놓고 이용할 때 (*추천)
(1) 커맨드 라인 세팅
flutter [명령어] --dart-define-from-file=파일경로
# ex) 프로젝트 루트경로의 config.json 파일 이용
flutter run
--dart-define-from-file=config.json
# ex) 프로젝트 외부 경로의 config.json 파일 이용(* 절대경로 써줄 것)
flutter run
--dart-define-from-file=User/Documents/dev/.../config.json
여러 변수들을 저장하기 위한 가장 좋은 방법 중 하나는 파일을 사용하는 것입니다.
이를 위해 프로젝트 내에 파일을 생성하고, 해당 파일을 .gitignore
에 등록하여 버전 관리 시스템에 포함되지 않도록 해야 합니다.
하지만 무엇보다도, 실행자만이 접근할 수 있는 위치에 외부 파일을 저장하는 것이 보안상 더 안전합니다. 파일이 외부에 있을 경우, 프로젝트 자체가 노출되더라도 해당 파일에 접근하기는 어렵습니다.
예를 들어, 프로젝트가 해킹 당하거나 소스 코드가 유출되더라도 외부 파일에 저장된 데이터는 알 수가 없죠. 해당 파일에 특정 사용자나 시스템만이 해당 파일을 읽거나 쓸 수 있게 접근 권한을 설정할 수도 있지요.
(2) Flutter에서 키값으로 환경변수 접근
-> (1)과 동일
3. IDE에 커맨드 세팅
앱을 실행하거나 빌드할 때마다 매번 커맨드라인에 명령어를 입력하는 것은 불편할 수 있습니다.
따라서 각 IDE에서 명령어를 미리 지정해두고, 실행 또는 빌드 버튼을 누르면 자동으로 --dart-define
과 입력한 값들이 실행되도록 설정할 수 있습니다.
1) Visual Studio Code (VS Code)
VS Code 왼쪽 사이드바 (설정마다 다름) > 실행 및 디버그 > launch.json
파일 만들기
# configurations의 toolArgs를 수정하면 됩니다
{
"version": "0.2.0",
"configurations": [
{
"name": "dev",
"request": "launch",
"type": "dart",
"program": "lib/main.dart",
"toolArgs": [
"--dart-define-from-file",
"config.json",
"--dart-define",
"DEBUG_MODE=true",
],
}
]
}
주의할 점 -> toolArgs
에 작성을 해야 합니다.
2) JetBrains IDE (Android Studios, Intelie J)
프로젝트 > Run/Debug Configurations 에서
Dart file의 위치, VM options, Program arguments를 입력해주시면 됩니다.
참고자료
참고|Dart: Configuring apps with compilation environment declarions
참고|Exploring --dart-define in Flutter
참고|VS Code Configurations 구성