Desenvolvimento

O que é JWT?

O que é JWT? Segurança deve ser um ponto vital para qualquer aplicação web. Não importando o tamanho, ela sempre conterá dados que necessitam de alguma proteção. APIs também se enquadram neste quesito, mas as formas tradicionais de autenticação, baseadas em telas de login e sessão, não podem ser aplicadas neste tipo de aplicação.

O que é JWT? Primeiramente segurança deve ser um ponto vital para qualquer aplicação web. Não importando o tamanho, ela sempre conterá dados que necessitam de alguma proteção. APIs também se enquadram neste quesito, mas as formas tradicionais de autenticação, baseadas em telas de login e sessão, não podem ser aplicadas neste tipo de aplicação.

Tendo isso em vista a forma mais comum de realizar a autenticação e autorização em APIs é através do Token Based Authentication que utiliza um token JWT. Mas antes que possamos falar sobre o processo de autenticação e autorização via JWT é necessário entender o que é e qual a estrutura do JWT ou JSON Web Token.

O que é JWT?

JWT ou JSON Web Token é um padrão da indústria definido pela RFC7519 que tem como objetivo transmitir ou armazenar de forma compacta e segura objetos JSON entre diferentes aplicações. O JWT é digitalmente assinado usando uma chave secreta com o algoritmo HMAC ou um par de chaves pública e privada RSA ou ECDSA.

Quando devo usar JWT?

O JSON Web Token é utilizado em dois principais cenários, quando queremos realizar um processo de autorização em nossa aplicação ou quando queremos realizar troca de informações, abaixo detalhamos um pouco mais sobre o uso do JWT em cada um dos cenários citados.

  • Autorização: Este é o cenário mais comum para o uso do JWT. Depois que o usuário estiver autenticado, cada requisição subsequente incluirá o JWT, permitindo que o usuário acesse rotas, serviços e recursos permitidos com esse token.
  • Troca de Informações: JSON Web Tokens são uma boa maneira de transmitir informações com segurança entre as partes. Como os JWTs podem ser assinados, por exemplo, usando pares de chaves pública e privada podemos garantir que os remetentes são quem dizem ser.

Qual a estrutura do JWT?

Em sua forma compactada, JSON Web Tokens consistem em três partes separadas por pontos (.), Que são:

  • Header
  • Payload
  • Signature

Portanto, um JWT normalmente se parece com o seguinte: xxxxx.yyyyy.zzzzz.

Cada uma das partes que compõem o JWT será detalhada abaixo.

Header

O header ou cabeçalho normalmente consiste em duas partes. O tipo de token, que é JWT e o algoritmo de assinatura que está sendo utilizado, como HMAC SHA256 ou RSA.

Por exemplo:

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

Por mais que o header seja composto geralmente pelas duas partes citadas acima, não obrigatoriamente todo token JWT contém a informação do tipo do token, a informação que de fato não pode faltar é a que diz qual o algoritmo de assinatura utilizado.

Inclusive, boa parte das bibliotecas utilizadas para gerar tokens JWT não incluem a informação do tipo do token no header do mesmo, um exemplo disso seria a biblioteca jjwt bastante utilizada em aplicações Java.

Payload

A segunda parte do token é o payload ou corpo, que contém as claims. As claims são declarações sobre uma entidade (normalmente, o usuário) e dados adicionais.

Um exemplo de um payload pode ser:

{
  "sub": "1234567890",
  "name": "John Doe",
  "admin": true
}

Aqui também vale uma ressalva, o corpo do token JWT é composto por informações opcionais, ou seja, por informações que a aplicação que gerou o token deseja informar, com exceção da chave sub que é de fato obrigatória, pois a mesma é um identificador da entidade a qual o token se refere.

Quando falamos do JWT sendo utilizado para realizar autenticação em APIs, o sub geralmente irá conter o nome do usuário que está tentando acessar os recursos da aplicação, além do sub também é comum possuir a chave iat (issued at) que possui uma informação de data e hora no formato timestamp com o momento em que o token foi gerado e também possuirá a chave exp (expire) que possui a informação de data e hora também no formato de timestamp com o momento em que este token irá expirar.

Signature

Para criar a parte da assinatura, você deve pegar o cabeçalho codificado, o payload codificado, a chave secreta, o algoritmo especificado no cabeçalho e assiná-lo.

Por exemplo, se você deseja usar o algoritmo HMAC SHA256, a assinatura será criada da seguinte maneira:

HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload),
  secret)

Colocando tudo junto

A saída são três strings Base64-URL separadas por pontos que podem ser facilmente passadas em ambientes HTML e HTTP, embora sejam mais adequadas aos padrões baseados em XML ou REST.

O seguinte mostra um JWT que tem o cabeçalho anterior e payload codificados e é assinado com uma chave secreta.

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.
eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.
SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

Especificações da familia JOSE
O JWT faz parte de uma família de especificações chamada JOSE (JSON Object Signing and Encryption), as especificações que fazem parte dessa família são:

JWT (JSON Web Token): Representa o token propriamente dito;
JWS (JSON Web Signature): Representa a assinatura do token;
JWE (JSON Web Encryption): Representa a assinatura para criptografia do token;
JWK (JSON Web Keys): Representa as chaves para a assinatura;
JWA (JSON Web Algorithms): Representa os algoritmos para assinatura do token;

Por que usar o JWT?

O JWT desde o momento de sua criação ganhou bastante popularidade e atualmente é uma das maneiras mais utilizadas de realizar troca de informações e autorização em APIs, essa popularidade se dá principalmente por dois fatores:

Utiliza JSON, que é amplamente utilizado, simples de manipular em qualquer linguagem e leve para ser transportado pela rede;
Seguro, pois é possível verificar se o conteúdo é válido a partir do próprio token e no caso do token ser assinado com um par de chaves pública e privada é também possível verificar se o remetendo do token é quem diz ser;

Conclusão

Neste artigo vimos o que é o JSON Web Token e as especificações que a permeiam, também vimos a sua estrutura e os principais cenários de uso. O JWT é uma tecnologia bastante utilizada em cenários reais e por isso é bastante importante que toda desenvolvedora ou desenvolvedor tenha conhecimento da mesma.

Leia também: ''Aprenda a melhorar suas buscas no Google''