Pengantar

OAuth telah menjadi standar autentikasi yang digunakan oleh berbagai layanan populer seperti Google, GitHub, Microsoft, hingga Facebook. Melalui OAuth, pengguna dapat masuk ke aplikasi tanpa harus membuat akun baru atau membagikan kata sandi kepada layanan pihak ketiga.

Namun, di balik kemudahan tersebut terdapat berbagai risiko keamanan yang harus diperhatikan oleh pengembang. Salah satu komponen yang sering dianggap sepele tetapi memiliki peran sangat penting adalah OAuth State Parameter.

Banyak pengembang hanya fokus pada proses mendapatkan access token, tetapi mengabaikan validasi parameter state. Padahal, kesalahan kecil ini dapat membuka celah bagi serangan seperti Cross-Site Request Forgery (CSRF) hingga Login CSRF, yang memungkinkan penyerang memanipulasi proses autentikasi pengguna.

Lalu, apa sebenarnya OAuth State Parameter dan mengapa penggunaannya sangat penting?


Apa Itu OAuth State Parameter?

OAuth State Parameter merupakan nilai acak (random string) yang dikirim oleh aplikasi (client) saat mengarahkan pengguna menuju halaman otorisasi penyedia identitas (Identity Provider). Setelah pengguna berhasil melakukan autentikasi, penyedia identitas akan mengembalikan nilai state tersebut bersama authorization code ke aplikasi  (dikutip dari: https://auth0.com/docs/secure/attack-protection/state-parameters)..

Tujuan utamanya adalah memastikan bahwa permintaan autentikasi yang diterima memang berasal dari sesi yang sama dan bukan hasil manipulasi pihak lain.

Secara sederhana, alurnya adalah sebagai berikut:

  1. Aplikasi membuat nilai state secara acak.
  2. Nilai tersebut disimpan pada sesi pengguna.
  3. Pengguna diarahkan ke halaman login OAuth.
  4. Setelah login berhasil, penyedia identitas mengembalikan nilai state.
  5. Aplikasi membandingkan nilai yang dikembalikan dengan nilai yang tersimpan.
  6. Jika sama, proses login dilanjutkan. Jika berbeda, autentikasi harus ditolak.

Mekanisme sederhana ini menjadi lapisan perlindungan yang sangat efektif terhadap berbagai serangan.

baca juga : Log Crushing & Tampering: Cara Penyerang Menyembunyikan Jejak Aktivitas di Sistem


Mengapa OAuth State Parameter Sangat Penting?

Banyak pengembang menganggap parameter ini hanya sebagai data tambahan. Padahal, keberadaannya merupakan salah satu mekanisme keamanan utama dalam implementasi OAuth.

Beberapa alasan pentingnya antara lain:

  • Mencegah serangan CSRF pada proses autentikasi.
  • Memastikan respons berasal dari permintaan yang benar.
  • Menghindari penyalahgunaan sesi login.
  • Menjamin integritas proses autentikasi OAuth.

Tanpa validasi parameter state, aplikasi tidak memiliki cara untuk memastikan apakah respons OAuth benar-benar dikirim sebagai balasan dari permintaan pengguna yang sah.


Bagaimana OAuth State Parameter Mencegah Serangan CSRF?

Apa Itu CSRF?

Cross-Site Request Forgery (CSRF) merupakan teknik serangan yang memanfaatkan sesi pengguna yang masih aktif agar korban tanpa sadar menjalankan permintaan yang diinginkan penyerang.

Dalam konteks OAuth, penyerang dapat mengirimkan tautan autentikasi yang telah dimodifikasi sehingga korban tanpa sadar masuk menggunakan akun milik penyerang.

Akibatnya:

  • Data pengguna dapat tercampur.
  • Korban masuk ke akun yang salah.
  • Informasi pribadi dapat terekspos.
  • Integrasi akun menjadi tidak valid.

Dengan adanya validasi state, aplikasi dapat mendeteksi bahwa respons tersebut tidak berasal dari permintaan autentikasi yang sah sehingga proses login langsung dibatalkan.


Contoh Sederhana Proses OAuth dengan State Parameter

Misalkan sebuah aplikasi ingin mengizinkan pengguna masuk menggunakan akun Google.

Langkah 1: Generate State

Aplikasi membuat nilai acak seperti:

state = d7f82ab918cd45ef

Nilai ini kemudian disimpan pada session atau cookie.


Langkah 2: Redirect ke Authorization Server

URL yang dikirim misalnya:

https://accounts.google.com/o/oauth2/auth?
client_id=CLIENT_ID
&response_type=code
&state=d7f82ab918cd45ef

Langkah 3: User Login

Pengguna berhasil login melalui Google.


Langkah 4: Callback

Google mengembalikan:

https://example.com/callback?
code=AUTHORIZATION_CODE
&state=d7f82ab918cd45ef

Langkah 5: Validasi

Server membandingkan:

State dari callback
=

State yang tersimpan di session

Jika sama:

✅ Login berhasil.

Jika berbeda:

❌ Login ditolak.


Risiko Jika Tidak Menggunakan State Parameter

Mengabaikan parameter state dapat menyebabkan berbagai kerentanan keamanan.

Beberapa risiko yang dapat terjadi antara lain:

Login CSRF

Korban dapat dipaksa masuk ke akun milik penyerang tanpa disadari.

Session Fixation

Penyerang dapat memanfaatkan sesi yang sudah dipersiapkan sebelumnya sehingga korban menggunakan sesi yang telah dikendalikan.

Authorization Code Injection

Authorization Code yang tidak berasal dari pengguna asli dapat diterima oleh aplikasi apabila tidak ada validasi state.

Penyalahgunaan Akun

Integrasi akun pihak ketiga dapat menjadi tidak valid sehingga informasi pengguna menjadi bercampur dengan akun lain.

baca juga : Return-Oriented Programming: Teknik Eksploitasi yang Memanfaatkan Potongan Kode Program


Best Practice Menggunakan OAuth State Parameter

Agar implementasi OAuth tetap aman, berikut beberapa praktik terbaik yang direkomendasikan.

Gunakan Nilai Acak yang Sulit Ditebak

State sebaiknya dihasilkan menggunakan Cryptographically Secure Random Number Generator (CSPRNG).

Hindari penggunaan:

  • Timestamp
  • Nomor urut
  • Username
  • ID pengguna

Karena semuanya relatif mudah diprediksi.

Selain menghasilkan nilai state yang unik dan sulit ditebak, standar keamanan OAuth juga merekomendasikan agar parameter tersebut divalidasi sebelum proses pertukaran authorization code menjadi access token. Rekomendasi ini merupakan bagian dari praktik terbaik implementasi OAuth 2.0 yang dijelaskan dalam OAuth 2.0 Security Best Current Practice (dikutip dari: https://datatracker.ietf.org/doc/html/rfc9700).


Simpan State Secara Aman

Simpan state pada:

  • Server Session
  • Secure Cookie
  • Penyimpanan sesi yang terenkripsi

Jangan menyimpannya di lokasi yang dapat dimodifikasi pengguna.


Validasi Sebelum Menukar Authorization Code

Pastikan pengecekan state dilakukan sebelum aplikasi menukarkan authorization code menjadi access token.

Urutan validasi yang benar adalah:

  1. Periksa state.
  2. Jika valid, tukarkan authorization code.
  3. Ambil access token.

Gunakan HTTPS

Seluruh proses OAuth harus berjalan menggunakan HTTPS untuk mencegah penyadapan data selama proses autentikasi.


Jangan Menggunakan State yang Sama Berulang Kali

Setelah proses login selesai, buat state baru untuk autentikasi berikutnya.

State yang digunakan berulang kali dapat meningkatkan risiko serangan replay attack.


Perbedaan OAuth State dan PKCE

Banyak pengembang masih menganggap bahwa PKCE dapat menggantikan fungsi state. Padahal, keduanya memiliki tujuan yang berbeda.

OAuth State PKCE
Melindungi dari CSRF Melindungi Authorization Code
Memastikan request berasal dari sesi yang benar Mencegah pencurian Authorization Code
Digunakan pada semua implementasi OAuth Sangat direkomendasikan terutama untuk aplikasi publik seperti mobile dan SPA

Artinya, penggunaan PKCE tidak menghilangkan kebutuhan untuk menggunakan State Parameter. Keduanya justru saling melengkapi untuk meningkatkan keamanan implementasi OAuth.


Kesalahan yang Sering Dilakukan Pengembang

Beberapa kesalahan implementasi yang masih sering ditemukan adalah:

  • Tidak mengirim parameter state sama sekali.
  • Mengirim state tetapi tidak melakukan validasi.
  • Menggunakan nilai state yang mudah ditebak.
  • Menggunakan state yang sama untuk semua pengguna.
  • Menyimpan state pada lokasi yang dapat dimodifikasi oleh klien.
  • Menganggap PKCE sudah cukup sehingga mengabaikan state.

Kesalahan-kesalahan tersebut dapat membuka peluang bagi penyerang untuk mengeksploitasi proses autentikasi.

baca juga : Cross-Origin Resource Sharing (CORS) Misconfiguration: Kesalahan Konfigurasi yang Dapat Membuka Celah Kebocoran Data


Kesimpulan

OAuth State Parameter mungkin terlihat sederhana, tetapi memiliki peran yang sangat besar dalam menjaga keamanan proses autentikasi OAuth. Dengan menghasilkan nilai acak, menyimpannya secara aman, serta melakukan validasi sebelum menukarkan authorization code, pengembang dapat mencegah berbagai serangan seperti CSRF, Login CSRF, hingga manipulasi proses login.

Di era di mana autentikasi menggunakan akun Google, Microsoft, GitHub, dan penyedia identitas lainnya semakin umum digunakan, mengabaikan parameter state bukanlah pilihan yang bijak. Mengikuti praktik terbaik implementasi OAuth akan membantu menjaga keamanan aplikasi sekaligus melindungi data pengguna dari ancaman siber yang terus berkembang.