2012-08-10 70 views
73

我想弄清楚「簽名餅乾」實際上是什麼。 沒有多少上了網,如果我試試這個:connect/expressjs中的「簽名」cookie是什麼?

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

但仍...餅乾仍然在瀏覽器上100%正常的,我真的不知道什麼是「簽名」是這裏(?我是那種希望能「看到」一些古怪的客戶端上,像使用「祕密」鹽加密的數據)

文檔說(https://github.com/expressjs/cookie-parser):

解析Cookie標題和填充req.cookies 與由cookie名稱鍵入的對象。可選 您可以啓用通過傳遞 一個secret字符串,它賦予req.secret所以 也可以通過其他中間件被用來簽署cookie支持。

有誰知道?

Merc。

回答

79

cookie將仍然是可見的,但它有一個簽名,因此它可以檢測,如果客戶端修改該Cookie。

它通過創建值(電流的cookie)的HMAC,並且base64編碼它。當cookie被讀取時,它會重新計算簽名並確保它與附加的簽名匹配。

如果不匹配,則會報錯。

如果你想隱藏的cookie的內容,以及,你應該將它加密(或只是將其存儲在服務器端會話)。我不確定是否有已經存在或未存在的中間件。

編輯

而要創建簽名的cookie,你會用

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

並訪問一個簽名的cookie使用的reqsignedCookies對象:

req.signedCookies['name'] 
+0

謝謝串!但是......我目前沒有看到附加到cookie上的簽名。也就是說,在客戶端,cookie在那裏沒有簽名。除了在'express.cookieParser()'中包含祕密消息之外,我還需要做些什麼來啓用cookie簽名? – Merc 2012-08-10 08:42:36

+0

掛上......我正在用'res.cookie('somethingElseAgainAndAgain','signed?Maybe')設置cookie,「但是......我懷疑這是簽名! cookieParser()中間件已經準備好解析已簽名的cookie,但我絕對沒有做正確的設置......我必須手動簽名......? – Merc 2012-08-10 08:50:32

+0

這將是所有需要的,也許你的cookie是來自你添加祕密之前?嘗試刪除cookie以查看是否將其啓動。 – staackuser2 2012-08-10 08:51:11

16

燁像emostar提到僅僅是爲了確保價值沒有被篡改。它被放置在一個不同的對象(r​​eq.signedCookies)中以區分這兩者,允許開發人員顯示意圖。如果他們和其他人一起被存儲在req.cookies中,那麼可以簡單地製作一個同名的未簽名cookie,從而擊敗他們的全部目的。

8

我一直在尋找一個好的答案,這個... 相當廣泛,望着cookie-signature的源代碼,所使用的cookie-parser簽署簽署餅乾給了我更好地瞭解什麼是籤餅乾是。

val是當然的cookie的值,並且secret是你作爲選項添加到cookie-parser

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

+2

這裏是一個保存的規範鏈接:https://github.com/tj/node-cookie-signature/blob/60f3be29232145e445aada51d520d370b0a52161/index.js#L16 – 2014-11-25 18:55:20

+0

閱讀代碼確實是一個更好的解釋。謝謝! – 2014-11-25 18:56:24