2023. 12. 8. 13:36ㆍFlutter
서버 및 다양한 통신을 위하여 API Key를 어떻게 저장하고 있나요?
Api 서버의 도메인, 토큰값 등 중요한 데이터를 그대로 넣어서 사용한다면, 쉽게 유출될 수 있기에 보안이 필요합니다.
해당 글에서는 보다 안전하게 보관하는 방법에 대해 작성해보겠습니다.
API Key를 감추는 방법은 여러가지 방법이 있지만, 가장 좋은 방법은 Envied의 패키지를 사용하는 것 입니다. (지금까지 찾아본 것 중!)
https://pub.dev/packages/envied
envied | Dart Package
Explicitly reads environment variables into a dart file from a .env file for more security and faster start up times.
pub.dev
우선 필요한 패키지를 설치하겠습니다.
(2023-12-08)기준
dependencies:
...
envied: ^0.5.2
dev_dependencies:
...
envied_generator: ^0.5.2
build_runner: ^2.4.7
해당 패키지를 설치한 후 (Pub get)
root directory 에 .env 파일을 생성합니다.
├── lib
│ ├── main.dart
│
├── .env
해당 파일에는 보안이 필요한 (API Key 등..) 데이터를 입력합니다.
baseUrl=여기에 데이터를 입력하세요
baseUrlSaeHa=https://www.naver.com
변수명 = 데이터(두번 째 줄 처럼 작성하시면 됩니다)
이후 env.dart 파일을 생성하겠습니다
저는
├── lib
│ ├── main.dart
│ └── env
│ └── env.dart
에 env.dart 파일을 생성하였습니다.
이후 env.dart 파일에서 다음과 같이 코드를 작성합니다.
import 'package:envied/envied.dart';
part 'env.g.dart';
@Envied(path: '.env')
abstract class Env {
@EnviedField(varName: 'baseUrl', obfuscate: true)
static final String baseUrl = _Env.baseUrl;
@EnviedField(varName: 'baseUrlSaeHa', obfuscate: true)
static final String baseUrlSaeHa = _Env.baseUrlSaeHa;
}
obfuscate를 ture 를 주게 된다면 난독화를 합니다.
(obfuscate를 true로 주게 된다면 static final String baseUrl = _Env.baseUrl; 부분이 const가 아닌 final로 선언해야 합니다)
터미널에서 다음 코드를 입력해줍니다.
flutter pub run build_runner build --delete-conflicting-outputs
env.g.dart가 생성되었다면 거의 마무리 되었습니다!
생성된 env.g.dart의 생김새 (baseUrlSaeHa 만 생성!)
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'env.dart';
// **************************************************************************
// EnviedGenerator
// **************************************************************************
// coverage:ignore-file
// ignore_for_file: type=lint
final class _Env {
static const List<int> _enviedkeybaseUrlSaeHa = <int>[
1653781031,
3870634125,
3538719303,
1932911704,
147341041,
4150891283,
2760994214,
1464055502,
1319218295,
2707508208,
690837546,
546827801,
180801135,
1102144468,
1406832599,
2926434173,
1664842566,
2637705560,
649027345,
3448727797,
239092657,
];
static const List<int> _envieddatabaseUrlSaeHa = <int>[
1653781071,
3870634233,
3538719283,
1932911656,
147340930,
4150891305,
2760994185,
1464055521,
1319218176,
2707508103,
690837597,
546827831,
180801025,
1102144437,
1406832545,
2926434072,
1664842548,
2637705590,
649027442,
3448727706,
239092700,
];
static final String baseUrlSaeHa = String.fromCharCodes(List<int>.generate(
_envieddatabaseUrlSaeHa.length,
(int i) => i,
growable: false,
).map((int i) => _envieddatabaseUrlSaeHa[i] ^ _enviedkeybaseUrlSaeHa[i]));
}
마지막으로 Git에 올라가지 않도록 .gitignore에
...
#Envied
*.env
env.g.dart
를 추가해 줍니다.
사용 방법
import 'package:@@@@@/env/env.dart';
String baseUrlSaeha = Env.baseUrlSaeHa;
print(baseUrlSaeha);
-------------------------------------
console
-------------------------------------
http://www.naver.com
env.g.dart 파일을 보니 복호화하는 과정은
static final String baseUrl = String.fromCharCodes(List<int>.generate(
_envieddata@@@@@.length,
(int i) => i,
growable: false,
).map((int i) => _envieddata@@@@@[i] ^ _enviedkey@@@@@[i]));
로 진행되며, XOR 로 나온 int 값을 String.fromCharCodes 로 변환하여 보여주는 것 같습니다.