152 votes

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

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'essaie 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 qui est "signé" ici (j'espérais en quelque sorte "voir" une bizarrerie sur le client, quelque chose comme les données cryptées en utilisant "A secret" comme sel ?)

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

Analyser Cookie et remplir l'en-tête req.cookies avec un objet dont la clé est le nom du cookie. En option, vous pouvez activer le support des cookies signés en passant a secret qui attribue req.secret alors qu'il puisse être utilisé par d'autres logiciels intermédiaires.

Quelqu'un le sait-il ?

Merc.

0 votes

Il convient de noter que la signature d'un cookie n'est pas strictement nécessaire si l'entropie de la valeur du cookie (c'est-à-dire l'identifiant de session) est déjà élevée, et comparable à l'entropie de la signature elle-même (256 bits dans le cas de HMAC SHA256). Ceci est bien expliqué aquí y .

176voto

emostar Points 4662

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

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

S'il ne correspond pas, un message d'erreur sera émis.

Si vous voulez également cacher le contenu du cookie, vous devez le crypter (ou le stocker dans la session côté serveur). Je ne suis pas sûr qu'il existe déjà un intergiciel pour cela ou non.

Modifier

Et pour créer un cookie signé, vous devez utiliser

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

Et pour accéder à un cookie signé, utilisez le signedCookies objet de req :

req.signedCookies['name']

1 votes

Merci. Mais... Je ne vois pas la signature apposée au cookie pour le moment. En d'autres termes, dans le client, le cookie est là sans signature. Y a-t-il quelque chose que je doive faire pour activer la signature du cookie, autre que l'inclusion du message secret dans le fichier de données de l'utilisateur ? express.cookieParser() ?

0 votes

Attendez... Je configure les cookies avec res.cookie('somethingElseAgainAndAgain', 'signed? Maybe' ); mais... Je doute que ce soit lui qui le signe ! Le middleware cookieParser() est là, prêt à analyser les cookies signés, mais je ne fais certainement pas le bon réglage... Dois-je les signer manuellement ?

0 votes

Ce serait tout ce qu'il faut, peut-être que votre cookie date d'avant que vous n'ayez ajouté le secret ? Essayez d'enlever le cookie pour voir si cela le met en marche.

28voto

TJ Holowaychuk Points 116

Comme Emostar le mentionne, c'est simplement pour s'assurer qu'une valeur n'a pas été altérée. Il est placé dans un objet différent (req.signedCookies) pour faire la différence entre les deux, permettant au développeur de montrer son 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.

12voto

Anders Östman Points 422

J'ai cherché assez longtemps une bonne réponse à cette question... Et en regardant le code source de cookie-signature qui est utilisé par cookie-parser pour signer les cookies signés m'ont permis de mieux comprendre ce qu'est un cookie signé.

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

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

3 votes

Voici un lien canonique préservé : github.com/tj/node-cookie-signature/blob/

0 votes

La lecture du code était en effet une bien meilleure explication. Merci !

2voto

Dinesh Points 51

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

J'ai pu ajouter des cookies signés et le cookie signé est crypté dans le navigateur, si j'essaie de modifier le cookie signé en utilisant editThisCookie (plugin chrome) alors le cookie-parser détecte le changement externe et met false comme valeur.

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

L'en-tête de réponse dans le navigateur, apparaît comme

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

Obtenir un cookie signé

request.signedCookies

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X