Anatomia de um JWT
Um JWT é só três textos codificados, colados por pontos. Nada ali é secreto.
Depois do login, muitos sites entregam um JSON Web Token (JWT): um crachá que o navegador guarda e devolve a cada pedido. Ele tem três partes separadas por pontos, header.payload.signature:
- o header diz como o token foi assinado (por exemplo
{"alg":"HS256","typ":"JWT"}); - o payload são os dados do crachá, as chamadas claims: quem você é (
sub), seu papel (role), quando o token expira (exp); - a signature é um selo que prova que o servidor foi quem montou o token.
O detalhe que surpreende: o header e o payload são apenas codificados em base64url, não cifrados. Qualquer pessoa que tenha o token lê o que há dentro. Base64url é a mesma ideia do Base64, com dois símbolos trocados (- e _ no lugar de + e /) para caber numa URL, e sem o = de preenchimento.
Para ler um token, pegue a parte do meio e decodifique de base64url. Em Python: base64.urlsafe_b64decode(parte + "=" * (-len(parte) % 4)). O = extra repõe o preenchimento que o JWT corta. Guardar um segredo dentro do payload achando que ele está escondido é um erro: o payload é público para quem tem o token.