Segurança com JWT e Java

40 views
Skip to first unread message

Gabriel Feitosa

unread,
Jun 1, 2017, 12:54:49 PM6/1/17
to CEJUG, javace
Fala galera,

   no post de hoje falo sobre a autenticação com JWT em uma aplicação Java e uma maneira bem simples de adicionar essa camada de segurança sem interferir no código já produzido.


Da uma espiada lá!

Abraços
--
Gabriel Feitosa
Blog: gabrielfeitosa.com
Github: github.com/gabrielfeitosa

Rafael Ponte

unread,
Jun 1, 2017, 1:45:31 PM6/1/17
to ce...@googlegroups.com, javace
Oi Gabriel,

Muito bacana o post, muito simples e didático.

A idéia de trabalhar com tokens não é nova, na verdade é bem antiga. Acho que a maior vantagem do JWT é que ele é um padrão aberto que se tornou popular e a comunidade tem aceitado muito bem. 

Segurança nunca foi meu forte, mas percebi que há muito criticismo com relação ao JWT, como nos links abaixo:
--
-- Você está inscrito na lista de discussão técnica do CEJUG. Para sair da lista de discussão, envie um email para cejug+un...@googlegroups.com.
---
Você recebeu essa mensagem porque está inscrito no grupo "CEJUG" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para cejug+un...@googlegroups.com.
Para postar nesse grupo, envie um e-mail para ce...@googlegroups.com.
Acesse esse grupo em https://groups.google.com/group/cejug.
Para mais opções, acesse https://groups.google.com/d/optout.
--
Rafael Ponte
TriadWorks | Formação Java
http://cursos.triadworks.com.br

Gabriel Feitosa

unread,
Jun 1, 2017, 9:18:18 PM6/1/17
to ce...@googlegroups.com, javace
Fala Ponte,

    segurança é um assunto bem delicado. Muitos desenvolvedores ainda pensam que segurança é coisa de infra, doce engano né!?
Infelizmente, também não tenho muito conhecimento sobre segurança e é assunto que despertou meu interesse recentemente.

O que eu gosto do JWT é que ele é simples, leve e na minha visão fornece a segurança necessária. Consigo trafegar sem gastar quase nada de dados, para um app mobile isso é extremamente importante. Porém, nem de longe atende qualquer cenário.

Em um dos links acima, o autor fala de usar o JWT sem o cabeçalho. Quanto mais informações dermos aos "atacantes" mais vulneráveis nossas aplicações serão, certo? Mas, se soubermos utilizar da maneira adequada isso não se faz necessário, como todo método de autenticação o JWT também tem suas vulnerabilidades que são mitigadas com as escolhas das opções adequadas. 

Outro ponto importante é o uso do payload. Nele ficam as informações do "usuário". Particularmente, costumo usá-lo de forma bem simplória, adiciono somente o que é de extrema relevância para a aplicação. Por exemplo, o login.

Recentemente, adicionamos o JWT em um sistema legado que usa o protocolo de autenticação SAML só que tudo armazenado na sessão. Estávamos com um grande problema de escalabilidade, pois em determinadas épocas há um excessivo consumo das APIs deste sistema. Além disso, novos sistemas que estavam usando OAuth2 precisavam realizar chamadas a essas APIs. 

Para que fosse menos intrusivo, nós decidimos adicionar uma camada nova de autenticação em cima da anterior. O uso do SAML só ocorreria no primeiro login do usuário, assim continuamos validando as credenciais da maneira antiga. Após a primeira autenticação, o token é criado e a sessão é encerrada. Com a nova camada, o token entra no processo de validação antes do contexto de segurança entrar em ação e ver se a requisição está autenticada. Assim, quando o token é válido há uma manipulação para autenticar o contexto e o fluxo segue seu curso natural. Caso o token não passe pelo processo de validação, o fluxo natural da autenticação anterior entra em ação.

Além da adoção do token, adicionamos também um sistema de cache para evitar buscar as autorizações do usuário a cada requisição. 

Há muitos outros detalhes que utilizamos, quem sabe em um futuro post não os exponho! 

Nem todos os pontos apontados pelos links que você enviou foi motivo de estudo e preocupação da minha parte. Valeu pelo compartilhamento e já vou fazer uma análise maior da minha implementação para melhorar a solução que adotei em um projeto.

Abraço

Rafael Ponte

unread,
Jun 2, 2017, 8:46:06 AM6/2/17
to ce...@googlegroups.com, javace
Opa,

MUITO legal. No caso do cache, uso um cache distribuído? Qual?

Um abraço,

Gabriel Feitosa

unread,
Jun 2, 2017, 10:26:06 AM6/2/17
to ce...@googlegroups.com, javace
Algumas aplicações estão usando o Redis. 

Mas, infelizmente, há aplicações que ainda possuem o próprio cache. Isso ta ocorrendo por motivos que fogem do controle da arquitetura, pois envolve outras equipes/gerentes/empresas/... hehehehe! =/




Você recebeu essa mensagem porque está inscrito no grupo "java.ce" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para javace+un...@googlegroups.com.
Para postar nesse grupo, envie um e-mail para jav...@googlegroups.com.
Acesse esse grupo em https://groups.google.com/group/javace.

Para mais opções, acesse https://groups.google.com/d/optout.
Reply all
Reply to author
Forward
0 new messages