O que são cookies “assinados” em connect / expressjs?

114

Estou tentando descobrir o que realmente são "cookies assinados". Não há muito na rede, e se eu tentar isso:

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

Mas ainda ... Os cookies ainda são 100% normais no navegador, e eu realmente não sei o que "assinado" é aqui (eu estava meio que esperando "ver" alguma estranheza no cliente, algo como os dados criptografados usando "Um segredo" como sal?)

A documentação diz ( https://github.com/expressjs/cookie-parser ):

Analisar o cabeçalho do cookie e preencher req.cookies com um objeto codificado pelos nomes dos cookies. Opcionalmente, você pode habilitar o suporte a cookies assinados passando uma secretstring, que é atribuída req.secretpara que possa ser usada por outro middleware.

Alguém sabe?

Merc.

Merc
fonte

Respostas:

135

O cookie ainda estará visível, mas tem uma assinatura, para que possa detectar se o cliente modificou o cookie.

Funciona criando um HMAC do valor (cookie atual) e codificado em base64. Quando o cookie é lido, ele recalcula a assinatura e certifica-se de que corresponde à assinatura anexada a ele.

Se não corresponder, ocorrerá um erro.

Se você quiser ocultar o conteúdo do cookie também, deverá criptografá-lo (ou apenas armazená-lo na sessão do servidor). Não tenho certeza se existe um middleware para isso ou não.

Editar

E para criar um cookie assinado, você usaria

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

E para acessar um cookie assinado, use o signedCookiesobjeto de req:

req.signedCookies['name']
staackuser2
fonte
Obrigado! Mas ... não estou vendo a assinatura anexada ao cookie no momento. Ou seja, no cliente o cookie está lá sem assinatura. Preciso fazer algo para habilitar a assinatura do cookie, além de incluir a mensagem secreta no express.cookieParser()?
Merc de
Espera res.cookie('somethingElseAgainAndAgain', 'signed? Maybe' );aí ... Estou colocando os cookies com mas ... Duvido que seja assinando! O middleware cookieParser () está pronto para analisar cookies assinados, mas definitivamente não estou fazendo a configuração certa ... tenho que assiná-los manualmente ...?
Merc de
6
Era: (res.cookie(name, value, { signed: true })). Relatando o "detalhe" ausente da documentação ...
Merc
6
O sequestro de uma sessão é algo diferente ... ou seja, o usuário B obtém a identidade do usuário A. Os cookies assinados são apenas uma forma de verificar se o conteúdo do cookie não foi alterado pelo usuário, para que o conteúdo seja confiável.
staackuser2
9
Vale a pena mencionar If it does not match, then it will give an error.Não é um erro . Apenas o request.signedCookie para essa chave não foi definido . Então, mais como ignorado
basarat em
25

Sim, como emostar menciona, é simplesmente para garantir que um valor não foi adulterado. Ele é colocado em um objeto diferente (req.signedCookies) para diferenciar os dois, permitindo que o desenvolvedor mostre a intenção. Se eles fossem armazenados em req.cookies junto com os outros, alguém poderia simplesmente criar um cookie não assinado com o mesmo nome, anulando todo o propósito deles.

TJ Holowaychuk
fonte
11

Tenho pesquisado bastante por uma boa resposta para isso ... E olhando para o código-fonte do cookie-signature, que é usado por cookie-parserpara assinar os cookies assinados, me deu uma compreensão melhor do que é um cookie assinado.

valé, obviamente, o valor do cookie, e secreté a string que você adiciona como opção para cookie-parser

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

Anders Östman
fonte
3
Aqui está um link canônico preservado: github.com/tj/node-cookie-signature/blob/…
Ler o código foi de fato uma explicação muito melhor. Obrigado!
0

Eu usei a versão 1.4.4 do analisador de cookies.

Eu poderia adicionar cookies assinados e cookies assinados criptografados no navegador, se eu tentar editar o cookie assinado usando editThisCookie (plug-in do Chrome), o analisador de cookies detecta a mudança externa e, em seguida, define false como valor.

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

Cabeçalho de resposta no navegador, aparece como

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

Obter cookie assinado

request.signedCookies

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

Dinesh
fonte