tl; dr: Ini semua karena alasan keamanan.
OAuth 2.0 ingin memenuhi dua kriteria ini:
- Anda ingin mengizinkan pengembang untuk menggunakan URI pengalihan non-HTTPS karena tidak semua pengembang memiliki server berkemampuan SSL dan jika mereka tidak selalu dikonfigurasikan dengan benar (tidak ditandatangani sendiri, sertifikat SSL tepercaya, jam server yang disinkronkan ...).
- Anda tidak ingin peretas dapat mencuri akses / menyegarkan token dengan mencegat permintaan.
Detail di bawah:
Aliran implisit hanya mungkin di lingkungan browser karena alasan keamanan:
Dalam aliran implisit token akses dilewatkan secara langsung sebagai fragmen hash (bukan sebagai parameter URL). Satu hal penting tentang fragmen hash adalah bahwa, setelah Anda mengikuti tautan yang berisi fragmen hash, hanya browser yang mengetahui fragmen hash. Browser akan meneruskan fragmen hash langsung ke halaman web tujuan (URI redirect / halaman web klien). Hash fragment memiliki sifat-sifat berikut:
- Mereka bukan bagian dari permintaan HTTP karena itu mereka tidak dapat dibaca oleh server dan karena itu mereka tidak dapat dicegat oleh server perantara / router (ini penting).
- Mereka hanya ada di browser - sisi klien - jadi satu-satunya cara untuk membaca fragmen hash menggunakan JavaScript yang berjalan di halaman.
Ini memungkinkan untuk melewatkan Token Akses langsung ke klien tanpa risiko diinterupsi oleh server perantara. Ini memiliki peringatan hanya menjadi sisi klien yang mungkin dan perlu javascript menjalankan sisi klien untuk menggunakan token akses.
Aliran implisit juga memiliki masalah keamanan yang memerlukan logika lebih lanjut untuk menyelesaikan / menghindari misalnya:
- Seorang penyerang bisa mendapatkan token akses dari pengguna di situs web / aplikasi lain (katakanlah jika dia adalah pemilik situs web / aplikasi lain), catat token di situs web mereka, dan kemudian berikan sebagai parameter URL di situs web Anda karena itu menyamar sebagai pengguna di situs web Anda. Untuk menghindari hal ini, Anda perlu memeriksa ID Klien yang terkait dengan token akses (misalnya untuk Google Anda dapat menggunakan titik akhir tokeninfo) untuk memastikan token itu dikeluarkan dengan ID klien Anda sendiri (yaitu dengan aplikasi Anda sendiri) atau periksa tanda tangan jika Anda menggunakan IDToken (tetapi itu membutuhkan rahasia klien Anda).
- Jika permintaan auth bukan berasal dari properti Anda sendiri (disebut Session Fixation attack), untuk menghindari ini, Anda ingin membuat hash acak dari situs web Anda, menyimpannya dalam cookie dan meneruskan hash yang sama di URL URL param permintaan auth, ketika pengguna kembali Anda memeriksa param negara dengan cookie dan itu harus cocok.
Dalam aliran kode otorisasi tidak mungkin untuk melewatkan token akses secara langsung dalam parameter URL karena parameter URL adalah bagian dari Permintaan HTTP, oleh karena itu setiap server perantara / router tempat permintaan Anda akan melewati (bisa ratusan) dapat baca token akses jika Anda tidak menggunakan koneksi terenkripsi (HTTPS) yang memungkinkan apa yang dikenal sebagai serangan Man-in-the-middle.
Melewati token akses secara langsung dalam param URL dapat secara teori dimungkinkan tetapi auth sever harus memastikan URI redirect menggunakan HTTPS dengan enkripsi TLS dan sertifikat SSL 'tepercaya' (biasanya dari Otoritas Sertifikat yang tidak gratis) untuk memastikan bahwa server tujuan sah dan bahwa permintaan HTTP sepenuhnya terenkripsi. Memiliki semua pengembang membeli sertifikat SSL dan mengkonfigurasi SSL dengan benar di domain mereka akan sangat menyusahkan dan akan memperlambat adopsi. Inilah sebabnya mengapa "kode otorisasi" perantara sekali pakai diberikan asalkan hanya penerima yang sah yang dapat bertukar (karena Anda memerlukan rahasia klien) dan bahwa kode tersebut tidak akan berguna bagi peretas potensial yang mencegat permintaan atas transaksi yang tidak dienkripsi. (karena mereka tidak
Anda juga bisa berpendapat bahwa aliran implisit kurang aman, ada vektor serangan potensial seperti spoofing domain saat pengalihan - misalnya dengan membajak alamat IP situs web klien. Ini adalah salah satu alasan mengapa aliran implisit hanya memberikan token akses (yang seharusnya memiliki waktu penggunaan terbatas) dan tidak pernah me-refresh token (yang tidak terbatas waktu). Untuk memperbaiki masalah ini, saya menyarankan Anda untuk meng-host halaman web Anda di server yang mendukung HTTPS bila memungkinkan.