¿Qué son las cookies “firmadas” en connect / expressjs?

114

Estoy tratando de averiguar qué son realmente las "cookies firmadas". No hay mucho en la red, y si intento esto:

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

Pero aún así ... Las cookies siguen siendo 100% normales en el navegador, y realmente no sé qué es "firmado" aquí (tenía la esperanza de "ver" alguna rareza en el cliente, algo así como los datos cifrados con ¿"Un secreto" como la sal?)

La documentación dice ( https://github.com/expressjs/cookie-parser ):

Analizar el encabezado de la cookie y completar req.cookies con un objeto codificado por los nombres de las cookies. Opcionalmente, puede habilitar la compatibilidad con cookies firmadas pasando una secretcadena, que se asigna req.secretpara que pueda ser utilizada por otro middleware.

¿Alguien sabe?

Merc.

Merc
fuente

Respuestas:

135

La cookie seguirá siendo visible, pero tiene una firma, por lo que puede detectar si el cliente modificó la cookie.

Funciona creando un HMAC del valor (cookie actual) y lo codificó en base64. Cuando se lee la cookie, vuelve a calcular la firma y se asegura de que coincida con la firma adjunta.

Si no coincide, dará un error.

Si también desea ocultar el contenido de la cookie, debe cifrarlo en su lugar (o simplemente almacenarlo en la sesión del lado del servidor). No estoy seguro de si ya existe middleware para eso o no.

Editar

Y para crear una cookie firmada, usaría

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

Y para acceder a una cookie firmada utilice el signedCookiesobjeto de req:

req.signedCookies['name']
staackuser2
fuente
¡Gracias! Pero ... no veo la firma adjunta a la cookie en este momento. Es decir, en el cliente la cookie está ahí sin firma. ¿Hay algo que deba hacer para habilitar la firma de cookies, además de incluir el mensaje secreto express.cookieParser()?
Merc
Espera ... Estoy colocando las cookies con res.cookie('somethingElseAgainAndAgain', 'signed? Maybe' );pero ... ¡Dudo que lo esté firmando! El middleware cookieParser () está listo para analizar las cookies firmadas, pero definitivamente no estoy configurando correctamente ... ¿tengo que firmarlas manualmente ...?
Merc
6
Era: (res.cookie(name, value, { signed: true })). Reportando el "detalle" faltante de la documentación ...
Merc
6
Secuestrar una sesión es algo diferente ... es decir, el usuario B toma la identidad del usuario A. Las cookies firmadas son solo una forma de verificar que el contenido de la cookie no ha sido modificado por el usuario, por lo que se puede confiar en el contenido.
staackuser2
9
Vale la pena mencionar If it does not match, then it will give an error.No es un error . Solo la request.signedCookie para esa clave no está configurada . Así que más como ignorado
basarat
25

Sí, como menciona emostar, es simplemente para asegurarse de que un valor no haya sido manipulado. Se coloca en un objeto diferente (req.signedCookies) para diferenciar entre los dos, lo que permite al desarrollador mostrar su intención. Si se almacenan en req.cookies junto con los demás, alguien podría simplemente crear una cookie sin firmar con el mismo nombre, anulando todo su propósito.

TJ Holowaychuk
fuente
11

He estado buscando bastante una buena respuesta a esto ... Y mirando el código fuente de cookie-signature, que es utilizado por cookie-parserpara firmar las cookies firmadas, me ha dado una mejor comprensión de qué es una cookie firmada.

vales, por supuesto, el valor de la cookie, y secretes la cadena que agrega como opción a cookie-parser

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

Anders Östman
fuente
3
Aquí hay un enlace canónico conservado: github.com/tj/node-cookie-signature/blob/…
Leer el código fue de hecho una explicación mucho mejor. ¡Gracias!
0

Usé la versión de cookie-parser 1.4.4.

Podría agregar cookies firmadas y cookies firmadas encriptadas en el navegador. Si trato de editar la cookie firmada usando editThisCookie (complemento de Chrome), el analizador de cookies detecta el cambio externo y luego establece como valor falso.

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

Encabezado de respuesta en el navegador, aparece como

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

Obtener cookie firmada

request.signedCookies

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

Dinesh
fuente