Que sont les cookies «signés» dans connect / expressjs?

114

J'essaie de comprendre ce que sont réellement les «cookies signés». Il n'y a pas grand chose sur le net, et si j'essaye ceci:

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

Mais quand même ... Les cookies sont toujours 100% normaux sur le navigateur, et je ne sais pas vraiment ce que «signé» est ici (j'espérais en quelque sorte «voir» une certaine bizarrerie sur le client, quelque chose comme les données cryptées en utilisant "Un secret" comme du sel?)

La documentation dit ( https://github.com/expressjs/cookie-parser ):

Analyser l'en- tête de cookie et remplir req.cookies avec un objet saisi par les noms de cookie. Si vous le souhaitez, vous pouvez activer la prise en charge des cookies signés en passant une secretchaîne, qui l'assigne req.secretafin qu'elle puisse être utilisée par d'autres intergiciels.

Est-ce que quelqu'un sait?

Merc.

Merc
la source

Réponses:

135

Le cookie sera toujours visible, mais il a une signature, ce qui lui permet de détecter si le client a modifié le cookie.

Cela fonctionne en créant un HMAC de la valeur (cookie actuel) et en l'encodant en base64. Lorsque le cookie est lu, il recalcule la signature et s'assure qu'il correspond à la signature qui lui est attachée.

S'il ne correspond pas, cela donnera une erreur.

Si vous souhaitez également masquer le contenu du cookie, vous devez le chiffrer à la place (ou simplement le stocker dans la session côté serveur). Je ne sais pas s'il existe déjà un middleware pour cela ou non.

Éditer

Et pour créer un cookie signé, vous utiliseriez

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

Et pour accéder à un cookie signé, utilisez l' signedCookiesobjet de req:

req.signedCookies['name']
staackuser2
la source
Merci! Mais ... je ne vois pas la signature ajoutée au cookie pour le moment. Autrement dit, dans le client, le cookie est là sans signature. Dois-je faire quelque chose pour activer la signature des cookies, autre que d'inclure le message secret express.cookieParser()?
Merc
Attendez ... je mets les cookies avec res.cookie('somethingElseAgainAndAgain', 'signed? Maybe' );mais ... je doute que ce soit le signe! L'intergiciel cookieParser () est-il prêt à analyser les cookies signés, mais je ne fais certainement pas le réglage correctement ... dois-je les signer manuellement ...?
Merc
6
Il était: (res.cookie(name, value, { signed: true })). Signaler le "détail" manquant dans la documentation ...
Merc
6
Le détournement d'une session est quelque chose de différent ... c'est-à-dire que l'utilisateur B prend l'identité de l'utilisateur A. Les cookies signés ne sont qu'un moyen de vérifier que le contenu du cookie n'a pas été modifié par l'utilisateur, afin que le contenu puisse être approuvé.
staackuser2
9
Il vaut la peine de mentionner If it does not match, then it will give an error.Pas une erreur . Seul le request.signedCookie pour cette clé n'est pas défini . Donc plus comme ignoré
basarat
25

Ouais, comme emostar mentionne que c'est simplement pour s'assurer qu'une valeur n'a pas été falsifiée. Il est placé dans un objet différent (req.signedCookies) pour différencier les deux, permettant au développeur d'afficher l'intention. S'ils étaient stockés dans req.cookies avec les autres, quelqu'un pourrait simplement créer un cookie non signé du même nom, ce qui irait à l'encontre de leur objectif.

TJ Holowaychuk
la source
11

J'ai cherché assez longuement une bonne réponse à cette question ... Et en regardant le code source de cookie-signature, qui est utilisé parcookie-parser pour signer les cookies signés, m'a donné une meilleure compréhension de ce qu'est un cookie signé.

valest bien sûr la valeur du cookie, et secretest la chaîne que vous ajoutez comme option à cookie-parser

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

Anders Östman
la source
3
Voici un lien canonique conservé: github.com/tj/node-cookie-signature/blob/…
La lecture du code était en effet une bien meilleure explication. Merci!
0

J'ai utilisé la version 1.4.4 de cookie-parser.

Je pourrais ajouter des cookies signés et des cookies signés cryptés dans le navigateur.Si j'essaie de modifier le cookie signé à l'aide de editThisCookie (plugin chrome), alors le cookie-parser détecte les changements externes, puis définit false comme valeur.

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

En-tête de réponse dans le navigateur, apparaît comme

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

Obtenez un cookie signé

request.signedCookies

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

Dinesh
la source