![[Flutter][Error] 난독화와 enum.name](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbXmJml%2FbtsMEZ17Qxz%2FfGWaQqPuMn3UACau3w5or0%2Fimg.png)
개요: 난독화
지금까지 진행했던 프로젝트들은 보안이 크게 중요하지 않아서(사용자가 많지도 않고, 악용할만한 요소가 존재하지 않았다.) 난독화에 시간을 투자하지 않았다. 하지만 난독화를 하긴 해야한다. 디컴파일을 하면 .env파일로 키 값들을 보관한다고 해도, manifest까지도 빼 갈 수 있기 때문에 카카오 키 값들이나 구글 키 값들을 탈취할 수 있다.
물론 Proguard나 dexguard로 난독화를 아무리 한다고 해도 디컴파일을 완벽히 방지한다 까진 아니고 어느정도 시간을 벌 수 있다 정도라서 어쨌거나 누군가가 탈취 시도를 하면 탈취가 된다고 한다. 이 이야기는 특정 대형 서비스들(서비스 이름은 이야기할 수 없다.) 이야기이긴 하나, 기술을 어디까지 사용하냐에 따라 보안이 철저하게 지켜지는 곳도 있는거 같다.
"결국 털리니까 난독화에 돈을 쓸 이유가 없는거 같은데?"
그렇다고 난독화를 안 할 수는 없다. 난독화를 안해놓으면 결국 모든 보안, 소스 코드가 거의 1분도 안되어 탈취당한다. 난독화를 해놓으면 어쨌거나 시간을 벌고 공격에 지연시간을 걸기에 꼭 필요하다.
문제점
난독화를 해주는 서비스는 대표적으로 Proguard, Dexguard 등이 있다. 난독화가 정확히 어떻게 되는지는 블랙박스 정도로만 알고 있어도 해당 서비스들이 해주기에 비교적 쉽게 적용을 할 수 있다.
그러나 문제점이 하나 있는데, 바로 enum이다.
난독화와 enum
난독화 과정을 거치면 객체 이름들이 모두 난독화 과정에서 생성된 이름들로 바뀌게 된다. 내가 Gorani
라고 클래스 이름을 지었다고 해도, 난독화 과정을 거치고 나면 Gorani
가 아니라 o
가 되어버릴 수 있다.
아래와 같은 enum이 있다고 해보자.
enum gorani {
HELLO,
GORANI,
BYE
}
위의 enum은 난독화 되면 다음과 같이 바뀔 수 있다. (무조건 아래와 같이 바뀐다는 것은 아니다.)
enum o {
x,
y,
z
}
그런데 우리는 enum에서 name
으로 해당 enum의 이름 값을 String의 형태로 가져올 수 있다. 하지만 난독화 과정을 거치고 나면 enum의 이름들이 더 이상 HELLO
, GORANI
, BYE
가 아니게 된다. 이름들은 우리가 작성한 값들이 아닌 x
, y
, z
와 같은 난독화된 코드로 바뀌게 된다.
이정도 읽었다면 눈치를 챘을 것이다. 이렇게 난독화 된 enum에 name을 하게 되면 우리가 의도한 것은 gorani.HELLO.name
이지만 난독화 된 우리의 코드는 o.x.name
이 되어 실제로는 HELLO
라는 String이 전달되는게 아니라 x
라는 String이 전달되게 된다.
해결
해결하는 방법은 조금은 귀찮지만, enum 내부에 별도의 label
필드를 하나 두는 것이다.
enum gorani {
GORANI("GORANI"),
HEELO("HELLO");
final label;
const gorani(this.label);
}
Dart의 enum은 클래스와 같이 내부에 필드를 둘 수 있는데, 여기에 label 필드를 만들어 값을 미리 할당해두면 객체의 이름이 변경되어도 내부에 저장하고 있는 값은 리터럴이므로, 그대로이기에 똑같이 난독화 된 코드라고 해도 정확한 값을 전달할 수 있다.
마치며
이런 문제가 발생할 수 있다는 것을 거의 처음 알았다. 생각보다 많은 정보가 들어와서 난감했는데, 곰곰히 생각해보니 굉장히 자연스럽게 일어날 수 있는 문제라서 더 조심해야겠다는 생각이 들었다.
'Develop > Flutter' 카테고리의 다른 글
[Flutter][Issue] iOS 카카오 로그인과 버전 관리 이슈 (0) | 2025.04.24 |
---|---|
[Flutter][Issue] 구글 맵 버벅임 문제 해결 (0) | 2025.04.23 |
[Flutter] SizedBox를 Padding 대신 사용하지 말아야 하는 이유 (0) | 2025.02.08 |
[Flutter][Issue] Flutter 카카오 로그인 릴리즈 키 (0) | 2024.12.29 |
[Flutter][Widget][Issue] TabBar 왼쪽에 공간이 생기는 현상 (0) | 2024.12.11 |