Worksheet Review Keamanan OAuth 2.0 dan OpenID Connect
Binding transaksi dari callback sampai refresh
Modelkan satu transaksi browser dari authorization request sampai logout. Simpan issuer, client ID, redirect URI exact, state, nonce saat OIDC memakainya, PKCE challenge, dan binding sesi browser. RFC 9700 meminta perbandingan redirect URI exact kecuali penanganan native loopback yang disebutkan; aturan prefix seperti https://app.example/callback?next= mengubah callback menjadi jalur kebocoran code. Klien publik memakai PKCE dengan challenge S256 dan verifier sekali pakai.
Uji callback dengan state hilang, state dari browser lain, code dipakai ulang, issuer salah, audience salah, nonce diubah, dan parameter redirect yang meminta tujuan eksternal. Semuanya harus berhenti sebelum pertukaran token atau pembuatan sesi lokal. Kumpulkan URL authorize tersamarkan, callback, hasil token, konfigurasi klien terdaftar, metadata issuer, dan keputusan server. Pastikan code serta token tidak masuk log aplikasi, URL referrer, atau riwayat browser.
Penanganan refresh memerlukan penutupan tersendiri: refresh token klien publik harus sender-constrained atau diputar menurut RFC 9700. Putar ulang refresh token lama dan verifikasi family revocation atau respons keamanan yang diharapkan. Perbaikan mendaftarkan URI exact, mengonsumsi data transaksi, mengikat metadata issuer, dan menolak binding rusak. Pengecualian federasi butuh aturan account linking terdokumentasi; pengecualian tidak membenarkan penerimaan token hanya karena signature valid.
Pisahkan kepercayaan authorization server dari account linking aplikasi. ID token hanya mengidentifikasi subjek setelah issuer, audience, nonce, serta signature divalidasi; menghubungkannya ke akun lokal yang ada memerlukan aturan produk eksplisit dan penanganan collision. Uji juga ekspektasi logout: penghapusan sesi lokal mungkin tidak mengakhiri sesi provider, dan perbedaan itu harus terlihat pada desain. Jangan menerima resource-owner password grant sebagai jalan pintas; RFC 9700 menyatakan grant tersebut tidak boleh digunakan.
Mengikat satu transaksi otorisasi
Review OAuth sebagai urutan binding, bukan tombol “masuk”. Sebelum redirect, server menyimpan issuer terkonfigurasi, client ID, redirect URI exact, referensi sesi browser, state acak, challenge PKCE, metode challenge, serta nonce OIDC saat ID token diharapkan. RFC 9700 menetapkan pencocokan redirect URI exact kecuali penanganan port loopback native yang disebutkan. Aturan prefix seperti https://app.example/callback?next= dapat membocorkan code melalui penerus tak diinginkan. Klien publik memakai authorization code dengan PKCE; gunakan S256, bukan verifier yang terlihat pada authorization request.
Jalankan authorization request normal lalu simpan capture request serta callback yang tersamarkan. Setelah itu kirim callback dengan state hilang, state dari browser lain, state dipakai ulang, code untuk klien lain, verifier PKCE berubah, code kedaluwarsa, issuer salah, audience salah, nonce berubah, dan tujuan setelah login dari pemanggil. Setiap kasus tidak valid harus berhenti sebelum pertukaran token atau pembuatan sesi lokal. Hasil yang diharapkan adalah error terkendali atau mulai ulang, bukan sesi dari validasi parsial. Parameter callback tidak boleh menjadi open redirect.
Hasil token dan akun
Pada pertukaran token, verifikasi code sekali pakai dan terikat ke klien terdaftar. Untuk OIDC, validasi signature memakai key issuer tepercaya, iss, aud, claim waktu, serta nonce sebelum memakai claim subjek. ID token tidak otomatis menjadi access token API; resource server memvalidasi audience serta scope access token sendiri. Account linking memerlukan aturan produk eksplisit untuk tabrakan email atau subjek yang ada. Dukungan federasi tidak membenarkan mempercayai assertion hanya karena kriptografi valid.
Uji refresh secara terpisah. RFC 9700 mengharuskan refresh token klien publik sender-constrained atau memakai rotasi. Tukarkan refresh token, lalu putar ulang token pendahulunya. Amati family revocation atau respons keamanan yang ditetapkan, hasil sesi lokal, dan event audit. Catat versi metadata issuer, penanganan key set, pendaftaran redirect, lifecycle penyimpanan transaksi, serta semua hasil tanpa mencatat code, token, verifier, atau nonce.
Logout dan penutupan
Logout lokal menghapus sesi lokal; tindakan itu mungkin tidak mengakhiri sesi provider. Uji tombol kembali, login tab baru, return URL yang diizinkan, dan logout saat provider gagal agar perilaku produk disengaja. Hapus state, nonce, serta verifier setelah sukses, gagal, timeout, dan pembatalan. Perbaiki dengan pendaftaran URI exact, penyimpanan transaksi terikat server, enforcement PKCE, pematokan issuer, dan validasi callback ketat. Pengecualian migrasi sementara menyebut issuer, klien, redirect, expiry, serta test yang membuktikan kredensial tidak dapat diteruskan. Penutupan menjalankan ulang kasus state lintas browser dan refresh token lama memakai akun sintetis baru.
Bukti pendaftaran redirect
Ekspor redirect URI terdaftar dari authorization server lalu bandingkan byte-per-byte dengan konfigurasi klien. Sertakan scheme, host, path, encoding, dan penanganan loopback native. Uji variasi huruf host, segmen path tambahan, parameter query, fragment, serta trik user-info; tidak satu pun boleh menerima code. Bila banyak issuer didukung, ikat tiap transaksi browser ke issuer tujuan lalu uji callback dari issuer lain. Simpan ekspor pendaftaran dan timestamp test tersamarkan sebagai bukti review.
Artefak transaksi
| Pemeriksaan | Owner | Status | Bukti | Hasil yang diharapkan | Hasil aktual | Pengecualian | Penutupan |
|---|---|---|---|---|---|---|---|
OIDC-CB-05 state callback lintas browser | owner autentikasi | Lulus | ID authorize/callback tersamarkan, trace penyimpanan transaksi, query sesi | callback berhenti sebelum pertukaran token; tanpa sesi lokal | restart terkendali dikembalikan; nol request token dan nol row sesi | tidak ada | simpan hash capture dan ulang setelah perubahan callback atau penyimpanan transaksi |
OAUTH-RT-04 replay refresh pendahulu | owner identitas mobile | Terbuka | event audit keluarga token dan timestamp replay tersamarkan | replay pendahulu memicu respons keluarga yang ditetapkan | replay ditolak tetapi token saudara masih aktif | EX-22, migrasi klien lama berakhir 2026-07-15 dengan lifetime dipersingkat | aktifkan pencabutan keluarga, replay pendahulu, verifikasi token saudara ditolak dan event audit tercatat |