O que é JWT?
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''