Episode ini membahas autentikasi dan otorisasi di aplikasi Swift: implementasi alur OAuth 2.0 dan OpenID Connect, integrasi Sign in with Apple, pengelolaan access token dan refresh token, serta konsumsi API yang aman dengan memperhatikan HTTP security headers dan keamanan sesi.

Autentikasi membuktikan siapa pengguna; otorisasi menentukan apa yang boleh mereka lakukan. Episode 12 membahas authentication dan authorization di aplikasi Swift: alur OAuth 2.0 dan OpenID Connect, integrasi Sign in with Apple, serta pengelolaan token yang benar.
Kesalahan paling umum di lapangan bukan di bagian login, melainkan di pengelolaan token setelahnya — token disimpan di tempat salah, kedaluwarsa tidak ditangani, atau refresh dilakukan tanpa perlindungan. Episode ini membangun kebiasaan yang benar sejak awal.
OAuth 2.0 adalah kerangka otorisasi, sedangkan OpenID Connect (OIDC) menambahkan lapisan autentikasi di atasnya. Alur Authorization Code dengan PKCE adalah pola standar untuk aplikasi mobile:
Kode pertukaran bisa diuji langsung dengan curl:
curl -X POST https://auth.example.com/token \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "grant_type=authorization_code" \
-d "code=AUTH_CODE" \
-d "client_id=CLIENT_ID" \
-d "redirect_uri=myapp://callback"curl -X POST ... -d "grant_type=authorization_code" menukar authorization code dengan token. Di mobile, alur ini dijalankan melalui ASWebAuthenticationSession yang membuka login di browser teraman milik sistem.
Access token dikirim lewat header Authorization:
var request = URLRequest(url: url)
request.httpMethod = "GET"
request.setValue("Bearer \(token)", forHTTPHeaderField: "Authorization")
request.setValue("application/json", forHTTPHeaderField: "Accept")
let (data, response) = try await URLSession.shared.data(for: request)request.setValue("Bearer \(token)", forHTTPHeaderField: "Authorization") mengautentikasi request. Format Bearer adalah standar OAuth 2.0. Access token berumur pendek — biasa 15 menit hingga 1 jam — untuk membatasi dampak bila bocor.
Sign in with Apple adalah penyedia identitas bawaan yang memudahkan login tanpa password. Pengguna hanya perlu Face ID atau Touch ID, dan akun terautentikasi langsung. Fitur pembeda utamanya: hidupkan tombol satu kali login dengan Email Relay dan tombol nonaktifkan.
Integrasi dasar melibatkan dua pihak:
ASAuthorizationAppleIDButton, hasil autentikasi berupa identity token dan authorization code.Identity token yang diterima client adalah JWT yang ditandatangani Apple:
echo "$IDENTITY_TOKEN" | cut -d. -f2 | base64 -decho "$IDENTITY_TOKEN" | cut -d. -f2 | base64 -d mendekode payload JWT untuk melihat klaim seperti sub, email, dan email_verified. Jangan pernah mempercayai token tanpa memverifikasi tanda tangan dan issuer di sisi server.
Access token disimpan di Keychain (episode 11), bukan UserDefaults. Refresh token — yang jauh lebih sensitif karena berumur panjang — juga di Keychain, idealnya dengan akses terbatas:
func tokenBaru() async throws -> String {
var request = URLRequest(url: URL(string: "https://auth.example.com/token")!)
request.httpMethod = "POST"
request.setValue("application/x-www-form-urlencoded",
forHTTPHeaderField: "Content-Type")
let body = "grant_type=refresh_token&refresh_token=\(refreshToken)"
request.httpBody = Data(body.utf8)
let (data, _) = try await URLSession.shared.data(for: request)
let hasil = try JSONDecoder().decode(TokenResponse.self, from: data)
return hasil.accessToken
}"grant_type=refresh_token&refresh_token=\(refreshToken)" menukar refresh token dengan access token baru. Saat request API gagal dengan status 401, aplikasi melakukan refresh sekali lalu mengulang request — pola yang menjaga pengguna tetap login tanpa interupsi.
Beberapa aturan kunci keamanan sesi:
Untuk web server, perhatikan juga security headers seperti Strict-Transport-Security dan X-Content-Type-Options — kebiasaan yang akan kita dalamkan di episode 13.
Warning
Jangan pernah menyimpan token di UserDefaults. Perangkat yang di-root atau di-jailbreak bisa mengekstraknya; Keychain dengan access control yang tepat memberikan lapisan perlindungan tambahan.
Konsumsi API yang aman berarti memvalidasi setiap respons — bukan hanya status HTTP, tetapi juga struktur data dan nilai di dalamnya. Gunakan tipe response yang ketat dengan Codable, dan jangan menampilkan data yang tidak diharapkan. Sertakan klaim otorisasi dalam model: hanya ambil data yang memang menjadi hak pengguna.
Di sisi aplikasi, pantau pola 401 yang tiba-tiba meningkat sebagai sinyal token bocor atau sesi di-revoke. Gabungkan ini dengan logging terstruktur (episode 21) agar tim bisa mendeteksi penyalahgunaan lebih awal.
Inti yang harus dibawa pulang:
Bearer di header Authorization.Di episode 13 selanjutnya kita akan membahas networking security dan best practices — HTTPS dan TLS, certificate pinning, konfigurasi jaringan yang aman di iOS dan macOS, API request signing, secure headers, serta observability untuk kegagalan jaringan dan kebijakan retry. Jaringan kalian akan menjadi benteng!