여러 일정들을 소화하면서 앱에서의 보안에 대한 생각이 늘어났는데 생각만하기보다는 더 자세히 보안 강화방법을 알아보고자 해당 글을 작성하게 되었습니다.
앱에서는 자동 로그인 등의 일부 기능을 위해 유저 데이터를 서버에 저장하지 않고 앱 내부에 저장하여 사용하며, 이때 자주 사용되는 패키지는 shared_preferences입니다.
하지만 서버 통신에 사용되는 토큰 값 혹은 유저의 ID, PW와 같은 민감정보는 shared_preferences (혹은 SQLite) 가 아닌 flutter_secure_storage를 통해 저장하여 사용하는 것이 좋습니다.
shared_preferences 혹은 SQLite는 내부 저장 시에 암호화를 거치지 않고 저장이 되어 유출이 발생 가능합니다.
하지만 flutter_secure_storage를 이용할 경우 데이터를 저장할 때 Android에서는 keystore, iOS에서는 keychain 내부 저장소에 암호화를 거쳐 저장되므로 루팅이나 탈옥을 통한 데이터 유출을 방지할 수 있습니다.
flutter_secure_storage | Flutter Package
Git에 API 키, 서버 주소 등에 대한 정보 노출 위험 문제와 보안 문제를 피하기 위해서는 코드에 하드코딩하지 않는 것이 보안 및 유지 보수 측면에서 중요하고, 피해야 하는 개발 방식입니다.
이때 유용하게 사용될 수 있는 패키지인 flutter_dotenv는 Dart와 Flutter 앱에서 환경 변수를 관리하기 위한 패키지입니다.
flutter_dotenv 이용 시 환경 변수가 저장된. env 파일을. gitignore에 추가하여 Git 저장소에 올라가지 않도록 할 수 있습니다.
환경 변수를 별도의 파일에 저장하면 중요한 정보를 변경할 때 앱 코드들을 변경할 필요 없이. env 파일만 업데이트하여 적용할 수 있으므로, 유지 보수에도 도움이 됩니다. 또한. env 파일로 값이 적용되니 팀으로 작업한다면 모든 팀원은 동일한. env 파일을 사용하여 일관된 환경 설정을 편리하게 유지 및 공유할 수 있습니다.
flutter_dotenv | Flutter Package
비밀번호를 통한 토큰 갱신 등 민감 정보를 사용하여 서버와 통신할 경우 허가된 사람들만이 사용 및 인식 가능하도록 기밀성을 유지하여 정보 유출을 방지하여야 합니다.
encrypt 패키지는 꾸준히 업데이트되는 양방향 암호화 패키지로 AES, Fernet, SHA1 등 다양한 암호화를 제공하여 선정하였지만 필요에 따라 타 패키지들을 사용하여 암호화를 진행하여도 괜찮습니다.
ex) 해싱 처리 시 crypto 패키지 사용 등
해당 패키지를 사용해야 하는 이유보다는 암호화를 사용해야 하는 이유에 가깝습니다만, 데이터가 암호화되지 않으면 서버 통신 중 데이터를 탈취하여 악용될 수 있으며, 이에 대한 탈취와 데이터 변조 등에 대한 방지를 위해 암호화를 통해 사전에 해당 문제들을 방지하고 데이터를 주고받는 것이 좋습니다.
위와 같은 탈취와 악용의 문제뿐만 아닌 사용자의 개인 정보나 인증 정보와 같은 민감한 데이터는 정보 보호를 위해서도 진행되는 것이 좋은 방향성입니다.
앱 화면에서 사용자의 민감 정보가 표시되는 경우 백그라운드 스냅샷(=백그라운드로 실행 중인 앱들에 대한 모음 화면) 에서 해당 데이터를 확인 할 수 없도록 방지해야 합니다.
대표적인 예로 은행 어플의 경우 사용자의 계좌 잔액 등을 노출하지 않는 것이 중요하며 이런 기능을 secure_application 패키지를 통해 간편하게 사용할 수 있습니다.
해당 패키지를 통해 앱이 백그라운드에서 실행 중일 때 스냅샷이 화면에 표시하지 않도록 진행하지 않는다면 상단에 적은 은행 어플 예와 같이 타인에게 민감 정보 혹은 노출되고 싶지 않은 정보 화면에 보여 사용자의 민감한 정보가 노출될 수 있습니다.
그뿐만 아닌 유료 컨텐츠 등을 제공하는 서비스라면 화면 내 텍스트들을 백그라운드를 통해 확인하지 못하도록 기능을 적용시켜 유출에 대한 방지를 진행할 수 있기에 사용자 경험과 보안 강화를 위해 적용해주는 것이 좋습니다.
secure_application | Flutter Package
각 OS에서는 루팅과 탈옥이라는 개념이 존재합니다, 해당 개념들은 기기의 제한을 우회하여 추가 기능을 활성화하는 것을 의미하며 이 기능들을 통해 이미 적용된 보안들을 회피할 수 있으며 이를 통해 내부 데이터를 조작 및 확인이 가능합니다.
flutter_jailbreak_detection 패키지는 위 문제를 가진 Android에서의 루팅과 IOS의 탈옥을 감지할 수 있도록 하는 패키지입니다.
루팅과 탈옥은 상단에 적은 것과 같이 보안을 회피하고 데이터 조작이 가능하여 보안 정책 위반, 앱의 무단 사용, 데이터 유출, 결제 및 라이선스 문제 등의 문제를 초래할 수 있습니다.
특히 결제나 라이센스를 통해 진행되는 앱 기능이 있다면 이에 대한 우회를 가능케하며 사내 이익을 감소시키거나 컨텐츠 제공 어플의 경우 내부 데이터 탈취 등으로 인한 문제가 발생할 수 있으므로 이에 대한 감지를 통해 사용자가 앱을 이용하지 못하도록 차단하는 등의 방안으로 보안성과 안전성을 강화하는 것이 좋습니다.
flutter_jailbreak_detection | Flutter Package
패키지 및 SDK는 기존 기능의 보안 취약점에 대한 대응이나 각종 최적화와 같은 작업이 진행되거나 새로운 보안 기능이나 개선된 기능을 제공하기 위해 업데이트가 진행되기도 합니다. ( 물론 항상은 아닙니다만 )
이러한 업데이트를 통한 새로운 기술이나 각종 대응 사항을 업데이트를 통해 적용하여 앱의 안전성을 향상시킬 수 있으니 꾸준하게 패키지 및 SDK 업데이트 내역을 확인하고 적용한다면 앱의 보안을 점진적으로 향상시킬 수 있습니다. 🙂