node.js - node - ¿Qué son las cookies "firmadas" en connect/expressjs?
npm cookieparser express (3)
He estado buscando bastante para encontrar una buena respuesta a esto ... Y al mirar el código fuente de cookie-signature
, que es utilizado por cookie-parser
para firmar las cookies firmadas, me ha dado una mejor comprensión de lo que es una cookie firmada .
val
es, por supuesto, el valor de la cookie, y el secret
es la cadena que se agrega como una opción para cookie-parser
https://github.com/visionmedia/node-cookie-signature/blob/master/index.js#L16
Estoy tratando de descubrir qué son realmente las "cookies firmadas". No hay mucho en la red, y si pruebo esto:
app.use(express.cookieParser(''A secret''));
Pero aun así ... Las cookies siguen siendo 100% normales en el navegador, y realmente no sé qué es lo que "firmó" aquí (estaba esperando "ver" algo de rareza en el cliente, algo así como los datos cifrados usando "Un secreto" como sal?)
La documentación dice ( https://github.com/expressjs/cookie-parser ):
Parse Cookie encabezado y poblar
req.cookies
con un objeto codificado por los nombres de las cookies. Opcionalmente, puede habilitar el soporte de cookies firmado pasando una cadenasecret
, que asignareq.secret
para que pueda ser utilizada por otro middleware.
¿Alguien sabe?
Merc.
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 base64 lo codifica. 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 encriptarlo en su lugar (o simplemente almacenarlo en la sesión del lado del servidor). No estoy seguro de si hay middleware para eso ya o no.
Editar
Y para crear una cookie firmada que usaría
res.cookie(''name'', ''value'', {signed: true})
Y para acceder a una cookie firmada, utilice el objeto de req
de cookies de req
:
req.signedCookies[''name'']
Sí, como emostar menciona, es simplemente para asegurar que un valor no haya sido manipulado. Se coloca en un objeto diferente (req.signedCookies) para diferenciar entre los dos, permitiendo que el desarrollador muestre la intención. Si estuvieran almacenados en req.cookies junto con los demás, alguien podría simplemente crear una cookie sin firma con el mismo nombre, derrotando todo el propósito de ellos.