É muito importante entender um aspecto....
JWT não garante que seus dados estão ocultos de um terceiro.
Onde eu quero chegar....
O JWT quando obtido trata-se apenas de uma fonte de garantia de assinatura (Fonte ou partida do dado). Ele é usado para autenticação principalmente em algoritimos como RSA de dupla key... pois a fonte o receptor conseguem garantir que o dado foi assinado pela chave publica ou privada e assim validar ambos.
Porém o transporte de dados sensiveis via JWT é perigoso... pois o header e o body de um JWT (As duas primeiras sessões que são separadas por ponto) são apenas uma base64.
Exemplo:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
O Bloco:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
Pode ser desencodado por meio de base64 dando como resultado:
{
"alg": "HS256",
"typ": "JWT"
}
O Segundo Bloco:
eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ
{
"sub": "1234567890",
"name": "John Doe",
"iat": 1516239022
}
Perceba que se um dado sensível estiver nessa sessão você está espondo dados para qualquer um que obter esse JWT.
Por tanto, o JWT não deve ser usado como transporte de informação, primeiro por que não garante que apenas as partes interessadas terão acesso. E segundo que só se garante que as partes de interesse assinaram ou estão lendo um conteúdo veridico por meio da validação de suas keys de assinatura.
Muito importante também quando estiver usando JWT, verificar se o alg do header é o mesmo que você espera isso garante que nenhum atacante irá mudar a assinatura e mesmo assim consegui passa pelo seu sistema de autenticidade de JWT.