Pular para o conteúdo
Todos os conceitos

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.

um JWT header . payload . signature só base64url: qualquer um lê depende do segredo do servidor decodifica { "sub": "carla.vidal", "role": "viewer", "note": "tocaia{...}" } as claims, em texto claro
Um JWT tem três partes coladas por pontos: header e payload são só base64url que qualquer um decodifica; a assinatura é o único pedaço que depende de um segredo.

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.

Aparece nestes desafios