Penafian: Saya baru di sekolah pemikiran REST, dan saya mencoba membungkus pikiran saya dengannya.
Jadi, saya membaca halaman ini, Kesalahan REST Umum , dan saya merasa saya benar-benar bingung dengan sesi yang tidak relevan. Inilah yang dikatakan halaman:
Seharusnya tidak perlu bagi klien untuk "masuk" atau "memulai koneksi." Otentikasi HTTP dilakukan secara otomatis pada setiap pesan. Aplikasi klien adalah konsumen sumber daya, bukan layanan. Karena itu tidak ada yang bisa masuk! Katakanlah Anda memesan penerbangan pada layanan web REST. Anda tidak membuat koneksi "sesi" baru ke layanan. Alih-alih Anda meminta "objek pembuat jadwal" untuk membuat Anda jadwal perjalanan baru. Anda dapat mulai mengisi bagian yang kosong tetapi kemudian mendapatkan beberapa komponen yang sangat berbeda di tempat lain di web untuk mengisi bagian yang kosong lainnya. Tidak ada sesi sehingga tidak ada masalah kondisi sesi migrasi antara klien. Juga tidak ada masalah "afinitas sesi"
Oke, saya mendapatkan bahwa otentikasi HTTP dilakukan secara otomatis pada setiap pesan - tetapi bagaimana caranya? Apakah nama pengguna / kata sandi dikirimkan bersama setiap permintaan? Bukankah itu hanya meningkatkan luas permukaan serangan? Saya merasa seperti kehilangan bagian dari teka-teki.
Apakah buruk untuk memiliki layanan REST, katakanlah,, /session
yang menerima permintaan GET, di mana Anda akan memasukkan nama pengguna / kata sandi sebagai bagian dari permintaan, dan mengembalikan token sesi jika otentikasi berhasil, yang kemudian bisa diteruskan dengan permintaan selanjutnya? Apakah itu masuk akal dari sudut pandang REST, atau apakah itu melewatkan intinya?
Jawaban:
Agar tenang, setiap permintaan HTTP harus membawa informasi yang cukup dengan sendirinya untuk penerimanya agar selaras sepenuhnya dengan sifat HTTP tanpa kewarganegaraan.
Ya, nama pengguna dan kata sandi dikirim dengan setiap permintaan. Metode umum untuk melakukannya adalah otentikasi akses dasar dan otentikasi akses digest . Dan ya, seorang penguping dapat menangkap kredensial pengguna. Dengan demikian seseorang akan mengenkripsi semua data yang dikirim dan diterima menggunakan Transport Layer Security (TLS) .
Ini tidak akan MENYENANGKAN karena ia menyatakan tetapi itu cukup umum karena itu kenyamanan bagi pengguna; seorang pengguna tidak harus login setiap kali.
Apa yang Anda gambarkan dalam "token sesi" biasanya disebut sebagai cookie masuk . Misalnya, jika Anda mencoba masuk ke akun Yahoo! akun ada kotak centang yang mengatakan "tetap masuk saya selama 2 minggu". Ini pada dasarnya mengatakan (dalam kata-kata Anda) "pertahankan token sesi saya hidup selama 2 minggu jika saya berhasil login." Browser web akan mengirimkan cookie masuk tersebut (dan mungkin yang lain) dengan setiap permintaan HTTP yang Anda minta untuk Anda buat.
sumber
Tidak jarang layanan REST memerlukan otentikasi untuk setiap permintaan HTTP. Sebagai contoh, Amazon S3 mensyaratkan bahwa setiap permintaan memiliki tanda tangan yang berasal dari kredensial pengguna, permintaan yang tepat untuk dilakukan, dan waktu saat ini. Tanda tangan ini mudah dihitung pada sisi klien, dapat dengan cepat diverifikasi oleh server, dan terbatas digunakan untuk penyerang yang mencegatnya (karena didasarkan pada waktu saat ini).
sumber
Banyak orang tidak memahami prinsip-prinsip REST dengan sangat jelas, menggunakan token sesi tidak selalu berarti Anda stateful, alasan untuk mengirim nama pengguna / kata sandi dengan setiap permintaan hanya untuk otentikasi dan sama untuk mengirim token (dihasilkan oleh login proses) hanya untuk memutuskan apakah klien memiliki izin untuk meminta data atau tidak, Anda hanya melanggar konvensi REST ketika Anda menggunakan nama pengguna / kata sandi atau token sesi untuk memutuskan data apa yang akan ditampilkan! alih-alih, Anda harus menggunakannya hanya untuk penghentian (untuk menampilkan data atau tidak menampilkan data)
dalam kasus Anda, saya katakan YA ini RESTy, tetapi cobalah menghindari menggunakan sesi php asli di API REST Anda dan mulai menghasilkan token hash Anda sendiri yang kedaluwarsa dalam periode waktu yang ditentukan!
sumber
Tidak, tidak ada salahnya. ClientLogin Google bekerja dengan cara ini persis dengan pengecualian bahwa klien diperintahkan untuk pergi ke "/ sesi" menggunakan respons HTTP 401. Tetapi ini tidak membuat sesi, itu hanya menciptakan cara bagi klien untuk (sementara) mengotentikasi diri mereka sendiri tanpa melewati kredensial secara jelas, dan bagi server untuk mengontrol validitas kredensial sementara ini yang dianggap sesuai.
sumber
"Otorisasi:" tajuk HTTP dikirim oleh klien. Baik dasar (teks biasa) atau intisari.
Seluruh ide sesi adalah membuat aplikasi stateful menggunakan stateless protocol (HTTP) dan dumb client (browser web), dengan mempertahankan status di sisi server. Salah satu prinsip REST adalah "Setiap sumber daya dialamatkan secara unik menggunakan sintaksis universal untuk digunakan dalam tautan hypermedia" . Variabel sesi adalah sesuatu yang tidak dapat diakses melalui URI. Aplikasi Sungguh RESTful akan mempertahankan keadaan di sisi klien, mengirim semua variabel yang diperlukan melalui HTTP, lebih disukai di URI.
Contoh: cari dengan pagination. Anda akan memiliki URL dalam formulir
Ini memiliki banyak kesamaan dengan URL yang dapat di-bookmark
sumber
Saya pikir saran Anda baik-baik saja, jika Anda ingin mengontrol waktu sesi sesi klien. Saya pikir arsitektur RESTful mendorong Anda untuk mengembangkan aplikasi stateless. Seperti @ 2pence menulis "setiap permintaan HTTP harus membawa informasi yang cukup dengan sendirinya untuk penerimanya agar selaras sepenuhnya dengan sifat HTTP yang tanpa kewarganegaraan" .
Namun, tidak selalu demikian, terkadang aplikasi perlu memberi tahu kapan klien log-in atau log-out dan untuk mempertahankan sumber daya seperti kunci atau lisensi berdasarkan informasi ini. Lihat pertanyaan tindak lanjut saya untuk contoh kasus seperti itu.
sumber