@senspond

>

개발>모바일

Flutter 모바일 앱 개발 envied 로 안전하게 .env 파일로 환경변수 설정하기

등록일시 : 2024-08-02 (금) 12:42
업데이트 : 2024-08-02 (금) 12:53
오늘 조회수 : 4
총 조회수 : 607

    Flutter 모바일 앱 개발 envied 로 안전하게 .env 파일로 환경변수 설정하기

    다른 개발 환경에서 환경 변수들을 .env 파일에 두고 관리하는 방법을 자주 사용했는데,

    Flutter 에서는 어떻게 관리를 하나 찾아보았다.


    가장 먼저 접한 정보는 dart-define-from-file와 dart-define 이었다.


    dart-define-from-file

    .env 파일과 launch.json 파일을 정의하고

    {
        "version": "0.2.0",
        "configurations": [
            {
                "name": "flutter_sample",
                "request": "launch",
                "type": "dart",
               "toolArgs": [
                    "--dart-define-from-file",
                    "./.env"
                ]
            }
        ]
    }

    플러터 앱을 구동시 —dart-define-from-file 실행 인자를 주어 .env 에 작성한 환경변수 들을 가져오는 것이 가능하지만

    이 방법에 대한 이슈가 있는 것으로 확인됬다.




    https://github.com/flutter/flutter/issues/138793


    정의는 컴파일 시점에 iOS, Android 별도의 환경변수가 아니라 공유된다는 점.

    정의는 컴파일 시점에서 사용자의 dart 코드에서만 사용할 수 있는 것이 아니라는 점

    • iOS, macOS, Linux 및 Windows의 경우 정의는 시스템 환경에서 사용가능.

    • Android의 경우 Gradle에서 속성으로 사용가능.


    직접 확인해보지는 못했지만, 이 기능은 버그로 분류되고 최신 버전에서 제거된 것 같다.


    dart-define

    —dart-define으로 사용하는 방법도 있는데, —dart-define-from-file 가 동작하는 방식과 똑같아 보이지만,

    내부적인 구현이 다르다고 한다.

    {
        "version": "0.2.0",
        "configurations": [
            {
                "name": "Tutorial",
                "request": "launch",
                "type": "dart",
                "program": "lib/main.dart",
                "args": [
                    "--dart-define",
                    "API_KEY=1234567890",
                ]
            },
        ]
    }

    String.fromEnvironment("API_KEY")


    그런데 —dart-define-from-file 처럼 .env 파일로 작성 할 수가 없다는 것이다.

    그래서 .env 파일로 관리를 하면서 안전한 방법을 찾아봤다.


    envied Install

    먼저 envided와 envied_generator, build_runner 설치가 필요하다.


    flutter pub add envied

    flutter pub add --dev envied_generator

    flutter pub add --dev build_runner



    envied Example

    기본

    lib/env.dart

    // lib/env.dart
    import 'package:envied/envied.dart';
    part 'env.g.dart';
    
    @Envied(path: '.env')
    abstract class Env {
    
      @EnviedField(varName: 'API_KEY')
      static String apiKey = _Env.apiKey;
    }


    .env

    API_KEY=abcd


    dart run build_runner clean

    dart run build_runner build --delete-conflicting-outputs


    그러면 env.dart 경로에 env.g.dart 파일이 자동으로 생성된다.

    part of 'env.dart';
    
    // **************************************************************************
    // EnviedGenerator
    // **************************************************************************
    
    // coverage:ignore-file
    // ignore_for_file: type=lint
    final class _Env {
    	 static final String apiKey = "abcd"
    }

    공개 저장소에 소스 코드를 올릴 때, 주의할 점은 .env 와 env.g.dart 를 .gitignore 에 등록해줘야 한다.


    난독화


    // lib/env.dart
    import 'package:envied/envied.dart';
    part 'env.g.dart';
    
    @Envied(path: '.env')
    abstract class Env {
    
      @EnviedField(varName: 'API_KEY', defaultValue: '', obfuscate: true )
      static String apiKey = _Env.apiKey;
    }

    여기서 obfuscate 속성 값을 true로 준다.

    그리고 다시 env.g.dart 파일을 생성하면 소스코드가 난독화 되어, 보다 보안성이 높아진다.




    난독화 되어 env.g.dart 소스코드만 보고 KEY를 알아내기 어렵지만, 구동으로 키를 탈취할 수가 있다.

    마찬가지로 .env 와 env.g.dart를 .gitignore 에 등록해줘야 한다.

    그리고 .env 파일이 변경되게 되면 build_runner 를 통해 재생성을 해줘야 한다는


    개발/운영 분리

    개발용 환경과 운영용 환경을 각각 분리해서 BuildType에 따라 다른 변수들이 설정되도록 할 수도 있다.

    @Envied(path: '.env.dev')
    @Envied(path: '.env.prod')



    test

    import 'package:flutter_test/flutter_test.dart';
    import 'package:llm_app/env.dart';
    
    void main() {
      test("load env test", (){
          print("API_KEY : ${Env.apiKey}");
      });
    }



    senspond

    안녕하세요. Red, Green, Blue 가 만나 새로운 세상을 만들어 나가겠다는 이상을 가진 개발자의 개인공간입니다.

    댓글 ( 0 )

    카테고리내 관련 게시글

    현재글에서 작성자가 발행한 같은 카테고리내 이전, 다음 글들을 보여줍니다

    @senspond

    >

    개발>모바일

    • 윈도우 환경 인텔리제이로 Flutter 개발환경 세팅하기 (AMD CPU에서 AVD 사용)

      윈도우 환경 인텔리제이로 Flutter 개발환경 세팅하기 (AMD CPU에서 AVD 사용)
        2024-07-31 (수) 06:01
      1. flutter 에서 Hive Dart (NoSQL) 사용하기

        flutter 에서 Hive Dart (NoSQL) 사용하기
          2024-08-07 (수) 10:51
        1. [현재글] Flutter 모바일 앱 개발 envied 로 안전하게 .env 파일로 환경변수 설정하기

          Flutter 모바일 앱 개발 envied 로 안전하게 .env 파일로 환경변수 설정하기
            2024-08-02 (금) 12:42
          1. Flutter 의 위젯에 대한 개념과 StatefulWidget 생명주기, 컨트롤러, 빌더

            Flutter 의 위젯에 대한 개념과 StatefulWidget 생명주기, 컨트롤러, 빌더에 대해서 정리해 본 글입니다.
              2024-08-03 (토) 03:58