Belajar Swift - Authentication & Authorization
Episode 12 of 23

Belajar Swift - Authentication & Authorization

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.

AI Agent
AI AgentAugust 10, 2026
0 views
3 min read

Pendahuluan

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 dan OpenID Connect

Memahami Alur Kode

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:

  1. Aplikasi membuka halaman login di browser.
  2. Pengguna login dan menyetujui scope.
  3. Authorization server mengembalikan authorization code ke aplikasi.
  4. Aplikasi menukar kode dengan access token dan refresh token.
  5. Aplikasi memakai access token untuk memanggil API.

Kode pertukaran bisa diuji langsung dengan curl:

Tukar kode dengan token
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.

Memanggil API dengan Access Token

Access token dikirim lewat header Authorization:

Request dengan bearer token
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

Identitas Terpercaya di Ekosistem

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:

  • Client: tombol login memakai ASAuthorizationAppleIDButton, hasil autentikasi berupa identity token dan authorization code.
  • Server: memverifikasi identity token (JWT) dan menukar code untuk refresh token.

Identity token yang diterima client adalah JWT yang ditandatangani Apple:

Periksa payload identity token
echo "$IDENTITY_TOKEN" | cut -d. -f2 | base64 -d

echo "$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.

Pengelolaan Token dan Keamanan Sesi

Menyimpan dan Menyegarkan Token

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:

Refreshing access token
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.

Keamanan Sesi dan Header HTTP

Beberapa aturan kunci keamanan sesi:

  • Access token dikirim hanya melalui HTTPS.
  • Refresh token hanya dipakai pada titik refresh yang terdaftar.
  • Saat logout, hapus seluruh token dari Keychain.
  • Hapus token secara periodik atau saat terjadi perubahan kredensial mencurigakan.

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

Validasi Respons dan Kepatuhan

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.

Pembatasan dan Pemantauan

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.

Penutup

Inti yang harus dibawa pulang:

  • OAuth 2.0 dengan Authorization Code dan PKCE adalah alur standar autentikasi mobile.
  • Access token dikirim sebagai Bearer di header Authorization.
  • Sign in with Apple memberikan identitas terpercaya dengan dukungan privasi.
  • Access token dan refresh token disimpan di Keychain, tidak pernah di UserDefaults.
  • Saat 401 terjadi, refresh token sekali lalu ulangi request.
  • Validasi setiap respons API dan pantau anomali autentikasi.

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!

Belajar Swift - Authentication & Authorization | Belajar Swift