DAPATKAN vs. POST

Permintaan HTTP POST menyediakan data tambahan dari klien (browser) ke server di badan pesan. Sebaliknya, permintaan GET mencakup semua data yang diperlukan dalam URL. Formulir dalam HTML dapat menggunakan salah satu metode dengan menentukan metode = "POST" atau metode = "GET" (default) di elemen. Metode yang ditentukan menentukan bagaimana data formulir dikirimkan ke server. Ketika metode ini MENDAPATKAN, semua data formulir dikodekan ke dalam URL, ditambahkan ke URL tindakan sebagai parameter string kueri. Dengan POST, data formulir muncul di dalam tubuh pesan dari permintaan HTTP.

Grafik perbandingan

DAPATKAN versus grafik perbandingan POST
DAPATKAN POS
SejarahParameter tetap dalam riwayat peramban karena merupakan bagian dari URLParameter tidak disimpan dalam riwayat browser.
DitandaiDapat di-bookmark.Tidak bisa di-bookmark.
Tombol KEMBALI / kirim kembali perilakuPermintaan GET dieksekusi kembali tetapi mungkin tidak dikirimkan kembali ke server jika HTML disimpan dalam cache browser.Browser biasanya memperingatkan pengguna bahwa data perlu dikirim ulang.
Jenis pengodean (atribut enctype)application / x-www-form-urlencodedmultipart / form-data atau aplikasi / x-www-form-urlencoded Gunakan pengkodean multipart untuk data biner.
Parameterdapat mengirim tetapi data parameter terbatas pada apa yang dapat kami masukkan ke dalam baris permintaan (URL). Paling aman untuk menggunakan kurang dari 2K parameter, beberapa server menangani hingga 64KDapat mengirim parameter, termasuk mengunggah file, ke server.
DiretasLebih mudah untuk meretas untuk kiddies skripLebih sulit untuk diretas
Pembatasan pada tipe data formulirYa, hanya karakter ASCII yang diizinkan.Tidak ada batasan. Data biner juga diizinkan.
KeamananGET kurang aman dibandingkan dengan POST karena data yang dikirim adalah bagian dari URL. Jadi itu disimpan dalam riwayat browser dan log server di plaintext.POST sedikit lebih aman daripada GET karena parameter tidak disimpan dalam riwayat browser atau dalam log server web.
Pembatasan pada panjang data formulirYa, karena data formulir ada di URL dan panjang URL dibatasi. Batas panjang URL aman seringkali 2048 karakter tetapi bervariasi berdasarkan browser dan server web.Tidak ada batasan
KegunaanMetode GET tidak boleh digunakan saat mengirim kata sandi atau informasi sensitif lainnya.Metode POST digunakan ketika mengirim kata sandi atau informasi sensitif lainnya.
VisibilitasMetode GET terlihat oleh semua orang (itu akan ditampilkan di bilah alamat browser) dan memiliki batasan jumlah informasi yang akan dikirim.Variabel metode POST tidak ditampilkan dalam URL.
Dalam cacheDapat di-cacheTidak di-cache

Perbedaan dalam Pengajuan Formulir

Perbedaan mendasar antara METHOD = "GET" dan METHOD = "POST" adalah bahwa mereka sesuai dengan permintaan HTTP yang berbeda, sebagaimana didefinisikan dalam spesifikasi HTTP. Proses pengiriman untuk kedua metode dimulai dengan cara yang sama - kumpulan data formulir dibuat oleh browser dan kemudian dikodekan dengan cara yang ditentukan oleh atribut enctype . Untuk METHOD = "POST, atribut enctype dapat berupa multipart / form-data atau aplikasi / x-www-form-urlencoded, sedangkan untuk METHOD =" GET ", hanya aplikasi / x-www-form-urlencoded yang boleh. Data formulir ini set kemudian ditransmisikan ke server.

Untuk pengiriman formulir dengan METHOD = "GET", browser membuat URL dengan mengambil nilai atribut tindakan, menambahkan ? untuk itu, kemudian menambahkan kumpulan data formulir (disandikan menggunakan tipe konten aplikasi / x-www-form-urlencoded). Browser kemudian memproses URL ini seolah-olah mengikuti tautan (atau seolah-olah pengguna telah mengetik URL secara langsung). Browser membagi URL menjadi beberapa bagian dan mengenali suatu host, kemudian mengirimkan permintaan GET ke host tersebut dengan URL lainnya sebagai argumen. Server mengambilnya dari sana. Perhatikan bahwa proses ini berarti bahwa formulir data terbatas pada kode ASCII. Perhatian khusus harus diberikan untuk menyandikan dan mendekode jenis karakter lain ketika melewati mereka melalui URL dalam format ASCII.

Pengajuan formulir dengan METHOD = "POST" menyebabkan permintaan POST dikirim, menggunakan nilai atribut tindakan dan pesan yang dibuat sesuai dengan tipe konten yang ditentukan oleh atribut enctype .

Pro dan kontra

Karena data formulir dikirim sebagai bagian dari URL saat GET digunakan -

  • Formulir data dibatasi untuk kode ASCII. Perhatian khusus harus diberikan untuk menyandikan dan mendekode jenis karakter lain ketika melewati mereka melalui URL dalam format ASCII. Di sisi lain, data biner, gambar, dan file lainnya semuanya dapat dikirimkan melalui METHOD = "POST"
  • Semua data formulir yang diisi terlihat di URL. Selain itu, ini juga disimpan dalam riwayat penelusuran web / log pengguna untuk browser. Masalah-masalah ini membuat GET kurang aman.
  • Namun, satu keuntungan dari data formulir yang dikirim sebagai bagian dari URL adalah seseorang dapat mem-bookmark URL dan langsung menggunakannya dan sepenuhnya memotong proses pengisian formulir.
  • Ada batasan pada seberapa banyak data formulir dapat dikirim karena panjang URL terbatas.
  • Script kiddies dapat dengan lebih mudah mengekspos kerentanan dalam sistem untuk meretasnya. Misalnya, Citibank diretas dengan mengubah nomor akun di string URL. [1] Tentu saja, peretas atau pengembang web yang berpengalaman dapat mengekspos kerentanan tersebut bahkan jika POST digunakan; hanya sedikit lebih sulit. Secara umum, server harus curiga terhadap data yang dikirim oleh klien dan menjaga terhadap Referensi Objek Langsung Tidak Aman.

Perbedaan dalam pemrosesan sisi server

Pada prinsipnya, pemrosesan data formulir yang dikirimkan tergantung pada apakah itu dikirim dengan METHOD = "GET" atau METHOD = "POST" . Karena data dikodekan dengan cara yang berbeda, mekanisme decoding yang berbeda diperlukan. Dengan demikian, secara umum, mengubah METODE mungkin memerlukan perubahan pada skrip yang memproses pengiriman. Misalnya, saat menggunakan antarmuka CGI, skrip menerima data dalam variabel lingkungan (QUERYSTRING) saat GET digunakan. Tetapi ketika POST digunakan, formulir data dilewatkan dalam aliran input standar ( stdin ) dan jumlah byte yang akan dibaca diberikan oleh header panjang konten.

Penggunaan yang Disarankan

GET direkomendasikan ketika mengirimkan formulir "idempoten" - formulir yang tidak 'secara signifikan mengubah keadaan dunia'. Dengan kata lain, formulir yang hanya melibatkan permintaan basis data. Perspektif lain adalah bahwa beberapa kueri idempoten akan memiliki efek yang sama dengan satu kueri. Jika pembaruan basis data atau tindakan lain seperti memicu email terlibat, penggunaan POST dianjurkan.

Dari blog pengembang Dropbox:

browser tidak tahu persis apa yang dilakukan form HTML tertentu, tetapi jika form dikirimkan melalui HTTP GET, browser tahu bahwa aman untuk secara otomatis mencoba kembali pengiriman jika ada kesalahan jaringan. Untuk formulir yang menggunakan HTTP POST, mungkin tidak aman untuk mencoba lagi sehingga browser meminta konfirmasi terlebih dahulu kepada pengguna.

Permintaan "GET" seringkali dapat di-cache, sedangkan permintaan "POST" sulit. Untuk sistem kueri ini mungkin memiliki dampak efisiensi yang cukup besar, terutama jika string kueri sederhana, karena cache mungkin melayani kueri yang paling sering.

Dalam kasus tertentu, direkomendasikan menggunakan POST bahkan untuk permintaan idempoten:

  • Jika data formulir akan berisi karakter non-ASCII (seperti karakter beraksen), maka METHOD = "GET" pada prinsipnya tidak dapat diterapkan, meskipun itu dapat bekerja dalam praktiknya (terutama untuk karakter ISO Latin 1).
  • Jika kumpulan data formulir besar - katakanlah, ratusan karakter - maka METHOD = "GET" dapat menyebabkan masalah praktis dengan implementasi yang tidak dapat menangani URL yang panjang itu.
  • Anda mungkin ingin menghindari METHOD = "GET" untuk membuatnya kurang terlihat oleh pengguna bagaimana formulir bekerja, terutama untuk membuat bidang "tersembunyi" (INPUT TYPE = "HIDDEN") lebih tersembunyi dengan tidak muncul di URL. Tetapi bahkan jika Anda menggunakan bidang tersembunyi dengan METHOD = "POST", mereka akan tetap muncul dalam kode sumber HTML.

Bagaimana dengan HTTPS?

Diperbarui 15 Mei 2015: Khususnya ketika menggunakan HTTPS (HTTP over TLS / SSL), apakah POST menawarkan keamanan lebih daripada GET?

Ini pertanyaan yang menarik. Katakanlah Anda membuat permintaan GET ke halaman web:

 DAPATKAN //www.example.com/login.php?user=mickey&passwd=mini 

Dengan asumsi bahwa koneksi Internet Anda sedang dipantau, informasi apa tentang permintaan ini akan tersedia untuk pengintai? Jika POST digunakan sebagai gantinya, dan data pengguna dan passwd termasuk dalam variabel POST, apakah itu akan lebih aman dalam kasus koneksi HTTPS?

Jawabannya adalah tidak. Jika Anda membuat permintaan GET tersebut, hanya informasi berikut yang akan diketahui oleh penyerang yang memantau lalu lintas web Anda:

  1. Fakta bahwa Anda membuat koneksi HTTPS
  2. Nama host - www.example.com
  3. Total panjang permintaan
  4. Panjangnya respons

Bagian jalur URL - yaitu, halaman sebenarnya yang diminta, serta parameter string kueri - dilindungi (dienkripsi) ketika sedang "over the wire" yaitu, dalam perjalanan dalam perjalanan ke server tujuan. Situasinya persis sama untuk permintaan POST.

Tentu saja, server web cenderung mencatat seluruh URL dalam teks biasa di log akses mereka; jadi mengirim informasi sensitif melalui GET bukanlah ide yang baik. Ini berlaku terlepas dari apakah HTTP atau HTTPS digunakan.

Artikel Terkait