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