Sobes.tech
Junior

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
    }
    
  • 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.