Pertanyaan ini bukan tentang kapan menggunakan GET atau POST secara umum; ini tentang yang direkomendasikan untuk menangani keluar dari aplikasi web. Saya telah menemukan banyak informasi tentang perbedaan antara GET dan POST dalam pengertian umum, tetapi saya tidak menemukan jawaban yang pasti untuk skenario khusus ini.
Sebagai seorang pragmatis, saya cenderung menggunakan GET, karena menerapkannya jauh lebih sederhana daripada POST; cukup letakkan tautan sederhana dan Anda selesai. Ini tampaknya menjadi masalah dengan sebagian besar situs web yang dapat saya pikirkan, setidaknya dari atas kepala saya. Bahkan Stack Overflow menangani keluar dengan GET.
Hal yang membuat saya ragu adalah argumen (meskipun lama) bahwa beberapa akselerator web / proksi mempre-cache halaman dengan pergi dan mengambil setiap tautan yang mereka temukan di halaman, sehingga pengguna mendapatkan respons yang lebih cepat ketika dia mengkliknya. Saya tidak yakin apakah ini masih berlaku, tetapi jika ini masalahnya, maka secara teori pengguna dengan salah satu akselerator ini akan dikeluarkan dari aplikasi begitu dia masuk, karena akseleratornya akan menemukan dan mengambil logout Tautan bahkan jika dia tidak pernah mengkliknya.
Semua yang saya baca sejauh ini menunjukkan bahwa POST harus digunakan untuk "tindakan destruktif", sedangkan tindakan yang tidak mengubah keadaan internal aplikasi - seperti query dan semacamnya - harus ditangani dengan GET . Berdasarkan ini, pertanyaan sebenarnya di sini adalah:
Apakah keluar dari aplikasi dianggap tindakan merusak / apakah itu mengubah keadaan internal aplikasi?
sumber
Jawaban:
Gunakan
POST
.Pada 2010, menggunakan
GET
mungkin merupakan jawaban yang bisa diterima. Tapi hari ini (tahun 2013), browser akan mengambil lebih awal halaman yang mereka pikir akan Anda kunjungi selanjutnya.Berikut adalah salah satu pengembang StackOverflow yang membicarakan masalah ini di twitter:
fakta menyenangkan: StackOverflow digunakan untuk menangani log-out via GET, tetapi tidak lagi.
sumber
Dalam REST seharusnya tidak ada sesi, oleh karena itu tidak ada yang bisa dihancurkan. Klien REST mengautentikasi pada setiap permintaan. Masuk, atau keluar, itu hanya ilusi.
Apa yang sebenarnya Anda tanyakan adalah apakah browser harus terus mengirim informasi otentikasi pada setiap permintaan.
Boleh dibilang, jika aplikasi Anda memang menciptakan ilusi sedang login, maka Anda harus bisa "logout" menggunakan javascript. Tidak perlu pulang pergi.
Disertasi Fielding - Bagian 5.1.3
sumber
httponly
atribut untuk mencegah beberapa risiko xss, yang berarti itu hanya dapat diatur ulang dari server (singkat secara manual menghapus cookie)Salah satu cara
GET
dapat disalahgunakan di sini adalah bahwa seseorang (pesaing mungkin :) memasang tag gambar dengansrc="<your logout link>"
MANA SAJA di internet, dan jika pengguna situs Anda menemukan halaman itu, ia akan secara tidak sadar keluar.sumber
/logout
URL dalam gambar tersembunyi), dan berfungsi.Agar benar, GET / POST (atau kata kerja lainnya) adalah tindakan pada beberapa sumber daya (ditangani oleh URL) - sehingga umumnya tentang status sumber daya dan bukan tentang status aplikasi. Jadi dengan semangat yang sebenarnya, Anda harus memiliki URL seperti
[host name]\[user name]\session
, lalu 'HAPUS' akan menjadi kata kerja yang benar untuk tindakan logout.Menggunakan
[host name]\bla bla\logout
sebagai URL bukan benar-benar REST full way (IMO), jadi mengapa berdebat tentang penggunaan GET / POST yang benar di dalamnya?Tentu saja, saya juga menggunakan GET untuk url logout di aplikasi saya :-)
sumber
Keluar tidak melakukan apa-apa pada aplikasi itu sendiri. Ini mengubah status pengguna dalam kaitannya dengan aplikasi. Dalam hal ini, tampaknya pertanyaan Anda lebih didasarkan pada bagaimana seharusnya perintah dimulai dari pengguna untuk memulai tindakan ini. Karena ini bukan "tindakan destruktif", yakin bahwa sesi ini ditinggalkan atau dihancurkan tetapi aplikasi atau data Anda tidak diubah, tidak mungkin untuk memungkinkan kedua metode untuk memulai prosedur logout. Pos harus digunakan oleh tindakan yang dilakukan pengguna (misalnya - klik pengguna "Keluar"), sementara get dapat dicadangkan untuk logout yang dimulai oleh aplikasi (misalnya - pengecualian yang mendeteksi potensi intrusi pengguna yang secara paksa diarahkan ke halaman login dengan GET logout. ).
sumber
Halo menurut pandangan saya, ketika Anda login Anda memeriksa nama pengguna / kata sandi dan jika mereka cocok Anda membuat token login.
CREAT token => metode POST
Ketika Anda logout, Anda mendistribusi token sehingga bagi saya metode yang paling logis adalah DELETE
DELETE token => method DELETE
sumber
Skenario pre-caching sangat menarik. Tapi saya menduga bahwa jika banyak situs inc jadi jangan khawatir tentang ini maka mungkin Anda juga tidak boleh.
Atau mungkin tautannya bisa diimplementasikan dalam javascript?
Sunting: Seperti yang saya pahami, secara teknis GET harus untuk permintaan hanya-baca, yang tidak mengubah status aplikasi. POST harus untuk permintaan penulisan / edit yang mengubah status. Namun masalah aplikasi lain mungkin lebih suka GET daripada POST untuk beberapa permintaan yang berubah negara, dan saya tidak berpikir ada masalah dengan ini.
sumber
Nah, jika Anda membiarkan aplikasi web Anda meninggalkan sesi melalui skrip logout, Anda biasanya juga tidak perlu. Biasanya ada variabel sesi yang unik untuk sesi yang ingin Anda tinggalkan.
sumber
Baru-baru ini saya mengerjakan proyek yang saya gunakan GET untuk Logout Di bawah ini adalah kode di Nodejs Express dan berfungsi dengan baik
router.js Anda
controller.js Anda
sumber
Saya tidak melihat bagaimana cara keluar (menghilangkan hak pengguna) adalah tindakan yang merusak. Itu karena tindakan "logout" harus hanya tersedia untuk pengguna yang sudah masuk kalau tidak itu akan usang.
String yang dibuat secara acak yang terkandung dalam cookie browser Anda semuanya mewakili sesi pengguna Anda. Ada banyak cara untuk menghancurkannya sehingga secara efektif logout hanyalah layanan untuk pengunjung Anda.
sumber
wget
dalam mode laba-laba dengan cookie sesi yang benar di wiki pribadi adalah hal yang harus saya lakukan sekali. Tentu saja, salah satu URL rayapan pertama adalah/logout
./logout
halaman. Misalnya, Anda harus masuk ke Gmail lagi, masuk ke obrolan lagi, cari tempat Anda di percakapan Hangout yang telah Anda gulir dll. - dan ini hanya untuk Google.com.