Apa itu cookie "bertanda tangan" di connect / expressjs?

114

Saya mencoba mencari tahu apa sebenarnya "cookie bertanda tangan". Tidak banyak di internet, dan jika saya mencoba ini:

app.use(express.cookieParser('A secret'));

Tapi tetap saja ... Cookie masih 100% normal di browser, dan saya tidak begitu tahu apa yang "ditandatangani" di sini (saya berharap untuk "melihat" beberapa keanehan pada klien, seperti data yang dienkripsi menggunakan "Rahasia" seperti garam?)

Dokumentasinya mengatakan ( https://github.com/expressjs/cookie-parser ):

Parse Cookie header dan isi req.cookies dengan objek yang dikunci oleh nama cookie. Secara opsional, Anda dapat mengaktifkan dukungan cookie bertanda tangan dengan meneruskan secretstring, yang menetapkan req.secretsehingga dapat digunakan oleh middleware lain.

Ada yang tahu

Merc.

Merc
sumber

Jawaban:

135

Cookie akan tetap terlihat, tetapi memiliki tanda tangan, sehingga dapat mendeteksi jika klien mengubah cookie.

Ia bekerja dengan membuat HMAC dari nilai (cookie saat ini), dan base64 mengkodekannya. Saat cookie dibaca, ia menghitung ulang tanda tangannya dan memastikannya cocok dengan tanda tangan yang dilampirkan padanya.

Jika tidak sesuai maka akan memberikan error.

Jika Anda ingin menyembunyikan konten cookie juga, Anda harus mengenkripsinya (atau hanya menyimpannya di sesi sisi server). Saya tidak yakin apakah ada middleware untuk itu sudah di luar sana atau tidak.

Edit

Dan untuk membuat cookie yang ditandatangani, Anda akan menggunakan

res.cookie('name', 'value', {signed: true})

Dan untuk mengakses cookie yang ditandatangani, gunakan signedCookiesobjek req:

req.signedCookies['name']
staackuser2
sumber
Terima kasih! Tapi ... Saya tidak melihat tanda tangan ditambahkan ke cookie saat ini. Artinya, di klien cookie ada tanpa tanda tangan. Apakah ada yang perlu saya lakukan untuk mengaktifkan penandatanganan cookie, selain menyertakan pesan rahasia di express.cookieParser()?
Merc
Tunggu ... Saya menyetel cookie dengan res.cookie('somethingElseAgainAndAgain', 'signed? Maybe' );tetapi ... Saya ragu itu menandatanganinya! Middleware cookieParser () siap untuk mengurai cookie yang ditandatangani, tetapi saya jelas tidak melakukan pengaturan dengan benar ... apakah saya harus menandatanganinya secara manual ...?
Merc
6
Itu: (res.cookie(name, value, { signed: true })). Melaporkan "detail" yang hilang dari dokumentasi ...
Merc
6
Membajak sesi adalah sesuatu yang berbeda ... yaitu pengguna B menggunakan identitas pengguna A. Cookie yang ditandatangani hanyalah cara untuk memverifikasi bahwa konten cookie belum diubah oleh pengguna, sehingga konten dapat dipercaya.
staackuser2
9
Layak disebutkan If it does not match, then it will give an error.Bukan kesalahan . Hanya request.signedCookie untuk kunci itu yang tidak disetel . Jadi lebih seperti diabaikan
basarat
25

Yup seperti emostar menyebutkan itu hanya untuk memastikan bahwa suatu nilai tidak dirusak. Itu ditempatkan di objek yang berbeda (req.signedCookies) untuk membedakan keduanya, memungkinkan pengembang untuk menunjukkan maksud. Jika mereka disimpan dalam req.cookies bersama dengan yang lain, seseorang dapat dengan mudah membuat cookie unsigned dengan nama yang sama, mengalahkan tujuan keseluruhan dari cookie tersebut.

TJ Holowaychuk
sumber
11

Saya telah mencari cukup ekstensif untuk jawaban yang bagus untuk ini ... Dan melihat kode sumber cookie-signature, yang digunakan oleh cookie-parseruntuk menandatangani cookie yang ditandatangani telah memberi saya pemahaman yang lebih baik tentang apa itu cookie yang ditandatangani.

valtentu saja merupakan nilai cookie, dan secretmerupakan string yang Anda tambahkan sebagai opsi cookie-parser

https://github.com/visionmedia/node-cookie-signature/blob/master/index.js#L16

Anders Östman
sumber
3
Berikut adalah tautan kanonik yang dipertahankan: github.com/tj/node-cookie-signature/blob/…
Membaca kode memang merupakan penjelasan yang jauh lebih baik. Terima kasih!
0

Saya menggunakan cookie-parser versi 1.4.4.

Saya dapat menambahkan cookie yang ditandatangani dan cookie yang ditandatangani dienkripsi di browser, Jika saya mencoba mengedit cookie yang ditandatangani menggunakan editThisCookie (plugin chrome), maka cookie-parser mendeteksi perubahan eksternal dan kemudian menetapkan false sebagai nilai.

response.cookie('userId',401,{signed: true})

Header respons di browser, muncul sebagai

Set-Cookie: empId=s%3A101.US2oSV4TSvfkvvEQ5fj1sXsjj8rNxx2ph4VdHNTuKX8; Path=/

Dapatkan cookie yang ditandatangani

request.signedCookies

https://gist.github.com/dineshbalaji/607d166f0240f932a5cb02099b0ece4c

Dinesh
sumber