Flutter 개발시 API Key나 다른 것을 숨겨야 할 상황이 생긴다. 이 때 우리는 환경변수를 사용하여 보안성을 높일 수 있다. 이번에는 .env 파일을 통해 git과 같은 코드 업로드 시 보안을 높이고 또한 앱 배포시에도 리버스 엔지니어링으로 부터 더욱 안전할 수 있게 난독화까지 할 수 있도록 하겠다.
● API Key를 숨기지 않더라도 Naver, AWS 등 여러가지 API 서비스는 제한 횟수로 관리하는 방법이나 단기에 많은 요청시와 같은 비정상적인 호출이 실행되었을 때를 서비스를 제공하는 곳에서 관리해주기 때문에 어느정도 보장되지만, 그럼에도 악용하는 방법은 무궁무진 하므로 보안성을 최대한 높이는 것이 좋다.
● API Key 뿐만 아니라 숨겨야 하는 다른 데이터를 난독화를 통해 보안성을 높일 수 있다.
.env File 사용하기
.env
플러터 프로젝트 루트 디렉터리 (Flutter Project Root Directory)에 .env 파일을 생성하고 key를 적으면 된다.
NAVER_ID_KEY = '발급 받은 키값'
Add Package
난독화와 환경변수 .env file에 적은 값들을 가져오기 위해 다음 패키지를 추가 해 주자.
다음과 같은 오류는 google.android.gms.service가 충돌해서 발생하는 오류이다. Naver Map API 사용하는 경우 대부분 자신의 위치 기반으로 geolocator를 사용하고 둘 다 google.android.gms.service.location를 사용하기 때문에 발생한다.
충돌지점은 20.0.0버전의 이후와 이전으로 20.0.0 버전으로 넘어가는 과정에서 에러가 발생한다고 한다.
Flutter를 사용하다보면 이 에러를 심심치 않게 볼 수 있다. Flutter와 dart는 자주 쓰이는 언어에 비해 터무니 없이 역사가 짧다. 때문에 다양한 상황에 따른 가이드라인이 많이 부족할 수 밖에 없으며 한국어 관련 문서, 블로그는 더 찾기 힘들다.
그런 상황에서 다른 분들은 삽질 하지 않았으면 한다. 먼저 다음과 같은 오류는 Flutter .yaml - Package 와 Android의 Kotlin 버전이 맞지 않아서 이다. binary version은 1.9.0인데 1.5.1으로 예상된다. 아니면 1.9.0인데 1.7.1로 예상된다.
그렇다면 kotlin과 Package 버전을 맞춰주면 해결 되는 문제이다. 실제로도 그렇다. 하지만 Package 가 어느 kotlin의 어느 버전으로 사용하고 있는지 확인 하는 것보단 프로젝트의 Android 버전을 확인하는 것이 쉽기 때문에 사람들은 이 코드를 많이 봤을 것이다.Flutter 프로젝트 root 경로/android/build.gradle 물론 단순한 Package 하나의 문제인 경우 위 코드로 해결된다. 하지만 특정 Package 를 사용해야 하고 그것을 포함한 여러 Package 를 사용해야 하는 경우 요구(권장)하는 Kotlin 또는 Package 가 지원 가능한 Kotlin의 버전이 서로 맞지 않기 때문에 다음과 같은 오류가 발생할 수 있다.
다음과 같은 경우 BuildTree를 통해 어떤 Package 의 버전이 다르고 최종적으로 어떤 버전으로 Build되었는지 알 수 있다. BuildTree에서 확인하여 버전이 다른 Package 를 업데이트 시켜줌으로써 해결할 수 있다.
log('Request failed with status: ${response.statusCode}.');
}
}
통신의 결과 log를 확인해보자
결과
[log] Request failed with status: 401.
... ??
Flutter Code로 실행한 결과 권한이 없음 이였다. 하지만 이는 domain과 params가 잘못된 경우도 포함되므로 다음과 같은 시도를 하였다. ( javascript로 추가 검증시에 발견 )
1. url = https://dapi.kakao.com/v2/local/search/keyword 2. parms를 필수 param인 query만 두고 작성 3. --data-urlencode를 위한 Uri.encodeComponent(keyword) 4. Kakao문서의 SDK 추가 5. 네이트비 앱 키 등록 6. Admin 키 사용 7. 보낸 domain, header, params 재 확인 ( 텍스트 비교기로 확인 )
( 혹시나 RestApi + Flutter http 로 되는 사람이 있으면 댓글 부탁드립니다. )
때문에 이 코드를 JavaScript로 변환시켜 Node.js로 실행시켜보니 200(Ok)의 결과와 함께 데이터가 왔다..
JLabel을 활용하여 "Love Java"를 출력하고, "Love Java" 글자 위에 마우스를 올려 마우스 휠을 위로 굴리면 글자가 작아지고, 아래로 굴리면 글자가 커지도록 프로그램을 작성하라. 폰트 크기는 한 번에 5픽셀씩 작아지거나 커지도록 하고, 5픽셀 이하로 작아지지 않도록 해라.
소스 코드
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class Main7 extends JFrame{
public Main7() {
setTitle("마우스 휠을 굴려 폰트 크기 조절");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container c = getContentPane();
c.setLayout(new FlowLayout());
JLabel la = new JLabel("Love Java");
la.addMouseWheelListener(new MouseWheelListener() {
public void mouseWheelMoved(MouseWheelEvent e) {
int n = e.getWheelRotation();
int size = la.getFont().getSize();
if(n<0&&size>5) {
la.setFont(new Font("Arial",Font.PLAIN,size-5));
}
else {
la.setFont(new Font("Arial",Font.PLAIN,size+5));
}
}
});
c.add(la);
setSize(500,500);
setVisible(true);
}
public static void main(String[] args) {
// TODO Auto-generated method stub
new Main7();
}
}