Português (Portugal)
  • jwt
  • auth
  • autenticacao
  • identidade
  • api
  • openid
  • oauth

O que é JSON Web Token (JWT)?

Obter um entendimento claro dos fundamentos do JSON Web Token (JWT) em 5 minutos.

Gao
Gao
Founder

O JSON Web Token (JWT) é amplamente usado em aplicações web modernas e padrões abertos como o OpenID Connect, facilitando a autenticação e autorização. Embora o RFC 7519 oficial sirva como referência essencial, será desafiante para os iniciantes entender. Neste artigo, iremos focar nos conceitos principais do JWT e apresentá-los numa linguagem simples com exemplos.

Porque precisamos do JWT?

Hoje em dia, é bastante comum usar JSON para intercambiar dados entre duas partes. Considere um objeto JSON que representa um usuário:

sub é a abreviatura de "subject", que é uma reivindicação padrão no OpenID Connect para representar o identificador do usuário (ID do usuário).

Como podemos garantir a integridade deste objeto JSON? Em outras palavras, como podemos garantir que os dados não são manipulados durante a transmissão? Uma solução comum é usar assinaturas digitais. Por exemplo, podemos usar criptografia de chave pública: o servidor assina o objeto JSON com sua chave privada, e o cliente pode verificar a assinatura com a chave pública do servidor.

Em suma, o JWT oferece uma abordagem padronizada para representar o objeto JSON e sua assinatura.

O formato do JWT

Uma vez que existem muitos algoritmos para criar assinaturas digitais, é necessário especificar o algoritmo usado para a assinatura do JWT. Isso é feito construindo um objeto JSON:

alg é a abreviatura de "algoritmo", e typ é a abreviatura de "tipo".

Como regra, typ é definido para JWT em maiúsculas. Para nosso exemplo, alg é HS256, que significa HMAC-SHA256 (vamos explicar em breve), e indica que estamos usando este algoritmo para criar a assinatura.

Agora, temos todos os ingredientes para um JWT:

  • Cabeçalho JSON: Algoritmo e tipo
  • Payload JSON: Os dados reais
  • Assinatura: A assinatura que abrange o cabeçalho e o payload

No entanto, certos caracteres como espaços e quebras de linha não são adequados para transmissão na rede. Portanto, o cabeçalho e o payload precisam ser codificados em Base64URL. O JWT típico se parece com isto:

O . serve como delimitador.

Vamos juntar tudo e criar um JWT:

Cabeçalho

JSON: {"alg":"HS256","typ":"JWT"}

Base64URL codificado: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9

Payload

JSON: {"sub":"foo","name":"John Doe"}

Base64URL codificado: eyJzdWIiOiJmb28iLCJuYW1lIjoiSm9obiBEb2UifQ

Assinatura

Em HMAC-SHA256, a assinatura é criada com um segredo:

Por exemplo, com o segredo como algum-grande-segredo, a assinatura se torna: XM-XSs2Lmp76IcTQ7tVdFcZzN4W_WcoKMNANp925Q9g.

JWT

O JWT final é:

Este JWT válido pode ser verificado por qualquer parte que possua o segredo.

Escolha o algoritmo de assinatura

Como mencionado anteriormente, existem vários algoritmos para criar assinaturas digitais. Usamos HS256 como exemplo, mas pode não ser suficientemente forte, pois o segredo deve ser partilhado entre as partes (por exemplo, o cliente e o servidor).

Em cenários do mundo real, os clientes podem incluir aplicações públicas como aplicativos React que não podem manter o segredo seguro. Consequentemente, a abordagem preferida envolve a utilização de criptografia de chave pública (ou seja, criptografia assimétrica) para assinar o JWT. Vamos começar com o algoritmo mais popular: RSA.

RSA

RSA, um algoritmo assimétrico, usa um par de chaves: uma chave pública e uma chave privada. A chave pública é usada para verificar a assinatura, enquanto a chave privada é usada para assinar.

O cabeçalho JSON para RSA se parece com isto:

RS256 significa RSA-SHA256, o que significa que a assinatura é criada com o algoritmo RSA e a função hash SHA256. Você pode também usar RS384 e RS512 para criar assinaturas com as funções de hash SHA384 e SHA512, respectivamente.

A assinatura é criada com a chave privada:

Novamente, podemos montar estas partes para criar um JWT, e o JWT final se parecerá com isto:

Agora, o cliente pode verificar a assinatura sem conhecer a chave privada.

ECDSA

Apesar de o RSA ser amplamente adotado, ele sofre por ter tamanhos de assinatura maiores, às vezes ultrapassando o tamanho combinado do cabeçalho e do payload. O Algoritmo de Assinatura Digital da Curva Elíptica (ECDSA) é outro algoritmo assimétrico que pode criar assinaturas mais compactas e é mais eficiente.

Para gerar uma chave privada para o ECDSA, precisamos escolher uma curva. Isto está fora do escopo deste artigo, mas você pode encontrar mais informação aqui.

O cabeçalho JSON para ECDSA se parece com isto:

ES256 significa ECDSA-SHA256, o que significa que a assinatura é criada com o algoritmo ECDSA e a função hash SHA256. Você pode também usar ES384 e ES512 para criar assinaturas com as funções hash SHA384 e SHA512, respectivamente.

A assinatura é criada com a chave privada:

O JWT final mantém a mesma estrutura que o RSA, mas com uma assinatura significativamente mais curta:

Verificando o JWT

Verificar um JWT é diretamente o processo reverso de criar um JWT:

  1. Divida o JWT em três partes (cabeçalho, payload e assinatura) usando o delimitador ..
  2. Decodifique o cabeçalho e o payload com Base64URL.
  3. Verifique a assinatura com o algoritmo especificado no cabeçalho e a chave pública (para algoritmos assimétricos).

Há muitas bibliotecas disponíveis para ajudar a verificar os JWT, como o jose para Node.js e navegadores web.

Conclusão

Neste artigo, explicamos sucintamente os conceitos core do JWT, juntamente com uma visão geral de como criar e verificar. Deixamos muitos detalhes por explorar, e vamos tratar deles em artigos futuros.

Logto utiliza padrões abertos como JWT e OpenID Connect para assegurar seus aplicativos e APIs com fluxos de trabalho simplificados para cada desenvolvedor. Se você está interessado, pode experimentá-lo gratuitamente (não é requerido cartão de crédito).