O que é JWT (JSON Web Token)?
sobes.tech IA
Resposta da IA
JSON Web Token (JWT) é uma forma compacta e segura de transmitir dados entre partes em formato JSON.
Princípios de funcionamento:
-
O token consiste em três partes, separadas por pontos (
.):header.payload.signature. -
Header (Cabeçalho): Contém informações meta sobre o token, como o tipo de token (JWT) e o algoritmo de assinatura utilizado (por exemplo, HS256, RS256).
{ "alg": "HS256", "typ": "JWT" } -
Payload (Carga útil): Contém "claims" - afirmações ou informações que queremos transmitir. Existem vários tipos:
- Claims registados: Claims reservados, mas opcionais, como
iss(emissor),exp(data de expiração),sub(assunto). - Claims públicos: Definidos para uso público, devem estar registados no IANA JSON Web Token Registry ou serem URI contendo um espaço de nomes protegido contra colisões.
- Claims privados: Afirmativas arbitrárias acordadas entre as partes.
{ "sub": "1234567890", "name": "John Doe", "iat": 1516239022 } - Claims registados: Claims reservados, mas opcionais, como
-
Signature (Assinatura): Criada combinando o cabeçalho e a carga útil codificados com um segredo e o algoritmo especificado no cabeçalho. Isto garante a integridade do token; se alguém modificar o cabeçalho ou a carga útil, a assinatura será inválida.
# Exemplo de criação de assinatura usando HS256 import hmac, hashlib header_str = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9' # Base64Url(Cabeçalho) payload_str = 'eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ' # Base64Url(Carga útil) secret = 'your_secret_key' # Assinatura = HMACSHA256(Base64Url(Cabeçalho) + "." + Base64Url(Carga útil), secret) signature = hmac.new( secret.encode('utf-8'), (header_str + '.' + payload_str).encode('utf-8'), hashlib.sha256 ).digest() # Codificação da assinatura em Base64Url import base64 signature_b64url = base64.urlsafe_b64encode(signature).rstrip(b'=').decode('ascii') # Token final: header_str + '.' + payload_str + '.' + signature_b64url
Aplicação:
- Autenticação: O servidor emite o token ao utilizador após uma autenticação bem-sucedida. O utilizador envia este token com cada pedido. O servidor verifica a validade do token e permite o acesso aos recursos.
- Troca de informações: Transmissão segura de pequenos volumes de dados entre diferentes serviços.
Vantagens:
- Compacto: Menos dados para transmitir em comparação com XML.
- Autossuficiente: O token já contém as informações necessárias sobre o utilizador, o que reduz a necessidade de consultar a base de dados em cada pedido.
- Sem estado: O servidor não precisa armazenar informações de sessão do seu lado.
- Assinatura criptográfica: Garante a integridade dos dados.
Desvantagens:
- Impossível revogar o token: Uma vez emitido, o token permanece válido até expirar, a menos que um mecanismo de listas negras seja implementado.
- Armazenamento do segredo: A chave secreta deve ser armazenada de forma segura.
- Tamanho: Com o aumento da quantidade de dados em
payload, o tamanho do token também aumenta.