Memahami peran scopes dalam OAuth 2.0 dan Keycloak: scope standar dan kustom, client scopes default vs optional, alur layar consent, serta praktik terbaik menerapkan prinsip least privilege di aplikasi.

Di episode 7 kalian mengelola token: refresh, rotasi, dan revoke. Episode 8 ini menjawab pertanyaan yang lebih mendasar: data apa yang boleh diambil aplikasi dari akun user, dan siapa yang memutuskan? Jawabannya ada di dua mekanisme OAuth 2.0 yang saling berkaitan — scope untuk membatasi permintaan, dan consent untuk persetujuan user.
Scope adalah label permintaan izin yang dikirim aplikasi saat meminta token. Saat aplikasi meminta profile, dia sedang berkata: "saya butuh data profil user". Keycloak lalu memetakan scope itu ke serangkaian claims lewat protocol mappers.
Di Keycloak, scope tidak dideklarasikan sendiri-sendiri di dalam client, melainkan dibungkus sebagai client scope — kumpulan mapper yang bisa dipakai ulang oleh banyak client. Klien cukup menunjuk client scope mana yang dibutuhkan.
Beberapa scope sudah tersedia bawaan di realm:
name, given_name, dan family_name.email dan email_verified.curl -X POST "https://kc.example.com/realms/my-realm/protocol/openid-connect/token" \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "grant_type=authorization_code" \
-d "client_id=my-app" \
-d "client_secret=4f9a2c8d..." \
-d "code=1c2a3b..." \
-d "redirect_uri=https://app.example.com/callback" \
-d "scope=openid profile email"scope=openid profile email di atas meminta tiga scope sekaligus. Perhatikan bahwa openid selalu wajib untuk alur OIDC — tanpanya, Keycloak tidak mengeluarkan ID token.
Selain scope bawaan, kalian bisa membuat client scope sendiri:
user-details, dan pilih tipe Optional.Hasilnya bisa terlihat di payload token:
{
"scope": "openid profile email user-details",
"preferred_username": "budi",
"department": "engineering"
}Keycloak juga mendukung dynamic scopes — scope yang membawa nilai dinamis, seperti number_format:ID atau language:ja, yang memicu mapper khusus di realm. Fitur ini diaktifkan di Realm settings, cocok untuk layanan yang butuh parameterisasi scope seperti pencetakan dokumen atau terjemahan.
Scope dan role sering tertukar. Keduanya memang sama-sama label, tetapi posisinya berbeda:
| Aspek | Scope | Role |
|---|---|---|
| Pertanyaan yang dijawab | Data apa yang boleh diakses? | Aksi apa yang boleh dilakukan? |
| Pemegang keputusan | User melalui consent | Admin melalui pemberian role |
| Lokasi di Keycloak | Client scopes | Roles di realm atau client |
| Muncul di token | Di claim scope | Di realm_access atau resource_access |
Analoginya: scope adalah izin melihat dokumen, role adalah izin menandatangani dokumen. Aplikasi perlu keduanya bekerja bersama.
Saat mengatur client, tab Client scopes memiliki dua kategori lampiran:
scope.scope.Pola umum: masukkan openid, profile, dan email sebagai default, dan jadikan scope dengan data sensitif sebagai optional. Dengan begitu client yang tidak butuh data itu tidak akan mendapatkannya secara diam-diam.
Ketika client mencentang Consent required, Keycloak menampilkan layar consent setelah login berhasil. Di layar itu user melihat daftar izin yang diminta — misalnya "Lihat email Anda" dan "Lihat profil Anda" — dan memilih Yes atau No. Ini adalah momen di mana user memegang kendali atas datanya sendiri.
Tip
Judul dan deskripsi di layar consent diambil dari atribut client yang diatur di tab Settings — khususnya Display name dan Consent screen text. Tulis deskripsi yang jelas dan jujur; user yang bingung akan menolak atau, lebih buruk, asal klik.
Alur consent hanya berjalan satu kali per user dan client selama pemberian masih berlaku. Setelah user menyetujui, request berikutnya dianggap sudah diauthorized — Keycloak menyebut client itu sebagai pre-authorized untuk user tersebut. Jika kalian ingin konsistensi UI tertentu atau client internal yang dipercaya penuh, ada pengaturan untuk melewati layar consent sepenuhnya.
Consent bukan keputusan sekali dan selamanya. User bisa mencabutnya kapan saja:
Setelah consent dicabut, client harus meminta izin ulang pada kunjungan berikutnya — efek yang sama dengan logout, tetapi khusus untuk lingkup data.
Scope hanya berguna jika ditegakkan. Di sisi Keycloak dan aplikasi:
aud token ke client yang tepat lewat Audience mapper, sehingga token tidak dipakai lintas aplikasi di luar peruntukannya.Empat kebiasaan yang menjaga scope tetap sehat di produksi:
Di episode 8 ini kalian memahami scopes dan consent: definisi scope dan client scope, scope standar OIDC, scope kustom dan dynamic scopes, perbedaan scope dengan role, client scopes default vs optional, alur layar consent, pengelolaan consent oleh user dan admin, serta penegakan dan praktik terbaiknya.
Inti yang harus dibawa pulang:
Di episode 9 berikutnya kita naik ke lapisan di atas OAuth 2.0: OpenID Connect — protokol yang mengubah otorisasi murni menjadi autentikasi terstandar dengan ID token dan discovery mechanism.