Autenticação de token vs. cookies

141

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?"

John
fonte
4
Um token pode ser dado ao seu aplicativo móvel e armazenado em uma variável (por você) para uso posterior ou salvo (por você) via JavaScript no navegador para uso em solicitações de SPA. Um cookie geralmente é usado em um navegador (pelo navegador).
Tino Mclaren
2
Veja o artigo auth0.com/blog/cookies-vs-tokens-definitive-guide escrito em 2016.
Michael Freidgeim

Respostas:

34

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.

intuitivepixel
fonte
84
Ainda não entendo por que um token é melhor / diferente de um cookie. De uma forma ou de outra, você está enviando algo ao servidor da API que identifica uma sessão válida. Supondo que você esteja executando tudo em um único domínio (e mesmo que a brasa e sua API estejam em servidores diferentes, tudo o que você precisa fazer para executar isso é executado atrás de um CDN, o que provavelmente você deve fazer de qualquer maneira) que vantagem os tokens oferecem que justificam o trabalho de configuração extra e suscetibilidade extra a ataques de tempo?
Michael Johnston
46
Concordo com Michael Johnston. Essa resposta continua explicando o que é a autenticação baseada em token, mas na verdade não respondeu à pergunta. As informações relevantes mais próximas que eu posso ver estão no último bit "por causa da natureza da estrutura ember.js e também porque ela se encaixa mais no paradigma de aplicativo da web de estado", mas isso não é muita resposta. Eu tenho a mesma pergunta.
Daniel
5
Concordo com os dois comentários aqui ... Na verdade, eu sinto que todo "é a maneira brasa" é um pouco de um cop-out
grapho
3
Sinceramente, acho que o estado é um arenque vermelho em relação ao cookie versus um token enviado por outros meios. Eu acho que combina as noções de evidência do usuário com outras informações do perfil do usuário. Eu poderia usar um cookie da mesma forma que um cabeçalho HTTP ou outro canal para enviar um token. Penso que a diferença está mais relacionada com os problemas relacionados com a política de origem única para cookies ou com a carga de implementar um contentor de cookies de clientes nativos do seu back-end.
Michael Lang
15
não anuncie ember.js concentre-se na pergunta .. desculpe-me por ser rude.
Vick_Pk
336

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:

    • Você pode autorizar apenas as solicitações que deseja autorizar. (Cookies - até o cookie de autorização é enviado para cada solicitação).
    • Imune ao XSRF (pequeno exemplo de XSRF - enviarei a você um link no e-mail com a aparência de que <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.
    • Os cookies estão vinculados a um único domínio. Um cookie criado no domínio foo.com não pode ser lido pelo domínio bar.com, enquanto você pode enviar tokens para qualquer domínio que desejar. Isso é especialmente útil para aplicativos de página única que consomem vários serviços que exigem autorização - para que eu possa ter um aplicativo Web no domínio myapp.com que possa fazer solicitações autorizadas do lado do cliente para myservice1.com e myservice2.com.
  • Contras:
    • Você precisa armazenar o token em algum lugar; enquanto os cookies são armazenados "fora da caixa". Os locais que vêm à sua mente são localStorage (con: o token é mantido mesmo depois que você fecha a janela do navegador), sessionStorage (pro: o token é descartado depois que você fecha a janela do navegador, con: abrir um link em uma nova guia renderiza essa guia anônimo) e cookies (Pro: o token é descartado depois que você fecha a janela do navegador. Se você usar um cookie de sessão, será autenticado ao abrir um link em uma nova guia e ficará imune ao XSRF, pois está ignorando o cookie para autenticação, você está apenas usando-o como armazenamento de token. Con: os cookies são enviados para todas as solicitações. Se esse cookie não estiver marcado como https apenas, você estará aberto ao homem nos ataques intermediários.)
    • É um pouco mais fácil realizar ataques XSS contra autenticação baseada em token (por exemplo, se eu sou capaz de executar um script injetado em seu site, posso roubar seu token; no entanto, a autenticação baseada em cookie também não é uma bala de prata - enquanto os cookies marcados como apenas http não pode ser lido pelo cliente, ele ainda pode fazer solicitações em seu nome que incluirão automaticamente o cookie de autorização.)
    • As solicitações para baixar um arquivo, que deve funcionar apenas para usuários autorizados, requerem o uso da API de arquivos. A mesma solicitação funciona imediatamente para autenticação baseada em cookie.

Autenticação de cookies

  • Uma solicitação ao servidor sempre é registrada pelo cookie de autorização.
  • Prós:
    • Os cookies podem ser marcados como "somente http", o que os torna impossíveis de serem lidos no lado do cliente. Isso é melhor para a proteção contra ataques XSS.
    • Sai da caixa - você não precisa implementar nenhum código no lado do cliente.
  • Contras:
    • Vinculado a um único domínio. (Portanto, se você tiver um aplicativo de página única que solicite vários serviços, poderá acabar fazendo coisas malucas como um proxy reverso.)
    • Vulnerável ao XSRF. Você precisa implementar medidas extras para proteger seu site contra falsificação de solicitação entre sites.
    • São enviados para cada solicitação única (mesmo para solicitações que não exigem autenticação).

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.

Ondrej Svejdar
fonte
56
Essa resposta está muito mais próxima de uma resposta canônica do que a aceita.
Xlecoustillier
3
Obrigado @ ondrej-svejdar. É de longe a melhor resposta! Eu argumentaria apenas com a parte "bastante codificante". Existe um bom número de bibliotecas disponíveis para praticamente qualquer idioma. Portanto, a menos que você realmente queira conhecer a mecânica da implementação do JWT, não há necessidade de começar do zero.
FullStackForger
2
Are send out for every single requestOs tokens também são enviados para todos os pedidos
Eugen Konkov 21/12
10
@EugenKonkov no. não necessariamente. Somente se você adicionar o cabeçalho. cookies são enviados a partir do navegador, se quiser ou se você não quiser
Royi Namir
2
@ Zack - isso importa. O problema dos cookies é que eles são anexados para solicitar automaticamente pelo navegador. Os tokens, por outro lado, são anexados à solicitação XHR por javascript. É impossível para evildomain.com obter acesso ao armazenamento local para mysite.com (btw. Não recomendo armazenamento local como um local para armazenar tokens) ou para ram (presumo que você queira dizer variável javascript aqui que contém o token) porque a variável está em área restrita na janela do navegador diferente.
Ondrej Svejdar
34
  • Os 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/

user3490126
fonte
14
Não está claro se os seus pontos são para cookies ou tokens, de que maneira eles são?
Pureferret 17/02
6
Não entendo por que você "tem mais controle" sobre os tokens do que sobre os cookies.
Aaron
@onsmith Pelo que entendi, há mais do que um único ponto aqui. Em primeiro lugar, o cookie é enviado com cada solicitação. O envio de tokens é acionado pelo código javascript. Eles não são enviados automaticamente. Além disso, de acordo com a seção rfc 4, o JWT parece ser um recipiente usado para transferir reivindicações de segurança com base entre as partes. O que fornece controle mais granular e permite gerar tokens de autenticação para terceiros com um conjunto de permissões, permitindo que eles sejam usados ​​em seu nome.
FullStackForger
18

Para os googlers :

  • NÃO misture statefulness com mecanismos de transferência de estado

STATEFULNESS

  • Com estado = salvar informações de autorização no lado do servidor, esta é a maneira tradicional
  • Sem estado = salvar informações de autorização no lado do cliente, juntamente com uma assinatura para garantir a integridade

MECANISMOS

  • Cookie = um cabeçalho especial com tratamento especial (acesso, armazenamento, expiração, segurança, transferência automática) pelos navegadores
  • Cabeçalhos personalizados = por exemplo Authorization, são apenas cabeçalhos sem nenhum tratamento especial, o cliente precisa gerenciar todos os aspectos da transferência
  • Outro . Outros mecanismos de transferência podem ser utilizados, por exemplo, a string de consulta foi uma opção para transferir o ID de autenticação por um tempo, mas foi abandonada por sua insegurança

COMPARAÇÃO DE DECLARAÇÃO

  • "Autorização de estado" significa que o servidor armazena e mantém informações de autorização de usuário no servidor, tornando as autorizações parte do estado do aplicativo
  • Isso significa que o cliente só precisa manter um "ID de autenticação" e o servidor pode ler os detalhes da autenticação no banco de dados
  • Isso implica que o servidor mantém um pool de autorizações ativas (usuários que efetuaram login) e consultará essas informações para cada solicitação
  • "Autorização sem estado" significa que o servidor não armazena e mantém informações de autenticação do usuário, simplesmente não sabe quais usuários estão conectados e confia no cliente para produzir informações de autenticação
  • Cliente irá armazenar informações de autenticação completa como quem você é (ID de usuário) e, possivelmente, permissões, tempo de validade, etc., isso é mais do que apenas auth ID, por isso, é dado um novo nome simbólico
  • Obviamente, o cliente não pode ser confiável, portanto, os dados de autenticação são armazenados junto com uma assinatura gerada a partir de hash(data + secret key)onde a chave secreta é conhecida apenas pelo servidor, para que a integridade dos dados do token possa ser verificada
  • Observe que o mecanismo de token apenas garante integridade, mas não confidencialidade, o cliente precisa implementar esse
  • Isso também significa que, para cada solicitação, o cliente deve enviar um token completo, o que implica largura de banda extra

COMPARAÇÃO DO MECANISMO

  • "Cookie" é apenas um cabeçalho, mas com algumas operações pré-carregadas nos navegadores
  • O cookie pode ser definido pelo servidor e salvo automaticamente pelo cliente e será enviado automaticamente para o mesmo domínio
  • O cookie pode ser marcado para httpOnlyimpedir o acesso do cliente ao JavaScript
  • As operações pré-carregadas podem não estar disponíveis em plataformas diferentes de navegadores (por exemplo, móveis), o que pode levar a esforços extras
  • "Cabeçalhos personalizados" são apenas cabeçalhos personalizados sem operações pré-carregadas
  • O cliente é responsável por receber, armazenar, proteger, enviar e atualizar a seção de cabeçalho personalizado para cada solicitação. Isso pode ajudar a impedir a incorporação simples de URL malicioso

RESUMIR

  • Não há mágica, o estado de autenticação deve ser armazenado em algum lugar, no servidor ou no cliente
  • Você pode implementar stateful / stateless com cookie ou outros cabeçalhos personalizados
  • Quando as pessoas falam sobre essas coisas, sua mentalidade padrão é principalmente: stateless = token + cabeçalho personalizado, stateful = auth ID + cookie; estas NÃO são as únicas opções possíveis
  • Eles têm prós e contras, mas mesmo para tokens criptografados você não deve armazenar informações confidenciais

Ligação

theaws.blog
fonte
1
Obrigado por isso, imensamente útil. Responde à pergunta, mais toda a confusão gerada pelas outras respostas, falando subitamente sobre estado.
MDave 9/01
Muito muito bom. Traz mais detalhes e realmente explica como e por que de uma maneira melhor.
colinwong
8

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.

martinp999
fonte
5

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

Afz
fonte
3

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.

Bharat Vasant
fonte
1

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.

arriscar
fonte