Apa itu sesi? Bagaimana mereka bekerja?

332

Saya baru mulai belajar pengembangan aplikasi web, menggunakan python. Saya menemukan istilah 'cookie' dan 'sesi'. Saya mengerti cookie karena mereka menyimpan beberapa info dalam pasangan nilai kunci di browser. Tetapi saya memiliki sedikit kebingungan mengenai sesi, dalam sesi juga kami menyimpan data dalam cookie di browser pengguna.

Misalnya - Saya masuk menggunakan username='rasmus'dan password='default'. Dalam kasus seperti itu, data akan diposting ke server yang seharusnya memeriksa dan masuk jika dikonfirmasi. Namun selama seluruh proses server juga menghasilkan ID sesi yang akan disimpan dalam cookie di browser saya. Sekarang server juga menyimpan ID sesi ini dalam sistem file atau datastore-nya.

Tetapi berdasarkan hanya pada ID sesi, bagaimana ia bisa mengetahui nama pengguna saya selama traversal berikutnya melalui situs ini? Apakah itu menyimpan data di server sebagai dict di mana kuncinya akan menjadi ID sesi dan rincian seperti username, emaildll. Menjadi nilainya?

Saya agak bingung di sini. Butuh bantuan.

Rasmus
sumber
9
"Apakah itu menyimpan data di server sebagai dict di mana kuncinya akan menjadi id sesi dan detail seperti nama pengguna, email dll menjadi nilainya?" ...Iya. 'Dict' mungkin merupakan basis data relasional, tetapi pada dasarnya cara kerjanya.
bobince
14
Saya ingin memahami sesi web juga, sekarang saya mengerti. Saya akhirnya menulis wiki saya sendiri jika itu bisa membantu: machinesaredigging.com/2013/10/29/how-does-a-web-session-work
eloone
Jika Anda tidak tahu: menyimpan kata sandi di sisi klien tidak aman, bahkan jika kata sandi di-hash (sebenarnya tidak ada bedanya. Cracker bisa langsung memasukkan kata sandi hash dengan membuat cookie palsu) adalah cara yang lebih baik untuk menyimpan status login.
cytsunny
1
Saya menulis sendiri menggunakan detail tingkat protokol - bitspedia.com/2012/05/...
Asif Shahzad

Jawaban:

400

Karena HTTP tidak memiliki kewarganegaraan, untuk mengaitkan permintaan ke permintaan lain, Anda memerlukan cara untuk menyimpan data pengguna di antara permintaan HTTP.

Cookies atau parameter URL (misalnya, misalnya http://example.com/myPage?asd=lol&boo=no ) keduanya merupakan cara yang sesuai untuk mengirim data antara 2 atau lebih permintaan. Namun mereka tidak baik jika Anda tidak ingin data tersebut dapat dibaca / diedit di sisi klien.

Solusinya adalah menyimpan sisi server data itu, berikan "id", dan beri tahu klien hanya (dan berikan kembali pada setiap permintaan http) id itu. Ini dia, sesi dilaksanakan. Atau Anda dapat menggunakan klien sebagai penyimpanan jarak jauh yang mudah digunakan, tetapi Anda akan mengenkripsi data dan menjaga sisi server rahasia.

Tentu saja ada aspek-aspek lain untuk dipertimbangkan, seperti Anda tidak ingin orang membajak sesi orang lain, Anda ingin sesi tidak bertahan selamanya tetapi berakhir, dan sebagainya.

Dalam contoh spesifik Anda, id pengguna (bisa berupa nama pengguna atau ID unik lain dalam basis data pengguna Anda) disimpan dalam data sesi, sisi server, setelah identifikasi berhasil. Kemudian untuk setiap permintaan HTTP yang Anda dapatkan dari klien, id sesi (yang diberikan oleh klien) akan mengarahkan Anda ke data sesi yang benar (disimpan oleh server) yang berisi id pengguna terautentikasi - dengan cara itu kode Anda akan tahu pengguna apa itu sedang berbicara.

Luke404
sumber
3
"Anda tidak ingin data itu dipertahankan sisi klien". Kenapa tidak? Jika Anda menggunakan kriptografi yang kuat, Anda dapat membiarkan klien tetap menyimpan data sesi yang dienkripsi dan disimpan dalam cookie. Ini sangat menyederhanakan penskalaan ke beberapa node karena server tidak perlu 'mengingat' apa pun.
Matt Harrison
5
@MattHarrison bagaimana Anda mendekripsi data tanpa "mengingat apa pun" di sisi server? Saya sudah mencoba memperluas topik ini dalam jawaban saya.
Luke404
2
@MattHarrison perlu diingat bahwa menyimpan banyak data sisi pengguna akan meningkatkan lalu lintas Anda.
nitsas
5
Tidak akankah pihak ketiga dapat bertindak sebagai pengguna jika mereka dapat memotong kunci sesi pengguna? Dengan asumsi situs tidak menggunakan HTTPS, sepertinya pihak ketiga dapat menyamar sebagai pengguna dengan kunci sesi bahkan jika kunci tersebut dienkripsi. Server hanya akan mendekripsi itu.
user137717
2
@ user137717 ya itu kemungkinan jika Anda mengizinkan akses ke sesi untuk "setiap orang yang menyajikan id sesi yang benar". Ada sejumlah batasan yang dapat Anda tempatkan, salah satu yang termudah dan paling umum adalah menyimpan IP klien dalam sesi: jika klien dari ip lain menyajikan id sesi yang sama dengan yang Anda tandai sebagai yang dipalsukan dan hapus sesi.
Luke404
110

Penjelasan sederhana dengan analogi

Bayangkan Anda berada di bank, mencoba mengeluarkan uang dari akun Anda. Tapi gelap; bank gelap gulita: tidak ada cahaya dan Anda tidak dapat melihat tangan Anda di depan wajah Anda. Anda dikelilingi oleh 20 orang lainnya. Mereka semua terlihat sama. Dan setiap orang memiliki suara yang sama. Dan setiap orang adalah orang jahat potensial. Dengan kata lain, HTTP tidak memiliki kewarganegaraan.

Bank ini adalah jenis bank yang lucu - demi argumen, inilah cara kerjanya:

  1. Anda menunggu dalam antrean (atau online) dan Anda berbicara dengan teller: Anda membuat permintaan untuk menarik uang, dan kemudian
  2. Anda harus menunggu sebentar di sofa, dan 20 menit kemudian
  3. Anda harus pergi dan benar-benar mengumpulkan uang Anda dari kasir.

Tetapi bagaimana teller akan memberi tahu Anda berbeda dari orang lain?

Teller tidak dapat melihat atau dengan mudah mengenali Anda, ingat, karena semua lampu mati. Bagaimana jika teller Anda memberikan penarikan $ 10.000 Anda kepada orang lain - orang yang salah? Sangat penting bahwa teller dapat mengenali Anda sebagai orang yang melakukan penarikan, sehingga Anda bisa mendapatkan uang (atau sumber daya) yang Anda minta.

Larutan:

Ketika Anda pertama kali muncul di kasir, ia memberi tahu Anda sesuatu secara rahasia:

"Kapan pun Anda berbicara kepada saya," kata kasir, "Anda harus mengidentifikasi diri Anda sebagai GNASHEU329 - yang saya tahu itu Anda".

Tidak ada orang lain yang tahu kode sandi rahasia.

Contoh Bagaimana Saya Menarik Uang Tunai:

Jadi saya memutuskan untuk pergi dan bersantai selama 20 menit dan kemudian saya pergi ke kasir dan mengatakan "Saya ingin mengambil uang saya"

Teller bertanya kepada saya: "siapa kamu ??!"

"Ini saya, Tuan George Banks!"

"Buktikan itu!"

Dan kemudian saya memberi tahu mereka kode sandi saya: GNASHEU329

"Tentu saja, Tuan Banks!"

Itu pada dasarnya adalah bagaimana sebuah sesi bekerja. Hal ini memungkinkan seseorang untuk diidentifikasi secara unik di lautan jutaan orang. Anda perlu mengidentifikasi diri Anda setiap kali Anda berurusan dengan teller.

Jika Anda memiliki pertanyaan atau tidak jelas - silakan kirim komentar dan saya akan mencoba menjernihkannya untuk Anda.

Penjelasan melalui Gambar:

Sesi dijelaskan melalui Gambar

BKSpurgeon
sumber
9
Sukai penjelasan ini - dalam analogi Anda, bagaimana Anda mencegah orang lain menguping dan juga mendengar kode sandi rahasia yang diceritakan oleh teller? Dengan kata lain, jika session_id dicuri, tidakkah mungkin bagi seseorang untuk meniru kredensial Anda?
wmock
Pembajakan sesi @wmock tentu saja menjadi masalah: lihat ini! owasp.org/index.php/Session_hijacking_attack
BKSpurgeon
2
contoh yang bagus !! itu akan dibagikan kepada orang-orang yang ingin belajar!
Victor
dalam analogi Anda, GNASHEU329adalah kata sandi pengguna, yang menghasilkan token autentikasi yang kedaluwarsa hingga waktu tertentu; Mr Banks kemudian dapat menggunakan token auth untuk melakukan beberapa penarikan berturut-turut tanpa harus berulang kali memberi kasir kepada teller kata sandinya?
Daniel Lizik
@DanielLizik Anda def. memahami konsepnya! Tapi saya tidak cukup tahu tentang alur kerja berbasis token untuk memberi Anda jawaban yang cerdas. Prinsip umum adalah bahwa server harus dapat mengidentifikasi siapa yang membuat permintaan.
BKSpurgeon
39

"Sesi" adalah istilah yang digunakan untuk merujuk pada waktu pengguna menelusuri situs web. Ini dimaksudkan untuk merepresentasikan waktu antara kedatangan pertama mereka di sebuah halaman di situs sampai saat mereka berhenti menggunakan situs. Dalam praktiknya, tidak mungkin untuk mengetahui kapan pengguna selesai dengan situs tersebut. Di sebagian besar server ada batas waktu yang secara otomatis mengakhiri sesi kecuali halaman lain diminta oleh pengguna yang sama.

Pertama kali pengguna menghubungkan beberapa jenis sesi ID dibuat (cara melakukannya tergantung pada perangkat lunak server web dan jenis otentikasi / login yang Anda gunakan di situs). Seperti cookie, ini biasanya tidak dikirim lagi ke URL karena ini masalah keamanan. Sebaliknya itu disimpan bersama dengan banyak hal lain yang secara kolektif juga disebut sebagai sesi. Variabel sesi seperti cookie - mereka pasangan nama-nilai yang dikirim bersama dengan permintaan untuk halaman, dan dikembalikan dengan halaman dari server - tetapi nama mereka didefinisikan dalam standar web.

Beberapa variabel sesi diteruskan sebagai tajuk HTTP . Mereka bolak-balik di belakang layar setiap halaman penelusuran sehingga mereka tidak muncul di browser dan memberi tahu semua orang sesuatu yang mungkin bersifat pribadi. Diantaranya adalah USER_AGENT, atau jenis browser yang meminta halaman, REFERRER atau halaman yang ditautkan ke halaman yang diminta, dll. Beberapa perangkat lunak server web menambahkan header mereka sendiri atau mentransfer data sesi tambahan khusus untuk perangkat lunak server. Tetapi yang standar didokumentasikan dengan cukup baik.

Semoga itu bisa membantu.

Tim Rourke
sumber
Saya tahu di server IIS yang saya gunakan, saya bisa mendapatkan nama pengguna dari header USER_NAME, tetapi itu mungkin khusus untuk IIS.
Tim Rourke
Apa yang dimaksud REFERRER di sini?
Gab 是 好人
@Gab 是 好人 REFERRER biasanya berarti string arbitrer yang dikirim klien dalam tajuk permintaan HTTP "Referer". Itu harus berisi URL sumber daya yang, Anda tahu, merujuk klien ke sumber daya saat ini.
Luke404
Terima kasih, seharusnya , jadi belum tentu. jadi saya pikir orang sering menggunakan header ini dengan semantik yang berbeda dari yang disarankan di RFC, kan?
Gab 是 好人
Pertama kamu menulis Like cookies, this usually doesn't get sent in the URL anymoredan kemudian Session variables are like cookies - they're name-value pairs sent along with a request for a page. Apa yang sebenarnya terjadi? Apakah itu dikirim saat Anda membuat permintaan lain kali?
KPMG
19

HTTP adalah protokol koneksi stateless, yaitu, server tidak dapat membedakan antara koneksi yang berbeda dari pengguna yang berbeda.

Oleh karena itu, muncul cookie, setelah klien menghubungkan pertama kali ke server, server menghasilkan id sesi baru, yang nantinya akan dikirim ke klien sebagai nilai cookie. Dan mulai sekarang, id sesi ini akan mengidentifikasi koneksi klien itu, karena di dalam setiap permintaan HTTP ia akan melihat id sesi yang sesuai di dalam cookie.

Sekarang untuk setiap sesi id, server menyimpan beberapa struktur data, yang memungkinkan dia untuk menyimpan data khusus untuk pengguna, struktur data ini Anda dapat memanggil sesi secara abstrak.

Artem Barger
sumber
1
Bisakah Anda menjelaskan lebih lanjut tentang ini - "Sekarang untuk setiap sesi id, server menyimpan beberapa struktur data, yang memungkinkannya untuk menyimpan data khusus untuk pengguna, struktur data ini Anda dapat memanggil sesi secara abstrak."? Informasi klien spesifik apa yang disimpan oleh server?
realPK
Bisakah Anda menjelaskan lebih lanjut tentang ini - "Sekarang untuk setiap sesi id, server menyimpan beberapa struktur data, yang memungkinkannya untuk menyimpan data khusus untuk pengguna, struktur data ini Anda dapat memanggil sesi secara abstrak."? Informasi klien spesifik apa yang disimpan oleh server?
Gab 是 好人
Pertanyaan yang sama seperti di atas juga, akan sangat membantu jika Anda merespons.
Suraj Jain
4

Pikirkan HTTP sebagai seseorang (A) yang memiliki KEHILANGAN MEMORI JANGKA PENDEK dan melupakan setiap orang begitu orang tersebut hilang dari pandangan.

Sekarang, untuk mengingat orang yang berbeda, A mengambil foto orang itu dan menyimpannya. Foto Setiap Orang memiliki nomor ID. Ketika orang itu kembali terlihat, orang itu memberitahukan nomor IDnya ke A dan A menemukan gambar mereka berdasarkan nomor ID. Dan voila !!, A tahu siapa orang itu.

Sama dengan HTTP. Itu menderita KERUGIAN MEMORI JANGKA PENDEK. Ini menggunakan Sesi untuk merekam semua yang Anda lakukan saat menggunakan situs web, dan kemudian, ketika Anda datang lagi, itu mengidentifikasi Anda dengan bantuan Cookie (Cookie seperti token). Gambar adalah Sesi di sini, dan ID adalah Cookie di sini.

Salam Luv33
sumber