cookie x sessão x jwt

12

Estou lendo sobre autenticação / autorização em aplicativos da web. Alguém poderia confirmar / corrigir meu conhecimento atual?

  • Cookies: na versão inicial, um arquivo de texto com um ID de cliente exclusivo e todas as outras informações necessárias sobre o cliente (por exemplo, funções)

  • Sessão: apenas o ID do cliente exclusivo é enviado em um arquivo (também chamado de cookie), todo o resto é armazenado no servidor

  • JWT: tudo é armazenado no token (que também pode ser armazenado em um arquivo de texto, também chamado de cookie)

Obrigado por qualquer feedback!

user3629892
fonte

Respostas:

12

Cookies: na versão inicial, um arquivo de texto com um ID de cliente exclusivo e todas as outras informações necessárias sobre o cliente (por exemplo, funções)

Cookies são tuplas key-valueoriginalmente endereçadas para reter dados relacionados à atividade do cliente. Essa retenção é o que conhecemos como estado da sessão ou aplicativo . Fundamentalmente, eles foram feitos para manter o estado dos aplicativos da web; mais especificamente, o estado no lado do cliente. (1)

Os cookies geralmente são definidos pelo servidor por meio de cabeçalhos de resposta ( Set-Cookie key=value). No entanto, eles também podem ser definidos pelo cliente. Por exemplo, por DOM ( document.cookie).

Uma coisa importante a saber sobre cookies é que eles não identificam usuários. Eles preferem associar os dados terna - cliente - servidor / caminho . (3)

Geralmente, associamos cookies a arquivos, porque durante os primeiros dias dos navegadores da Web eles precisavam persistir de alguma forma, sendo os arquivos o suporte mais viável. Os navegadores de hoje armazenam cookies (entre outras coisas) em armazenamentos locais (bancos de dados incorporados).

Sessão: apenas o ID do cliente exclusivo é enviado em um arquivo (também chamado de cookie); todo o resto é armazenado no servidor.

Por sessão, acho que você quer dizer sessões de servidor . Como comentei, as sessões também podem ser implementadas no lado do cliente. A diferença com as sessões do lado do cliente é que os dados são armazenados em algum lugar do lado do servidor. (2) Em tais cenários, o que obtemos é um ID de sessão; e nós o obtemos em forma de cookie. Sem o ID da sessão, o servidor não conseguiria correlacionar as solicitações recebidas com a atividade anterior do cliente. (3) Por exemplo, o usuário autenticado, o carrinho de compras etc.

De qualquer forma, um ID de sessão não identifica necessariamente um usuário. Ele associa um estado de aplicativo específico a um cliente da web. As sessões podem ou não conter dados do usuário.

Nos aplicativos distribuídos, a sessão deve ser serializada por razões óbvias. Se eles estiverem armazenados na memória, o armazenamento na memória (componente) deve ser serializável. Uma solução comum é armazenar sessões em arquivos. Ou no NoSQL DB como Redis.

Em relação à segurança. As sessões do lado do servidor são mais seguras que do lado do cliente. Os clientes são mais vulneráveis ​​a ameaças porque os usuários geralmente desconhecem as tantas ameaças às quais estão expostos. Pelo menos não o usuário comum.

Por outro lado, atacar uma infra-estrutura do lado do servidor não é rival.

JWT: tudo é armazenado no token (que também pode ser armazenado em um arquivo de texto, também chamado de cookie)

Na verdade não. A JWT armazena dados principalmente relacionados à autorização e ao emissor do token.

Embora eles usem para conter o ID do usuário (sub), encontramos JWTs que não identificam usuários autenticados. Por exemplo, tokens para sessões de convidados. O conteúdo principal das JWTs são reivindicações ; itens a serem verificados pelo processo de autorização.

É importante ter em mente que as JWTs não são armazenamentos globais . A sessão ou o estado do aplicativo ainda precisa ser armazenado em algum lugar e gerenciado de forma independente.

Em relação às JWTs, elas geralmente são armazenadas como cookies, embora também possam ser armazenadas em armazenamentos locais. Além disso, a comunidade OWASP considera o sessionStorage o mais seguro para navegadores da web. No entanto, isso depende da versão do navegador .


1: A World Wide Web deve ser apátrida. Se quisermos criar aplicativos do lado do servidor sem estado, as sessões deverão ser armazenadas em algum lugar do lado do cliente.

2: Transformando o aplicativo do servidor em um aplicativo com estado .

3: Cliente como aplicativo, não como usuário.

Laiv
fonte
Id note que alguns, como a configuração padrão do Ruby on Rails, armazenam todo o objeto "session" em um cookie (atualmente normalmente criptografado), que pode simplesmente conter algo parecido user_idcom um usuário logado.
Fire Lancer
7

Cookies: na versão inicial, um arquivo de texto com um ID de cliente exclusivo e todas as outras informações necessárias sobre o cliente (por exemplo, funções)

Sua definição de cookie não descreve realmente o que eles fazem. Um cookie é um par de valores-chave definido pelo cabeçalho de resposta HTTP ( Set-Cookie) pelo servidor e armazenado pelos clientes que os suportam. Os cookies são enviados de volta com cada solicitação subsequente (no Cookiecabeçalho) para solicitações correspondentes ao esquema, host, caminho, https enquanto o cookie não tiver expirado. Você pode armazenar o que quiser em um cookie e permitir o suporte ao estado no protocolo sem estado do HTTP.

Um exemplo de troca de cookies se parece com isso:

insira a descrição da imagem aqui

Sessão: apenas o ID do cliente exclusivo é enviado em um arquivo (também chamado de cookie), todo o resto é armazenado no servidor

Isso está certo. Uma sessão são dados armazenados no lado do servidor sobre a sessão atual de um usuário. Para fazer isso funcionar em um protocolo sem estado como HTTP, o usuário deve enviar seu ID de sessão com cada solicitação, para que o servidor possa buscar a sessão correta para o usuário. O ID da sessão é normalmente armazenado em um cookie (veja acima). Este não é um cookie diferente de qualquer outro cookie, os dados são apenas o ID do servidor para a sessão do usuário.

JWT: tudo é armazenado no token (que também pode ser armazenado em um arquivo de texto, também chamado de cookie)

Isso é verdade. Tudo é armazenado no token. O token pode ser armazenado em um cookie (veja acima). Essa é uma alternativa às sessões do servidor e funciona porque o token é assinado e verificado pelo servidor, portanto, não pode ser alterado ou forjado, e é seguro armazenar no lado do cliente.

Samuel
fonte
Normalmente, os JWTs não são armazenados em cookies na minha experiência. Eles poderiam estar, mas mais frequentemente eu os vi em seus próprios cabeçalhos (ou freqüentemente no cabeçalho de Autorização) no caminho para o servidor e armazenados na memória ou no armazenamento local ou de sessão no cliente.
Paulo
11
@Paul em relação ao armazenamento local. Depende do cliente. Nem todos os clientes e nem toda a versão dos clientes mais usados ​​suportam armazenamento na web. Dê uma olhada aqui . Se forem, é preferível tornar os tokens sazonais . Mas, se nossos clientes não suportarem armazenamento local; Os cookies Httponly + SSL + fingerPrints do cliente nos fornecem uma implementação bastante segura.
LAIV
@ Laiv Não estou discordando de você; apenas que Samuel disse que "o token é armazenado em um cookie", e eu estava apenas tentando observar que esse nem sempre é o caso.
Paulo
@Paul, mudei para ler "... pode ser armazenado em um cookie"
Samuel