Saiba mais sobre o que são os JSON Web Tokens e de que forma eles podem ajudar a compreender a base do JWT.
Atualmente, os JSON Web Tokens (JWT) são amplamente utilizados. Eles aparecem em aplicações dos mais variados segmentos, garantindo a segurança da informação.
Nesse artigo, apresento um pouco dos conceitos fundamentais que permitem compreender a base do JWT. Confira a seguir!
O que é JWT?
JWT é uma estrutura independente para segurança de informações na forma de tokens de acesso. Esses tokens apresentam informações no formato JSON, onde são criptografadas e usadas para validar a comunicação entre as partes envolvidas.
A seguir, veja algumas razões pelas quais o JWT se tornou tão utilizado hoje em dia.
Performance
Os JWT proporcionam uma vantagem significativa de serem stateless. Isso significa que não é necessário fazer consultas constantes ao banco de dados para validar cada usuário à cada requisição feita.
Quando um usuário realiza a autenticação, um JWT é gerado e enviado ao usuário, que o incluirá em todas as requisições subsequentes. O servidor então valida o token enviado, eliminando a necessidade de consultar o banco de dados, fornecendo assim uma melhora significativa na performance da aplicação.
Segurança
JWTs contribuem para a segurança de inúmeras formas. Por exemplo, uma vez que um token é assinado, podemos verificar a autenticidade e integridade do mesmo. Dessa forma, podemos confirmar que o conteúdo é válido e o autor do conteúdo é realmente quem alega ser.
Além disso, o payload do token JWT é criptografado e isso garante a confidencialidade dos dados tornando difícil para um atacante conseguir modificar o token ou usar um token roubado, pois isso invalidaria a assinatura.
Usabilidade
O JWT em si segue um padrão aberto (RFC 7519) que define uma maneira concisa para transmitirmos informações de forma segura por meio de um objeto JSON. Esse objeto pode ser transmitido por várias plataformas e linguagens de programação.
Devido a isso, JWTs podem ser usados para autenticar requisições em dispositivos móveis, browsers e desktops.
A estrutura padrão de um JWT
Como mencionado anteriormente, o JWT é construído seguindo uma estrutura padrão (RCF 7519) e composto por três partes essenciais: header, payload e signature. Vamos detalhar cada uma delas a seguir.
Header
O cabeçalho do JWT desempenha um papel crucial no token, pois contém informações pertinentes sobre como um token é processado. Ele é composto por duas partes:
- Typ (type): designa o tipo do token. Para um JWT, o valor desta chave será “JWT”;
- Alg (Algorithm): essa parte especifica o algoritmo de assinatura usado para codificar o token. Podem ser usados para diversos algoritmos, como, por exemplo, HMAC, SHA256 e RSA.
O cabeçalho é codificado em Base64URL. Segue abaixo um exemplo de cabeçalho de JWT:
{
“alg”: “SHA256”,
“typ”: “JWT”,
}
Payload
No payload, incluímos informações pertinentes relacionadas à autenticação e autorização que pretendemos transmitir.
Normalmente, o payload contém declaração sobre uma entidade (geralmente um usário) e dados adicionais. Algumas das reivindicações padrão mais usadas são:
- iss (issuer): emissor do token;
- aud (audience): destinatário pretendido do token;
- exp (expiration time): data e hora em que o token expira;
- nbf (not before): data e hora em que o token se torna válido;
- iat (issued at): data e hora em que o token foi emitido;
- sub (subject): sujeito do token (geralmente o usuário de identificação)
Assim como o cabeçalho, o payload também é codificado em Base64URL e estruturado no formato JSON. Segue um exemplo de como ele pode parecer
{
“sub”: “123456”,
“name”: “Snappy HostGator”,
“email”: “[email protected]”,
“role”: “admin”
}
Nesse exemplo, as informações pertinentes do usuário como o ID do sujeito (sub), o nome, o e-mail e a função são armazenadas e transmitidas de forma segura.
Signature
Por último, mas não menos importante, a assinatura é uma parte essencial do JWT, que efetivamente garante a integridade dos dados transmitidos e assim consegue confirmar a autenticidade do token. Isso é crucial para evitarmos qualquer manipulação de dados durante a transmissão.
A signature é criada combinando o header e o payload codificados, junto com uma chave secreta, pelo meio de um algoritmo específico. Esse algoritmo é definido no header do JWT. Por exemplo, se usarmos o algoritmo SHA256 (conforme especificado no header) e a chave secreta “secret”, a assinatura será criada dessa forma.
HMACSHA256(
base64UrlEncode(header) + “.” +
base64UrlEncode(payload),
‘secret’
)
)
Essa assinatura é adicionada como a terceira parte do JWT. Quando um token é recebido, o receptor pode decodificar a assinatura usando a mesma chave secreta e algoritmo, e comparar com a informação que ele mesmo gera.
Se ambas as informações combinarem, isso valida a autenticidade do token e garante que os dados não foram manipulados durante a transmissão.
Exemplo de uso do JWT
Podemos considerar um cenário comum, aonde temos um site com uma área de membros aonde os usuários precisam fazer login para acessar.
Quando o usuário se registra ou faz login pela primeira vez, o servidor verifica as credenciais do usuário e, se forem válidas, gera um JWT. Esse JWT pode incluir informações como a identificação do usuário (sub) e o nível de acesso dele (role) e então o servidor retorna esse JWT para o cliente.
O cliente, geralmente o navegador, vai armazenar esse JWT, normalmente em um cookie ou no localStorage. Então, sempre que o cliente faz uma requisição para o servidor para acessar uma página ou algum recurso que requer a autenticação, ele envia o JWT junto na requisição.
Nesse momento, quando o servidor recebe a requisição, ele primeiro verifica a assinatura do JWT para se certificar de que é válido e não foi adulterado de alguma forma. Se assinatura for válida, o servidor lê o payload do JWT para identificar o usuário.
Isso permite que o servidor saiba quem é e o que ele pode fazer sem a necessidade constante de consultar o banco ou manter um estado de sessão, tornando esse processo simplificado e a aplicação mais eficiente para o usuário.