암호화(encryption)는 특수 키 없이는 읽을 수 없는 형태로 데이터를 변환하는 프로세스입니다. 모바일 애플리케이션에서 암호화는 사용자의 개인 데이터, 결제 정보 및 비즈니스 로직을 가로채기 및 유출로부터 보호합니다. Statista(2024년)에 따르면 모바일 앱의 데이터 유출 건수가 2년 동안 38% 증가했으며, 72%의 경우 원인은 암호화 부재 또는 잘못된 사용이었습니다. 최신 모바일 플랫폼은 암호화를 위한 내장 API를 제공하며, 그 사용은 필수 보안 표준입니다. Statista, 2024
핵심 요점
모바일 애플리케이션 맥락에서 암호화는 장치에 저장된 데이터(data at rest)와 네트워크를 통해 전송되는 데이터(data in transit)를 보호하기 위해 암호화 알고리즘을 적용하는 것입니다. 장치 수준에서는 로컬 저장소(파일, 데이터베이스, SharedPreferences, 캐시)가 암호화됩니다. 네트워크 수준에서는 앱과 서버 간의 트래픽이 TLS/HTTPS 프로토콜을 통해 암호화됩니다. 최종 목표는 장치에 물리적으로 접근하거나 트래픽을 가로채더라도 공격자가 암호화 키 없이는 보호된 데이터를 읽을 수 없도록 하는 것입니다.
모바일 장치는 데이터 손실에 특히 취약합니다. 휴대전화는 쉽게 분실, 도난 또는 맬웨어에 감염될 수 있습니다. Ponemon Institute(2023년)에 따르면 데이터 유출 피해를 입은 기업의 42%가 모바일 장치를 원인으로 지목했습니다. 암호화가 없으면 공격자는 USB를 통해 장치에 연결하고 SQLite 데이터베이스를 추출하여 저장된 모든 데이터를 읽을 수 있습니다. 암호화는 이 문제를 해결합니다. 데이터베이스가 추출되어도 그 내용은 암호화된 상태로 유지됩니다. 또한 미국과 EU에는 개인 데이터 암호화를 의무화하고 위반 시 연간 매출의 최대 4%에 달하는 벌금을 부과하는 법률(GDPR, CCPA)이 있습니다. 암호화 사용은 사용자 데이터를 처리하는 모든 모바일 애플리케이션에게 기술적 필요성일 뿐만 아니라 법적 필요성이기도 합니다.
모든 암호화 알고리즘은 대칭형(암호화와 복호화에 하나의 키 사용)과 비대칭형(공개 키와 개인 키의 쌍 사용)의 두 가지 주요 유형으로 나뉩니다. 유형 선택은 사용 시나리오에 따라 다릅니다. 로컬 데이터 암호화에는 속도 때문에 대칭 알고리즘이 자주 사용되며, 키 교환 및 인증에는 비대칭 알고리즘이 사용됩니다.
| 특성 | 대칭 | 비대칭 |
|---|---|---|
| 키 수 | 1(비밀) | 2(공개 + 개인) |
| 속도 | 높음(1~10GB/s) | 낮음(1~10MB/s) |
| 키 배포 | 문제 있음 — 키를 전송해야 함 | 간단 — 공개 키를 게시 |
| 예시 | AES, ChaCha20 | RSA, ECDH, ECIES |
| 모바일 개발에서의 사용 | 로컬 데이터 암호화 | 키 교환, 디지털 서명 |
실제로 모바일 애플리케이션에서는 하이브리드 암호화가 사용됩니다. 비대칭 알고리즘(예: ECDH)으로 세션 키를 교환하고, 이후 모든 데이터는 대칭 알고리즘(AES 또는 ChaCha20)으로 암호화됩니다. 이 접근 방식은 대칭 암호화의 속도와 비대칭 키 교환의 보안을 결합합니다. 이 방법은 TLS 1.3, Signal Protocol 및 Apple iMessage의 기초입니다.
최신 모바일 개발은 각각 특정 작업을 위해 설계되고 고유한 적용 영역을 가진 여러 표준화된 암호화 알고리즘을 사용합니다.
암호화는 장치 분실(디스크 및 앱 컨테이너 암호화), 트래픽 가로채기(TLS/HTTPS 네트워크 프로토콜), 서버 유출(종단간 암호화)의 세 가지 주요 시나리오에서 데이터를 보호합니다. 각 시나리오에는 고유한 접근 방식과 도구가 필요합니다.
저장 데이터 — 장치의 데이터 — 는 Android Keystore 및 iOS Keychain을 통해 암호화됩니다. Android 7.0부터 파일 기반 암호화(File-Based Encryption)가 사용되며, 앱은 AndroidX Security 라이브러리의 EncryptedSharedPreferences 및 EncryptedFile을 통해 데이터를 추가로 암호화할 수 있습니다. iOS에서는 모든 앱이 기본적으로 Data Protection API와 함께 작동하며, 장치 암호에 연결된 키로 파일 시스템 수준에서 파일을 암호화합니다. 전송 중 데이터에는 필수 Certificate Pinning과 함께 TLS 1.2/1.3이 사용됩니다.
종단간 암호화(E2E)는 메시지가 송신자 장치에서 암호화되고 수신자 장치에서만 복호화되는 최고 수준의 데이터 보호입니다. 저장 및 전송 서버는 콘텐츠에 접근할 수 없으며 암호화된 블롭만 처리합니다. 모바일 애플리케이션에서 가장 잘 알려진 E2E 구현은 Signal Protocol로, 초기 키 교환을 위해 X3DH(Extended Triple Diffie-Hellman)와 함께 Double Ratchet Algorithm을 사용합니다. Signal Protocol은 Perfect Forward Secrecy와 future secrecy를 제공합니다. 하나의 키가 손상되어도 이전 또는 이후 메시지가 드러나지 않습니다. Carnegie Mellon University(2023년)의 연구에 따르면 메시징 앱의 E2E 암호화는 TLS 전용 암호화와 비교하여 통신 유출 위험을 99.7% 감소시킵니다. GDPR 및 HIPAA 요구 사항에 따라 Health & Fitness 및 Finance 카테고리 앱에는 E2E가 필수입니다. 자체 프로젝트에서 E2E를 구현하려면 Signal Protocol 라이브러리(Java/Swift) 또는 Olm(Matrix 프로토콜) 기반 라이브러리를 사용하는 것이 좋습니다. E2E 솔루션을 선택할 때는 플랫폼 호환성을 평가하십시오. Signal Protocol은 비동기 전송 및 클라이언트 측 키 저장을 지원해야 하므로 다중 장치 시나리오가 복잡해집니다. 이러한 경우 Matrix Protocol과 그 룸 모델이 더 나은 선택일 수 있습니다.
Android에서 Jetpack Security(AndroidX Security)를 사용한 데이터 암호화 및 복호화 예제를 살펴보겠습니다. 이 라이브러리는 파일 암호화를 위한 EncryptedFile과 설정을 위한 EncryptedSharedPreferences를 제공합니다.
val masterKey = MasterKey.Builder(context)
.setKeyScheme(MasterKey.KeyScheme.AES256_GCM)
.build()
val encryptedFile = EncryptedFile.Builder(
context,
File(context.filesDir, "secret.dat"),
masterKey,
EncryptedFile.FileEncryptionScheme.AES256_GCM_HKDF_4KB
).build()
encryptedFile.openFileOutput(applicationContext).use { outputStream ->
outputStream.write("Sensitive user data".toByteArray(Charsets.UTF_8))
}
MasterKey는 AES256-GCM을 사용하여 생성됩니다 — 가장 안전한 대칭 암호화 모드입니다. 키는 메인 프로세스에서 격리된 Android Keystore에 저장됩니다. 앱이 손상되어도 공격자는 키를 추출할 수 없습니다. EncryptedFile은 키 유도를 위해 HKDF를 사용하는 AES-256-GCM 체계와 4KB 페이지 크기를 사용하여 속도와 보안 간의 좋은 균형을 제공합니다. 데이터를 읽으려면 동일한 매개변수로 openFileInput을 사용합니다. 라이브러리가 읽을 때 자동으로 데이터를 복호화합니다.
iOS에서는 AES.GCM 또는 ChaChaPoly를 사용하여 CryptoKit(Swift)을 통해 유사한 기능이 제공됩니다. 키는 Keychain Services를 통해 Secure Enclave에 저장됩니다. 원리는 동일합니다. 키는 안전한 하드웨어 저장소를 절대 떠나지 않으며, 데이터는 디스크에 쓰기 전에 암호화됩니다. 이 아키텍처는 민감한 데이터를 다루는 애플리케이션을 위한 OWASP MASVS(Mobile Application Security Verification Standard) L2 수준 권장 사항을 준수합니다. 실제 프로젝트에서 토큰용 EncryptedSharedPreferences와 사용자 데이터용 EncryptedFile의 조합은 로컬 암호화 시나리오의 100%를 커버합니다. 또한 서버에서 수신한 키(예: ECDH 세션 키)로 작업하기 위해 purpose = KeyProperties.PURPOSE_ENCRYPT 매개변수와 함께 Android KeyStore가 사용되며, 이는 키가 승인된 암호화 작업에만 사용되고 하드웨어 저장소에서 RAM으로 일반 텍스트로 내보내지지 않도록 보장합니다.
자주 묻는 질문
GCM 모드의 AES-256이 하드웨어 저장소(Android Keystore / iOS Keychain)에 키를 저장하여 황금 표준으로 간주됩니다. 네트워크 트래픽에는 Curve25519 타원 곡선을 사용한 TLS 1.3입니다. ChaCha20-Poly1305는 하드웨어 AES가 없는 장치에서 대안으로 사용됩니다.
AES는 대칭 알고리즘(하나의 키)으로 빠르며 대량의 데이터 암호화에 적합합니다. RSA는 비대칭(키 쌍)으로 느리며 데이터가 아닌 키 암호화 및 서명에 사용됩니다. 모바일 애플리케이션에서 AES는 데이터를 암호화하고 RSA는 키를 보호합니다.
기밀 데이터(액세스 토큰, 비밀번호, 개인 정보, 결제 데이터, 의료 기록)를 암호화해야 합니다. 공개 데이터(이미지, 콘텐츠)는 암호화하지 않아도 되지만 앱의 보호된 컨테이너에 저장하는 것이 좋습니다.
종단간 암호화에서는 데이터가 전송 전에 송신자 장치에서 암호화되고 수신자 장치에서만 복호화됩니다. 서버는 암호화된 데이터만 볼 수 있습니다. Signal Protocol에 구현된 Double Ratchet 프로토콜은 모바일 메신저에서 가장 일반적인 E2E 메커니즘입니다.
기술적으로 가능하지만 권장되지 않습니다. 장치 데이터에는 Keystore의 키를 사용한 대칭 암호화(AES-GCM)를 사용하세요. 네트워크에는 별도의 키 세트와 Certificate Pinning을 사용한 TLS 1.3을 사용하세요. 분리를 통해 하나의 키가 유출되어도 두 채널이 모두 손상되는 것을 방지합니다.
요약
턴키 방식의 모바일 애플리케이션을 개발해 드립니다
IT Sectr는 2017년부터 스타트업과 기업을 위한 iOS 및 Android 애플리케이션을 만듭니다. 저희가 상담해 드리고 최적의 솔루션을 제안하겠습니다.