JWT vs cookies para autenticação baseada em token

112

Eu li alguns posts sobre "JWT vs Cookie", mas eles só me deixaram mais confuso ...

  1. Eu quero alguns esclarecimentos , quando as pessoas falam sobre "autenticação baseada em token vs cookies", os cookies aqui se referem apenas a cookies de sessão . Meu entendimento é que o cookie é como um meio , ele pode ser usado para implementar uma autenticação baseada em token (armazenar algo que possa identificar o usuário conectado no lado do cliente ) ou uma autenticação baseada em sessão (armazenar uma constante no lado do cliente que corresponda às informações da sessão no lado do servidor )

  2. Por que precisamos do token da web JSON ? Eu estava usando o cookie padrão para implementar a autenticação baseada em token ( sem usar a id de sessão, não usar a memória do servidor ou armazenamento de arquivo ) :,Set-Cookie: user=innocent; preferred-color=azure e a única diferença que observei é que o JWT contém carga útil e assinatura ... enquanto você pode escolher entre o cookie assinado ou de texto simples para o cabeçalho http. Na minha opinião, o cookie assinado ( cookie:'time=s%3A1464743488946.WvSJxbCspOG3aiGi4zCMMR9yBdvS%2B6Ob2f3OG6%2FYCJM') é mais eficiente em termos de espaço, a única desvantagem é que o cliente não pode ler o token, apenas o servidor pode ... mas acho que está tudo bem porque, assim como a declaração no JWT é opcional, não é necessário que o token seja significativo

watashiSHUN
fonte

Respostas:

164

A maior diferença entre tokens de portador e cookies é que o navegador enviará cookies automaticamente , onde os tokens de portador precisam ser adicionados explicitamente à solicitação HTTP.

Esse recurso torna os cookies uma boa maneira de proteger sites, onde um usuário faz login e navega entre as páginas usando links.

O navegador que envia cookies automaticamente também tem uma grande desvantagem, que são os ataques CSRF . Em um ataque CSRF, um site malicioso tira proveito do fato de que seu navegador irá anexar automaticamente cookies de autenticação a solicitações para aquele domínio e engana seu navegador para executar uma solicitação.

Suponha que o site em https://www.example.com permita que usuários autenticados alterem suas senhas, POST-ing a nova senha para https://www.example.com/changepassword sem exigir que o nome de usuário ou senha antiga seja postado.

Se você ainda estiver conectado a esse site quando visitar um site malicioso que carrega uma página em seu navegador que dispara um POST para esse endereço, seu navegador anexará fielmente os cookies de autenticação, permitindo que o invasor altere sua senha.

Os cookies também podem ser usados ​​para proteger os serviços da web, mas hoje em dia os tokens de portador são usados ​​com mais frequência. Se você usar cookies para proteger seu serviço da web, esse serviço precisa residir no domínio para o qual os cookies de autenticação estão definidos, como o política de mesma origem não enviará cookies para outro domínio.

Além disso, os cookies tornam mais difícil para aplicativos não baseados em navegador (como aplicativos de celular para tablet) consumir sua API.

MvdD
fonte
6
"Se você ainda estiver conectado a esse site quando visitar um site malicioso que carrega uma página em seu navegador que dispara um POST para esse endereço, seu navegador anexará fielmente os cookies de autenticação, permitindo que o invasor altere sua senha." O CORS não impede isso?
kbuilds de
17
@kbuilds Only é a página maliciosa usando AJAX para POSTAR o formulário. Se o invasor fizer com que você clique no botão enviar em um formulário normal, o CORS não entra em jogo.
MvdD
3
mas isso não significa que o site só ficaria vulnerável se não houvesse tokens CSRF sendo usados?
kbuilds
5
Certo, você pode mitigar ataques CSRF usando tokens CSRF. Mas isso é algo que você deve fazer explicitamente.
MvdD
2
o uso de cookies protege você de ataques XSS, no entanto, para poder definir o cabeçalho de autorização, você precisa acessar o token de acesso do javascript; é fácil se proteger de CSRF, mas XSS é muito mais difícil de se proteger - os tokens de portador são mais significativos, mas têm um preço
kataik
101

Visão geral

O que você está pedindo é a diferença entre cookies e tokens de portador para enviar JSON Web Tokens (JWTs) do cliente para o servidor.

Cookies e tokens de portador enviam dados.

Uma diferença é que os cookies são para enviar e armazenar dados arbitrários, enquanto os tokens de portador são especificamente para enviar dados de autorização.

Esses dados geralmente são codificados como um JWT.

Biscoito

Um cookie é um par nome-valor, que é armazenado em um navegador da web e que tem uma data de validade e domínio associado.

Armazenamos cookies em um navegador da web com JavaScript ou com um cabeçalho de resposta HTTP.

document.cookie = 'my_cookie_name=my_cookie_value'   // JavaScript
Set-Cookie: my_cookie_name=my_cookie_value           // HTTP Response Header

O navegador da web envia cookies automaticamente com cada solicitação ao domínio do cookie.

GET http://www.bigfont.ca
Cookie: my_cookie_name=my_cookie_value               // HTTP Request Header

Token do portador

Um token do portador é um valor que entra no Authorizationcabeçalho de qualquer solicitação HTTP. Não é armazenado automaticamente em nenhum lugar, não tem data de validade e não tem domínio associado. É apenas um valor. Armazenamos manualmente esse valor em nossos clientes e adicionamos manualmente esse valor ao cabeçalho de autorização HTTP.

GET http://www.bigfont.ca
Authorization: Bearer my_bearer_token_value          // HTTP Request Header

JWT e autenticação baseada em token

Quando fazemos autenticação baseada em token, como OpenID, OAuth ou OpenID Connect, recebemos um access_token (e às vezes id_token) de uma autoridade confiável. Normalmente, queremos armazená-lo e enviá-lo junto com as Solicitações HTTP para recursos protegidos. Como fazemos isso?

A opção 1 é armazenar o (s) token (s) em um cookie. Isso lida com o armazenamento e também envia automaticamente o (s) token (s) ao servidor noCookie cabeçalho de cada solicitação. O servidor então analisa o cookie, verifica o (s) token (s) e responde de acordo.

Outra opção é armazenar o token no armazenamento local / de sessão e, em seguida, definir manualmente o Authorization cabeçalho de cada solicitação. Nesse caso, o servidor lê o cabeçalho e procede como um cookie.

Vale a pena ler os RFCs vinculados para saber mais.

Shaun Luttin
fonte
22

Além do que o MvdD disse sobre o envio automático de cookies:

  1. Um cookie pode ser um meio, mas sua função mais significativa é como ele interage com o navegador. Os cookies são definidos pelo servidor e enviados em solicitações de maneiras muito específicas. O JWT, por outro lado, é exclusivamente um meio, é uma afirmação de alguns fatos em uma estrutura particular. Se você quiser, pode colocar um JWT como seu cookie de autenticação. Quando você lê artigos comparando-os, eles geralmente falam sobre o uso de um JWT enviado como um token de portador pelo código de front-end em vez de um cookie de autenticação que corresponde a alguma sessão em cache ou dados do usuário no back-end.
  2. O JWT oferece muitos recursos e os coloca em um padrão para que possam ser usados ​​entre as partes. Um JWT pode atuar como uma afirmação assinada de alguns fatos em muitos lugares diferentes. Um cookie, não importa quais dados você coloque nele ou se você assiná-lo, só faz sentido usar entre um navegador e um back end específico. O JWT pode ser usado do navegador ao back-end, entre back-ends controlados por diferentes partes (OpenId Connect é um exemplo) ou nos serviços de back-end de uma parte. Em relação ao seu exemplo específico de seus cookies assinados, você provavelmente pode obter as mesmas funções ("não usar o id de sessão, não usar a memória do servidor ou armazenamento de arquivo") que o JWT nesse caso de uso, mas você perde bibliotecas e revisão por pares de o padrão, além das questões de CSRF mencionadas na outra resposta.

Em resumo: as postagens que você está lendo provavelmente estão comparando o JWT como um token de portador para um cookie de autenticação para fins de autenticação de navegador para servidor. Mas o JWT pode fazer muito mais, ele traz padronização e recursos para uso fora do caso de uso em que você provavelmente está pensando.

kag0
fonte
4
Bom trabalho esclarecendo que a comparação é realmente entre tokens do portador e cookies.
Shaun Luttin
14

Embora os cookies possam aumentar o risco de ataques de CSRF por serem enviados automaticamente junto com as solicitações, eles podem diminuir o risco de ataques XSS quando oHttpOnly sinalizador é definido, porque qualquer script injetado na página não será capaz de ler o biscoito.

CSRF: um usuário clica em um link (ou visualiza imagens) no site de um invasor, o que faz com que o navegador envie uma solicitação ao site da vítima. Se a vítima usar cookies, o navegador incluirá automaticamente o cookie na solicitação e, se a solicitação GET puder causar qualquer ação não somente leitura, o site da vítima estará vulnerável ao ataque.

XSS: um invasor incorpora um script no site da vítima (o site da vítima só é vulnerável se as entradas não são higienizadas corretamente), e o script do invasor pode fazer qualquer coisa que o javascript tem permissão para fazer na página. Se você armazenar tokens JWT no armazenamento local, o script do invasor poderá ler esses tokens e também enviar esses tokens para um servidor que ele controla. Se você usar cookies com o HttpOnlysinalizador, o script do invasor não será capaz de ler seu cookie para começar. Dito isso, o script que eles injetaram com sucesso ainda será capaz de fazer qualquer coisa que o javascript pode fazer, então você ainda está hospedado no IMO (ou seja, enquanto eles podem não ser capazes de ler o cookie para enviá-lo para seu próprio servidor para uso posterior , eles podem enviar solicitações ao site vicitim usando XHR, que incluirá o cookie de qualquer maneira).

cwa
fonte
2

Ref - Necessário para JSON Web Token

Biscoitos

No caso de cookies, uma vez que o usuário tenha sido autenticado, o servidor do Gmail criará um ID de sessão único. Correspondendo a este id de sessão, ele armazenará na memória todas as informações do usuário necessárias ao servidor do Gmail para reconhecer o usuário e permitir a execução de operações.
Além disso, para todas as solicitações e respostas subsequentes, este id de sessão também será passado. Portanto, agora, quando o servidor receber uma solicitação, ele verificará a id da sessão. Usar este id de sessão irá verificar se há alguma informação correspondente. Isso permitirá que o usuário acesse o recurso e retorne a resposta junto com o id da sessão.

insira a descrição da imagem aqui

Desvantagens dos cookies

  • Os cookies / id de sessão não são independentes. É um token de referência. Durante cada validação, o servidor do Gmail precisa buscar as informações correspondentes.
  • Não é adequado para arquitetura de microsserviços envolvendo várias APIs e servidores

insira a descrição da imagem aqui

JWT

  • O JWT é independente. É um token de valor. Portanto, durante cada validação, o servidor do Gmail não precisa buscar as informações correspondentes.
  • É assinado digitalmente, então se alguém modificá-lo, o servidor saberá sobre ele
  • É mais adequado para arquitetura de microsserviços
  • Possui outras vantagens, como especificar o tempo de validade.

insira a descrição da imagem aqui

Batman Rises
fonte