Estou tentando implementar a autenticação sem estado com o JWT para minhas APIs RESTful.
AFAIK, JWT é basicamente uma sequência criptografada passada como cabeçalhos HTTP durante uma chamada REST.
Mas e se houver um bisbilhoteiro que veja a solicitação e roube o token ? Então ele será capaz de falsificar pedidos com a minha identidade?
Na verdade, essa preocupação se aplica a toda autenticação baseada em token .
Como evitar isso? Um canal seguro como HTTPS?
authentication
access-token
jwt
smwikipedia
fonte
fonte
trade-off
entrehaving finer control of token expiration
ehaving better scalability
.Respostas:
Eu sou o autor de uma biblioteca de nós que lida com autenticação com bastante profundidade, express-stormpath , por isso vou falar com algumas informações aqui.
Primeiro, os JWTs normalmente NÃO são criptografados. Embora exista uma maneira de criptografar JWTs (consulte: JWEs ), isso não é muito comum na prática por vários motivos.
Em seguida, qualquer forma de autenticação (usando JWTs ou não) está sujeita a ataques do MitM (man-in-the-middle). Esses ataques acontecem quando um invasor pode VER o tráfego da SUA REDE enquanto você faz solicitações pela Internet. É isso que o seu ISP pode ver, a NSA, etc.
É isso que o SSL ajuda a evitar: criptografando o tráfego de REDE do seu computador -> algum servidor ao se autenticar, um terceiro que está monitorando o tráfego da sua rede NÃO consegue ver seus tokens, senhas ou algo assim, a menos que seja capaz de alguma forma para obter uma cópia da chave SSL privada do servidor (improvável). Esta é a razão pela qual o SSL é OBRIGATÓRIO para todas as formas de autenticação.
Vamos dizer, porém, que alguém é capaz de explorar o seu SSL e é capaz de ver o seu token: a resposta à sua pergunta é que SIM , o atacante vai ser capaz de usar esse símbolo para representar você e solicitações de fazer a sua servidor.
Agora, é aqui que entram os protocolos.
JWTs são apenas um padrão para um token de autenticação. Eles podem ser usados para praticamente qualquer coisa. A razão pela qual as JWTs são legais é que você pode incorporar informações extras nelas e pode validar que ninguém mexeu com elas (assinatura).
No entanto, as próprias JWTs não têm nada a ver com 'segurança'. Para todos os efeitos, os JWTs são mais ou menos a mesma coisa que as chaves de API: apenas cadeias aleatórias que você usa para se autenticar em algum servidor em algum lugar.
O que torna sua pergunta mais interessante é o protocolo que está sendo usado (provavelmente o OAuth2).
A maneira como o OAuth2 funciona é que ele foi projetado para fornecer aos clientes tokens TEMPORÁRIOS (como JWTs!) Para autenticação por apenas um PERÍODO DE CURTO TEMPO!
A idéia é que, se o seu token for roubado, o invasor poderá usá-lo apenas por um curto período de tempo.
Com o OAuth2, você precisa se autenticar novamente com o servidor de vez em quando, fornecendo suas credenciais de nome de usuário / senha OU API e, em seguida, recuperando um token em troca.
Como esse processo acontece de vez em quando, seus tokens mudam frequentemente, dificultando a personificação de invasores constantemente sem causar grandes problemas.
Espero que isso ajude ^^
fonte
Sei que essa é uma pergunta antiga, mas acho que posso largar meus US $ 0,50 aqui, provavelmente alguém pode melhorar ou fornecer um argumento para recusar totalmente minha abordagem. Estou usando JWTs em uma API RESTful sobre HTTPS (ofc).
Para que isso funcione, você sempre deve emitir tokens de vida curta (depende da maioria dos casos, no meu aplicativo, estou definindo a
exp
reivindicação para 30 minutos ettl
3 dias, para que você possa atualizar esse token enquantottl
ainda estiver válido e o token não estiver na lista negra )Para que
authentication service
, para invalidar tokens, eu gosto de usar uma camada de cache na memória ( redis no meu caso) comoJWT blacklist
/ban-list
na frente, dependendo de alguns critérios: (eu sei que isso quebra a filosofia RESTful, mas os documentos armazenados são de curta duração, como eu lista negra para o tempo restante de vida -ttl
reivindicação-)Nota: os tokens na lista negra não podem ser atualizados automaticamente
user.password
ouuser.email
foi atualizado (requer confirmação de senha), o serviço de autenticação retorna um token atualizado e invalida (lista negra) os anteriores, portanto, se o seu cliente detectar que a identidade do usuário foi comprometida de alguma forma, você poderá solicitar que o usuário altere sua senha . Se você não quiser usar a lista negra para isso, poderá (mas não o encorajo a) validar aiat
reivindicação (emitida em) nouser.updated_at
campo (se ojwt.iat < user.updated_at
JWT não for válido).Finalmente, você valida o token normalmente, como todo mundo.
Nota 2: em vez de usar o próprio token (que é realmente longo) como a chave do cache, sugiro gerar e usar um token UUID para a
jti
reivindicação. O que é bom e acho que (não tenho certeza, já que me ocorreu) que você também pode usar esse mesmo UUID que o token CSRF, retornando umsecure
/non-http-only
cookie com ele e implementando adequadamente oX-XSRF-TOKEN
cabeçalho usando js. Dessa forma, você evita o trabalho de computação de criar outro token para verificações de CSRF.fonte
Desculpe estar um pouco atrasado com isso, mas tinha preocupações semelhantes e agora quero contribuir com algo sobre o mesmo.
1) rdegges acrescentou um ponto excelente, que o JWT não tem nada a ver com a "segurança" e simplesmente valida, se alguém mexeu com a carga útil ou não (assinatura); O ssl ajuda a evitar violações.
2) Agora, se o SSL também estiver de alguma forma comprometido, qualquer bisbilhoteiro pode roubar o nosso token de portador (JWT) e personificar o usuário genuíno, uma etapa seguinte que pode ser feita é procurar a "prova de posse" do JWT do cliente .
3) Agora, com essa abordagem, o apresentador da JWT possui uma chave de Prova de Posse (POP) específica, que o destinatário pode confirmar criptograficamente se a solicitação é do mesmo usuário autêntico ou não.
Referi-me Prova de Possesion artigo para isso e estou convencido com o apporach.
Ficarei encantado, se puder contribuir com alguma coisa.
Saúde (y)
fonte
Não podemos simplesmente adicionar o ip do host inicial que solicitou a geração desse token JWT como parte da reivindicação? Agora, quando o JWT é roubado e usado em uma máquina diferente, quando o servidor valida esse token, podemos verificar se o ip da máquina solicitada corresponde ao IP configurado como parte da reivindicação. Isso não corresponderia e, portanto, o token pode ser rejeitado. Além disso, se o usuário tentar manipular o token definindo seu próprio IP para o token, o token será rejeitado à medida que o token for alterado.
fonte