Bagaimana sesi bekerja di Express.js dengan Node.js?

96

Menggunakan Express.js , sesi sangat sederhana. Saya ingin tahu bagaimana sebenarnya mereka bekerja.

Apakah itu menyimpan beberapa cookie di klien? Jika ya, di mana saya dapat menemukan cookie itu? Jika diperlukan, bagaimana cara mendekodekannya?

Pada dasarnya saya ingin dapat melihat apakah pengguna masuk, bahkan ketika pengguna tidak benar-benar berada di situs pada saat itu (seperti bagaimana facebook tahu Anda masuk saat Anda berada di situs lain). Tapi saya kira untuk memahami bahwa saya harus terlebih dahulu memahami bagaimana sesi bekerja.

foobar.dll
sumber

Jawaban:

43

Saya belum pernah menggunakan Express.js, meskipun menurut dokumentasi mereka tentang subjek ini kedengarannya seperti:

  • Cookie disimpan di klien, dengan kunci (yang akan digunakan server untuk mengambil data sesi) dan hash (yang akan digunakan server untuk memastikan data cookie tidak dirusak, jadi jika Anda mencoba dan mengubah nilai cookie tidak valid)

  • Data sesi, sebagai lawan dari beberapa kerangka kerja (misalnya, Play Framework !) Disimpan di server, jadi cookie lebih seperti placeholder untuk sesi daripada pemegang data sesi yang sebenarnya.

  • Dari sini , sepertinya data sesi di server ini secara default disimpan di memori, meskipun itu dapat diubah menjadi bentuk penyimpanan apa pun yang menerapkan API yang sesuai.

Jadi jika Anda ingin memeriksa sesuatu tanpa reqobjek permintaan khusus , seperti yang Anda katakan, Anda hanya perlu mengakses penyimpanan yang sama. Di bagian bawah halaman dokumentasi pertama, terdapat detail metode yang diperlukan penyimpanan yang perlu diterapkan, jadi jika Anda terbiasa dengan API penyimpanan Anda, mungkin Anda dapat mengeksekusi .getAll()jika ada, dan mengulang melalui data sesi dan membaca apa pun. nilai-nilai yang Anda inginkan.

davin
sumber
166

Gambaran

Express.js menggunakan cookie untuk menyimpan id sesi (dengan tanda tangan enkripsi) di browser pengguna dan kemudian, pada permintaan berikutnya, menggunakan nilai cookie itu untuk mengambil informasi sesi yang disimpan di server. Penyimpanan sisi server ini dapat berupa penyimpanan memori (default) atau penyimpanan lain yang menerapkan metode yang diperlukan (seperti connect-redis ).

Detail

Express.js / Connect membuat string Base64 24 karakter menggunakan utils.uid(24)dan menyimpannya di req.sessionID. String ini kemudian digunakan sebagai nilai dalam cookie.

Sisi klien

Cookie yang ditandatangani selalu digunakan untuk sesi, jadi nilai cookie akan memiliki format berikut.

[sid].[signature]

Di mana [sid] adalah sessionID dan [tanda tangan] dihasilkan dengan menandatangani [sid] menggunakan kunci rahasia yang disediakan saat menginisialisasi session middleware. Langkah penandatanganan dilakukan untuk mencegah gangguan. Ini harus secara komputasi tidak dapat diukur untuk memodifikasi [sid] dan kemudian membuat ulang [tanda tangan] tanpa pengetahuan tentang kunci rahasia yang digunakan. Cookie sesi masih rentan terhadap pencurian dan penggunaan kembali, jika tidak diperlukan modifikasi [sid].

Nama untuk cookie ini adalah

connect.sid

Sisi server

Jika penangan muncul setelah middleware cookieParserdan sessionitu akan memiliki akses ke variabel req.cookies. Ini berisi objek JSON yang kuncinya adalah kunci cookie dan nilainya adalah nilai cookie. Ini akan berisi kunci bernamaconnect.sid dan nilainya akan menjadi pengidentifikasi sesi yang ditandatangani.

Berikut adalah contoh cara menyiapkan rute yang akan memeriksa keberadaan cookie sesi di setiap permintaan dan mencetak nilainya ke konsol.

app.get("/*", function(req, res, next) {

    if(typeof req.cookies['connect.sid'] !== 'undefined') {
        console.log(req.cookies['connect.sid']);
    }

    next(); // Call the next middleware
});

Anda juga harus memastikan router ( app.use(app.router)) disertakan setelah cookieParserdan sessiondi bagian konfigurasi Anda.

Berikut ini adalah contoh data yang disimpan secara internal oleh Express.js / Connect.

{
  "lastAccess": 1343846924959,
  "cookie": {
    "originalMaxAge": 172800000,
    "expires": "2012-08-03T18:48:45.144Z",
    "httpOnly": true,
    "path": "/"
  },
  "user": { 
    "name":"waylon",
    "status":"pro"
  }
}

The userlapangan kustom. Yang lainnya adalah bagian dari manajemen sesi.

Contohnya dari Express 2.5.

Waylon Flinn
sumber
1
saat mencetak nilai cookie dengan console.log, ini memberikan cookie yang dikodekan (ditandatangani). bagaimana cara mendapatkan informasi yang sebenarnya?
vsync
Apa yang Anda maksud dengan - "Cookie sesi masih rentan terhadap pencurian dan penggunaan kembali, jika tidak diperlukan modifikasi [sid]."? karena SID dibuat dengan express, kita tidak pernah bisa mengubahnya kan?
Hrushikesh
2
@WebHrushi Saya sedang memikirkan serangan Man-in-the-Middle: en.wikipedia.org/wiki/Man-in-the-middle_attack
Waylon Flinn
Adakah yang bisa membantu saya dengan pertanyaan ini: stackoverflow.com/questions/21982791/…
roundrobin
bagaimana cara membuat token untuk session_id tertentu ??
aman verma
9

Saya ingin tahu bagaimana sebenarnya mereka bekerja.

Cobalah untuk melihat jawaban ini dan hal-hal wiki .

Apakah itu menyimpan beberapa cookie di klien?

Ya, biasanya cookie dengan ID sesi yang ditetapkan, yang harus ditandatangani dengan rahasia untuk mencegah pemalsuan.

Jika ya, di mana saya dapat menemukan cookie itu? Jika diperlukan, bagaimana cara mendekodekannya?

Anda tidak boleh mengacaukan cookie sesi di sisi klien. Jika Anda ingin bekerja dengan sesi di sisi server, Anda harus memeriksa express.js terkait dan menghubungkan dokumen.

yojimbo87
sumber
Pak, Bisakah kita bicara, saya ragu tentang semua ini.
Suraj Jain
0

Selain jawaban yang sudah bagus, berikut adalah 2 diagram yang saya buat untuk menjelaskan sesi Express, tautannya dengan cookie dan penyimpanan:

  • kue coklat: cokelat
  • kue stroberi: stroberi
abernier
sumber