Um JSON Web Token é frequentemente utilizado para transportar informações entre sistemas. O formato compacto pode dar a impressão de um objeto cifrado ou intrinsecamente fiável, mas não é isso que um JWT garante.
Três partes, geralmente legíveis
Um JWT clássico contém header, payload e assinatura separados por pontos. As duas primeiras partes são codificadas, não necessariamente cifradas. Não coloque segredos no payload supondo que ficam invisíveis.
Um descodificador ou inspetor permite ler localmente os campos de um token, mas isso apenas mostra o seu conteúdo.
Descodificar não é verificar
Apresentar o payload prova apenas que a string tem um formato suficientemente válido para ser lida. Para confiar nos claims, a aplicação deve verificar a assinatura com a chave e o algoritmo esperados e depois aplicar os restantes controlos.
O que a assinatura prova
A assinatura é calculada a partir das partes codificadas do token e de uma chave segundo o algoritmo escolhido. Quando é corretamente verificada, permite detetar alterações e estabelecer que o token foi assinado por uma entidade que possuía a chave esperada. Não torna o payload confidencial.
Famílias simétricas como HS256 utilizam um segredo partilhado; famílias assimétricas como RS256 ou ES256 separam a chave privada de assinatura da chave pública de verificação.
A aplicação deve impor os algoritmos que aceita em vez de confiar cegamente no algoritmo declarado pelo token.
Expiração, audiência e emissor
Claims como exp, nbf, iat, iss e aud só têm valor quando são realmente verificados. Aceitar um token expirado, destinado a outra audiência ou proveniente de um emissor inesperado pode anular uma parte importante da proteção.
Uma pequena tolerância para diferenças de relógio entre sistemas pode ser necessária, mas não deve tornar-se uma extensão excessiva da validade.