Qual é a diferença entre autenticação de token e autenticação usando cookies?
Estou tentando implementar a demonstração do Ember Auth Rails, mas não entendo os motivos por trás do uso da autenticação de token, conforme descrito nas Perguntas frequentes do Ember Auth sobre a pergunta "Por que autenticação de token?"
Respostas:
Um aplicativo Web típico é praticamente sem estado , devido à sua natureza de solicitação / resposta . O protocolo HTTP é o melhor exemplo de protocolo sem estado . Mas como a maioria dos aplicativos da web precisa de estado , para manter o estado , entre servidor e cliente, os cookies são usados para que o servidor possa enviar todas as respostas de volta ao cliente. Isso significa que a próxima solicitação feita do cliente incluirá esse cookie e será reconhecida pelo servidor. Dessa forma, o servidor pode manter uma sessão com o cliente sem estado , sabendo principalmente tudo sobre o estado do aplicativo , mas armazenado no servidor. Nesse cenário, em nenhum momento o cliente mantémestado , que não é como o Ember.js funciona.
No Ember.js, as coisas são diferentes. O Ember.js facilita o trabalho do programador, pois detém de fato o estado para você, no cliente, sabendo a cada momento sobre seu estado sem precisar fazer uma solicitação ao servidor solicitando dados de estado .
No entanto, manter o estado no cliente também pode às vezes apresentar problemas de simultaneidade que simplesmente não estão presentes em situações sem estado . No entanto, o Ember.js também lida com esses problemas, especificamente dados do brasa são criados com isso em mente. Em conclusão, o Ember.js é uma estrutura projetada para clientes com estado .
O Ember.js não funciona como um aplicativo Web sem estado típico, em que a sessão , o estado e os cookies correspondentes são tratados quase completamente pelo servidor. O Ember.js mantém seu estado completamente em javascript (na memória do cliente e não no DOM como em outras estruturas) e não precisa do servidor para gerenciar a sessão. Isso resulta em Ember.js sendo mais versátil em muitas situações, por exemplo, quando seu aplicativo está no modo offline.
Obviamente, por razões de segurança, é necessário enviar algum tipo de token ou chave exclusiva ao servidor sempre que uma solicitação é feita para ser autenticada , dessa forma o servidor pode procurar o token de envio (que foi inicialmente emitido pelo servidor) e verifique se é válido antes de enviar uma resposta de volta ao cliente.
Na minha opinião, a principal razão pela qual usar um token de autenticação em vez de cookies, conforme indicado nas Perguntas frequentes sobre autenticação de Ember, é principalmente devido à natureza da estrutura Ember.js e também porque se encaixa mais no paradigma de aplicativo da Web com estado . Portanto, o mecanismo de cookie não é a melhor abordagem ao criar um aplicativo Ember.js.
Espero que minha resposta dê mais significado à sua pergunta.
fonte
Http é sem estado. Para autorizá-lo, você precisa "assinar" todas as solicitações enviadas ao servidor.
Autenticação de token
Uma solicitação ao servidor é assinada por um "token" - geralmente significa definir cabeçalhos http específicos, no entanto, eles podem ser enviados em qualquer parte da solicitação http (corpo do POST, etc.)
Prós:
<img src="http://bank.com?withdraw=1000&to=myself" />
, se você estiver conectado via autenticação de cookie ao bank.com, e bank.com não tiver meios XSRF proteção, retirarei dinheiro da sua conta simplesmente pelo fato de o seu navegador acionar uma solicitação GET autorizada para esse URL.) Observe que existem medidas antifalsificação que você pode fazer com a autenticação baseada em cookies - mas é necessário implementá-las.Autenticação de cookies
No geral, eu diria que os tokens oferecem uma melhor flexibilidade (já que você não está vinculado ao domínio único). A desvantagem é que você precisa fazer algumas codificações sozinho.
fonte
Are send out for every single request
Os tokens também são enviados para todos os pedidosOs tokens precisam ser armazenados em algum lugar (armazenamento local / sessão ou cookies)
Os tokens podem expirar como cookies, mas você tem mais controle
O armazenamento local / sessão não funciona entre domínios, use um cookie de marcador
Solicitações de comprovação serão enviadas em cada solicitação do CORS
Quando você precisar transmitir algo, use o token para obter uma solicitação assinada
É mais fácil lidar com XSS do que com XSRF
O token é enviado a cada solicitação, observe seu tamanho
Se você armazenar informações confidenciais, criptografe o token
Tokens da Web JSON podem ser usados no OAuth
Os tokens não são marcadores de prata; pense nos casos de uso de autorização com cuidado
http://blog.auth0.com/2014/01/27/ten-things-you-should-know-about-tokens-and-cookies/
http://blog.auth0.com/2014/01/07/angularjs-authentication-with-cookies-vs-token/
fonte
Para os googlers :
STATEFULNESS
MECANISMOS
Authorization
, são apenas cabeçalhos sem nenhum tratamento especial, o cliente precisa gerenciar todos os aspectos da transferênciaCOMPARAÇÃO DE DECLARAÇÃO
hash(data + secret key)
onde a chave secreta é conhecida apenas pelo servidor, para que a integridade dos dados do token possa ser verificadaCOMPARAÇÃO DO MECANISMO
httpOnly
impedir o acesso do cliente ao JavaScriptRESUMIR
Ligação
fonte
Eu acredito que há alguma confusão aqui. A diferença significativa entre a autenticação baseada em cookies e o que agora é possível com o HTML5 Web Storage é que os navegadores são criados para enviar dados de cookies sempre que solicitam recursos do domínio que os define. Você não pode impedir isso sem desativar os cookies. Os navegadores não enviam dados do Armazenamento na Web, a menos que o código da página os envie . E as páginas podem acessar apenas os dados que eles armazenaram, não os dados armazenados por outras páginas.
Portanto, um usuário preocupado com a maneira como seus dados de cookies podem ser usados pelo Google ou pelo Facebook pode desativar os cookies. Porém, eles têm menos motivos para desativar o Armazenamento na Web (até os anunciantes descobrirem uma maneira de usá-lo também).
Portanto, essa é a diferença entre cookie e token, o último usa o Web Storage.
fonte
A autenticação baseada em token é sem estado, o servidor não precisa armazenar informações do usuário na sessão. Isso permite escalar aplicativos sem se preocupar com o local em que o usuário efetuou login. Existe uma afinidade do Web Server Framework para cookies, enquanto isso não é um problema com base em token. Portanto, o mesmo token pode ser usado para buscar um recurso seguro de um domínio diferente daquele em que estamos conectados, o que evita outra autenticação uid / pwd.
Muito bom artigo aqui:
http://www.toptal.com/web/cookie-free-authentication-with-json-web-tokens-an-example-in-laravel-and-angularjs
fonte
Use token quando ...
Federação é desejada. Por exemplo, você deseja usar um provedor (dispensador de token) como emissor do token e, em seguida, usar o servidor api como validador do token. Um aplicativo pode se autenticar no Token Dispensor, receber um token e depois apresentá-lo ao servidor da API para verificação. (O mesmo funciona com o Logon do Google. Ou Paypal. Ou Salesforce.com. Etc)
Assincronia é necessária. Por exemplo, você deseja que o cliente envie uma solicitação e, em seguida, armazene essa solicitação em algum lugar, para ser acionado por um sistema separado "posteriormente". Esse sistema separado não terá uma conexão síncrona com o cliente e pode não ter uma conexão direta com um dispensário de token central. um JWT pode ser lido pelo sistema de processamento assíncrono para determinar se o item de trabalho pode e deve ser cumprido posteriormente. De certa forma, isso está relacionado à idéia da Federação acima. Mas tenha cuidado aqui: o JWT expira. Se a fila que contém o item de trabalho não for processada durante a vida útil do JWT, as declarações não serão mais confiáveis.
Solicitação assinada Cient é necessária. Aqui, a solicitação é assinada pelo cliente usando sua chave privada e o servidor validaria usando a chave pública já registrada do cliente.
fonte
Uma das principais diferenças é que os cookies estão sujeitos à Política de Mesma Origem, enquanto os tokens não. Isso cria todos os tipos de efeitos de downstream.
Como os cookies são enviados apenas para e de um host específico, esse host deve arcar com o ônus de autenticar o usuário e o usuário deve criar uma conta com dados de segurança com esse host para ser verificável.
Os tokens, por outro lado, são emitidos e não estão sujeitos à mesma política de origem. O emissor pode ser literalmente qualquer pessoa e cabe ao host decidir em quais emissores confiar. Normalmente, um emissor como o Google e o Facebook é bem confiável, para que um host possa transferir o ônus de autenticar o usuário (incluindo o armazenamento de todos os dados de segurança do usuário) para outra parte e o usuário possa consolidar seus dados pessoais em um emissor específico e não precisar se lembrar de um monte de senhas diferentes para cada host com o qual eles interagem.
Isso permite cenários de logon único que reduzem o atrito geral na experiência do usuário. Em teoria, a web também se torna mais segura à medida que surgem provedores de identidade especializados para fornecer serviços de autenticação, em vez de cada site ma e pa criando seus próprios sistemas de autenticação, provavelmente meio cozidos. E à medida que esses provedores surgem, o custo de fornecer recursos seguros da Web para tendências de recursos ainda mais básicos é zero.
Portanto, em geral, os tokens reduzem o atrito e os custos associados ao fornecimento de autenticação e transferem o ônus dos vários aspectos de uma web segura para as partes centralizadas, mais capazes de implementar e manter sistemas de segurança.
fonte