SSL/TLS — protokol kriptografi yang mengenkripsi data antara aplikasi mobile dan server, menjamin kerahasiaan dan integritas lalu lintas. Menurut Apple (2026), App Transport Security secara default memblokir koneksi di bawah TLS 1.2 di semua perangkat iOS. TLS 1.3 mengurangi waktu handshake 2 kali lipat dibandingkan TLS 1.2, meningkatkan UX aplikasi mobile.
Poin utama
SSL (Secure Sockets Layer) dan TLS (Transport Layer Security) — protokol kriptografi yang menjamin transmisi data yang aman melalui jaringan. SSL, dikembangkan oleh Netscape pada tahun 1990-an, dinyatakan usang setelah versi 3.0 karena kerentanan POODLE dan BEAST. TLS, penerusnya, telah melalui versi 1.0, 1.1, 1.2, dan 1.3 — saat ini hanya TLS 1.2 dan TLS 1.3 yang dianggap terkini. Semua platform mobile modern mewajibkan penggunaan TLS untuk koneksi jaringan, dan App Store serta Google Play memeriksanya pada tahap review.
Tanpa TLS, lalu lintas antara aplikasi dan server dikirimkan sebagai teks biasa — siapa pun di jaringan Wi-Fi yang sama dapat mencegat nama pengguna, kata sandi, token, dan data pribadi pengguna menggunakan Wireshark atau tcpdump. TLS mengenkripsi semua data yang dikirimkan (enkripsi di tingkat transport) dan memverifikasi keaslian server melalui rantai sertifikat X.509. Menurut IETF (2018), TLS 1.3 hanya menggunakan cipher AEAD modern (AES-GCM, ChaCha20-Poly1305), mengecualikan algoritma usang seperti RC4 dan 3DES.
HTTPS (HTTP Secure) — adalah HTTP melalui TLS. Ketika aplikasi mobile membuat permintaan melalui https://, pertama-tama ia membuat koneksi TLS dengan server, kemudian mengirimkan header HTTP dan body permintaan melalui saluran terenkripsi. Tanpa HTTPS, tidak ada API serius yang boleh berfungsi — ini adalah higiene keamanan dasar. Menurut OWASP (2026), koneksi tidak aman termasuk dalam 3 kerentanan teratas aplikasi mobile.
TLS Handshake — proses pembentukan koneksi aman antara klien dan server. Para pihak menyepakati versi protokol, memilih cipher suite, bertukar kunci melalui kriptografi asimetris, dan memverifikasi sertifikat. Dalam TLS 1.2, handshake memerlukan 2 Round Trip Time (2 RTT): klien → server dengan ClientHello, server → klien dengan ServerHello dan Certificate, kemudian pesan akhir Finished. TLS 1.3 mempersingkat proses ini menjadi 1 RTT.
Tahap pertama: ClientHello — klien mengirimkan versi TLS yang didukung, daftar cipher suite, dan angka acak. Server merespons dengan ServerHello, memilih versi dan cipher suite, mengirimkan sertifikat X.509-nya (Certificate) dan pesan ServerHelloDone. Klien memverifikasi sertifikat melalui rantai otoritas sertifikasi tepercaya (CA), menghasilkan pre-master secret, mengenkripsinya dengan kunci publik dari sertifikat, dan mengirimkannya ke server dalam ClientKeyExchange. Setelah itu, kedua pihak menghasilkan kunci sesi dan bertukar pesan ChangeCipherSpec dan Finished. Sejak saat ini, semua data dienkripsi secara simetris.
import Security
let url = URL(string: "https://api.example.com")!
let session = URLSession(configuration: .default,
delegate: self,
delegateQueue: nil)
func urlSession(
_ session: URLSession,
didReceive challenge: URLAuthenticationChallenge,
completionHandler: @escaping (URLSession.AuthChallengeDisposition,
URLCredential?) -> Void
) {
let trust = challenge.protectionSpace.serverTrust
guard let trust else {
completionHandler(.cancelAuthenticationChallenge, nil)
return
}
completionHandler(.useCredential, URLCredential(trust: trust))
}
Contoh penanganan URLAuthenticationChallenge di iOS melalui URLSessionDelegate. Metode ini dipanggil pada setiap TLS Handshake, memungkinkan aplikasi untuk memverifikasi sertifikat server secara khusus. Untuk produksi, tambahkan verifikasi sertifikat melalui SecTrustEvaluateWithError dan bandingkan dengan sidik jari yang disimpan sebelumnya — hanya setelah itu panggil useCredential.
TLS 1.3 (RFC 8446, 2018) — pembaruan besar pertama protokol dalam 10 tahun. Peningkatan utama: handshake dikurangi menjadi 1 RTT (0 RTT untuk koneksi ulang), cipher suite usang (RSA key exchange, CBC-mode) dihapus, forward secrecy wajib (PFS), dan perlindungan terhadap serangan downgrade melalui signed transcript. Menurut Qualys SSL Labs (2026), TLS 1.3 memberikan perlindungan bahkan saat kunci jangka panjang server dikompromikan berkat PFS.
| Karakteristik | TLS 1.2 | TLS 1.3 |
|---|---|---|
| Handshake | 2 RTT (penuh) | 1 RTT (0 RTT dengan PSK) |
| Cipher suite | 30+ kombinasi (RSA, DH, ECDH) | 5 suite AEAD (AES-GCM, ChaCha20) |
| Forward Secrecy | Opsional (DHE, ECDHE) | Wajib (semua suite) |
| Dukungan iOS | iOS 5+ | iOS 12+ |
| Dukungan Android | Android 4.0+ | Android 10+ |
| Algoritma usang | RSA, CBC, RC4, 3DES | Dihapus sepenuhnya |
0-RTT (Zero Round Trip Time) — fitur TLS 1.3 yang memungkinkan klien mengirim data segera bersama ClientHello saat koneksi ulang melalui PSK (Pre-Shared Key). Ini mempercepat pemuatan layar berikutnya dalam aplikasi mobile, terutama saat sering mengirim permintaan ke server yang sama. Namun, data 0-RTT tidak dilindungi dari serangan replay — dapat dicegat dan dikirim ulang. Gunakan 0-RTT hanya untuk permintaan idempoten (GET, PUT) tanpa efek samping.
App Transport Security (ATS) — mekanisme Apple yang mewajibkan koneksi HTTPS dengan TLS 1.2 atau lebih tinggi, diaktifkan secara default sejak iOS 9. ATS memblokir semua koneksi HTTP dan HTTPS dengan TLS di bawah 1.2. Pengembang dapat mengonfigurasi pengecualian di Info.plist melalui NSAppTransportSecurity untuk domain tertentu, tetapi Apple merekomendasikan untuk meminimalkan pengecualian dan menggunakan HTTPS di mana saja. Pelanggaran persyaratan ATS adalah alasan penolakan aplikasi saat review App Store.
<!-- Info.plist — App Transport Security -->
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<false/>
<key>NSExceptionDomains</key>
<dict>
<key>cdn.example.com</key>
<dict>
<key>NSExceptionAllowsInsecureHTTPLoads</key>
<false/>
<key>NSExceptionMinimumTLSVersion</key>
<string>TLSv1.2</string>
</dict>
</dict>
<key>NSAllowsLocalNetworking</key>
<true/>
</dict>
Konfigurasi ATS di Info.plist. NSAllowsArbitraryLoads diatur ke false — semua koneksi harus menggunakan HTTPS. Untuk domain cdn.example.com, versi minimum TLS 1.2 ditetapkan, NSAllowsLocalNetworking=true mengizinkan HTTP untuk jaringan lokal (berguna untuk server pengembangan). Apple sangat merekomendasikan untuk tidak mengaktifkan NSAllowsArbitraryLoads tanpa NSExceptionDomains — ini harus berupa pengecualian, bukan aturan umum.
Network Security Config — mekanisme Android untuk mengonfigurasi HTTPS dan TLS tanpa mengubah kode Java/Kotlin. Konfigurasi didefinisikan dalam file XML network_security_config.xml dan dihubungkan di AndroidManifest melalui atribut android:networkSecurityConfig. Mendukung konfigurasi sertifikat tepercaya (user dan system CA), Certificate Pinning, menonaktifkan HTTP teks biasa, override debug, dan pengalihan lalu lintas.
<!-- res/xml/network_security_config.xml -->
<network-security-config>
<base-config cleartextTrafficPermitted="false">
<trust-anchors>
<certificates src="system" />
</trust-anchors>
</base-config>
<domain-config cleartextTrafficPermitted="false">
<domain includeSubdomains="true">api.example.com</domain>
<pin-set expiration="2027-01-01">
<pin digest="SHA-256">
47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=
</pin>
</pin-set>
</domain-config>
</network-security-config>
Network Security Config untuk Android. Base-config melarang lalu lintas teks biasa dan hanya mempercayai sertifikat CA sistem (tanpa sertifikat pengguna — perlindungan terhadap instalasi sertifikat MitM oleh pengguna). Domain-config untuk api.example.com berisi pin-set dengan sidik jari SHA-256 sertifikat. Jika sertifikat server berubah sebelum tanggal kedaluwarsa yang ditentukan, koneksi akan ditolak — ini adalah bentuk ketat dari Certificate Pinning.
Certificate Pinning — teknik menetapkan sertifikat atau kunci publik server dalam kode aplikasi. Pada setiap TLS Handshake, klien membandingkan sertifikat server dengan sidik jari yang disimpan sebelumnya (hash SHA-256). Bahkan jika penyerang memperoleh sertifikat CA tepercaya atau mengompromikan otoritas sertifikasi, ia tidak dapat melakukan serangan MitM — aplikasi memeriksa sidik jari spesifik, bukan rantai CA. Ini sangat penting untuk aplikasi keuangan dan aplikasi dengan data sensitif.
Certificate Pinning memerlukan kehati-hatian: saat sertifikat berubah di server, semua versi lama aplikasi tidak akan dapat terhubung. Disarankan untuk menyimpan beberapa sidik jari cadangan (utama + cadangan), menentukan tanggal kedaluwarsa pin-set, dan mengimplementasikan mekanisme fallback melalui verifikasi CA standar. Alternatifnya — Trust On First Use (TOFU), ketika aplikasi mengingat sertifikat pada koneksi pertama dan memperingatkan pengguna saat terjadi perubahan. Menurut OWASP (2026), tidak adanya Certificate Pinning termasuk dalam 3 kerentanan teratas aplikasi mobile (M3: Insecure Communication).
Di Alamofire 5+, Certificate Pinning dikonfigurasikan melalui ServerTrustManager dengan PinnedCertificatesTrustEvaluator (memeriksa seluruh sertifikat) atau PublicKeysTrustEvaluator (hanya kunci publik). Kunci publik lebih disukai — tidak berubah saat pembaruan sertifikat di CA yang sama. Buat ServerTrustManager dengan kamus [host: evaluator], berikan ke Session, dan gunakan untuk semua permintaan ke API yang dilindungi.
Pertanyaan yang sering diajukan
SSL — protokol usang (versi 2.0 dan 3.0), dinyatakan tidak aman karena kerentanan POODLE dan BEAST. TLS — penerusnya, mulai dari TLS 1.0 (RFC 2246, 1999). Setiap “sertifikat SSL” modern adalah sertifikat X.509 yang digunakan oleh protokol TLS. SSL 3.0 dilarang di semua sistem operasi dan browser modern.
App Transport Security — persyaratan Apple untuk keamanan aplikasi. HTTP mengirimkan data sebagai teks biasa, memungkinkan penyadapan token dan data pribadi pengguna di jaringan Wi-Fi publik. ATS secara default memblokir HTTP dan HTTPS dengan TLS di bawah 1.2, melindungi pengguna bahkan tanpa tindakan pengembang.
Gunakan SSL Labs (ssllabs.com/ssltest) atau baris perintah: openssl s_client -tls1_3 -connect example.com:443. Di sebagian besar platform cloud (AWS CloudFront, Cloudflare, Nginx 1.19+, Caddy), TLS 1.3 diaktifkan secara default. Di Android 10+, dukungan sudah tertanam di penyedia sistem Conscrypt.
Self-Signed Certificate — sertifikat yang ditandatangani sendiri, bukan oleh otoritas sertifikasi. Tidak dapat digunakan di produksi — sistem operasi mobile tidak mempercayai sertifikat semacam itu. Digunakan untuk pengembangan lokal: tambahkan sertifikat ke tepercaya melalui MDM atau gunakan build debug dengan verifikasi dinonaktifkan.
Buat ServerTrustManager dengan PinnedCertificatesTrustEvaluator atau PublicKeysTrustEvaluator. Yang pertama memeriksa seluruh sertifikat, yang kedua hanya kunci publik (lebih disukai). Berikan manajer ke Session(configuration: serverTrustManager:) dan gunakan sesi untuk semua permintaan ke API.
Kesimpulan
Kami akan mengembangkan aplikasi seluler turnkey
IT Sectr membuat aplikasi iOS dan Android untuk startup dan bisnis sejak 2017. Kami akan memberi saran dan mengusulkan solusi terbaik.
Baca juga