O JWT (Json Web Token) é um padrão para autenticação e compartilhamento de informações. Baseado no formato JSON, é fundamental para qualquer desenvolvedor ou desenvolvedora que queria se destacar na área. 

Por ser composto por uma longa sequência de caracteres, entre letras e números, o JWT pode assustar quem o vê pela primeira vez. Também, ele possui várias claims de tipos e funções diferentes, e um funcionamento próprio em cada segmento que o constitui.

Compacto, completo e fácil de usar, essa funcionalidade garante, acima de tudo, a segurança por meio de diversas claims e uma assinatura digital. Além disso, ele é aceito por uma ampla gama de linguagens. 

Se você quer saber a fundo o que é jwt e como usar, vem comigo!

O que é JWT?

Json Web Token, é um padrão para autenticação e troca de informações, definido pela RFC7519. De forma bastante resumida, consiste em um conjunto de solicitações. O JWT se faz essencial por ser uma forma extremamente segura de compartilhamento de informações e autenticação de usuários. É um formato baseado em texto e amplamente aceito por diversas linguagens, característica que carrega por utilizar JSON como base.

Esse é o grande diferencial do JWT em relação a outras opções, pois o JSON é um padrão mais vantajoso de troca e armazenamento de informação. Alguns dos concorrentes são o SWT (Simple Web Tokens) e o SAML (Security Assertion Markup Language Tokens), que usa o padrão XML.

O JWT é, na verdade, um dos elementos de uma estrutura ainda maior, o JOSE (Json Object Signing and Encryption). No JOSE, estão contidas várias outras especificações. São elas: o JWE (Json Web Encryption), responsável pela criptografia para a assinatura do token; o JWA (Json Web Algorithms), a respeito do algoritmo; JWK (Json Web Keys), correspondente as chaves para assinatura; JWS (Json Web Signature), a assinatura do token. Por fim, o JWT, elemento JOSE, é o token em si.

O que são tokens?

De forma resumida, o token é uma assinatura digital, ou seja, uma chave. O token é exatamente o elemento JWT do guarda-chuva JOSE, que contém vários outros elementos, como vimos.

Ele é exatamente a especificação JWT, é o JWT em si. Daqui em diante, falaremos jwt token para nos referirmos ao token. 

Assim, o token, ou o JWT, é uma string, uma cadeia de caracteres que funciona como referência para representação de um objeto. Na prática, então, um jwt token é uma sequência de caracteres, composta por três partes. Veremos os três segmentos de caracteres que compõem um token mais adiante.

Os jwt tokens podem ser assinados ou criptografados. No primeiro caso, é usado um JWS (Json Web Signature). Já para criptografia, o elemento JOSE a ser usado é o JWE (Json Web Encryption). 

Entenda a diferença entre autenticação e autorização!

Como vimos, o JWT permite a autenticação e troca de informações entre pessoas usuárias. Por isso mesmo, é preciso ter em mente que autenticação e autorização são etapas diferentes. Basicamente, se uma pessoa usuária deseja a autorização para acessar determinado conteúdo, ele precisa passar por uma autenticação. 

Na prática, a autenticação ocorre para que a pessoa usuária prove sua identidade, demonstrando que pode sim fazer aquele acesso. A autorização, por sua vez, trata do aspecto das permissões.

Para que serve a livraria JWT decode?

A livraria JWT decode funciona como um repositório. Ela serve para auxiliar na decodificação de jwt tokens. Como vimos, eles são codificados em Base64, o que faz com que os conteúdos contidos no token passem a ser aquela chave de caracteres que conhecemos. É importante lembrar que esse conteúdo não é secreto, visto que pode ser aplicado um jwt decode a fim de acessar com clareza seus assuntos. 

Como se baseia JSON, os tokens carregam essas características de fácil usabilidade e ampla gama de linguagens que o aceitam. Assim, existem repositórios que podem ser encontrados no github, por exemplo, ou, algumas vezes, na listagem do próprio site representante do JWT. É importante lembrar que as livrarias jwt decode não validam o token, apenas os decodificam.

Qual a estrutura básica do JWT?

Agora que entendemos o que é um jwt token, vamos a sua estrutura. Em um desses tokens existe uma carga útil, isto é, informações sobre o usuário ou usuária, a permissão e a assinatura, onde há a verificação da validade do token. É auto-contido, já que ele possui nele mesmo essas informações. 

Ele é composto por três sequências de caracteres: header, payload e signature. A divisão entre cada uma delas é dada por um ponto. A serialização acontece usando o método de codificação de dados Base64. Em uma serialização compacta, a estrutura fica assim:

header.payload.signature

aaaaa.bbbbb.ccccc

Cada um desses segmentos tem suas características e especificidades, vejamos a fundo cada um.

Header

Do inglês, header significa exatamente a palavra “cabeçalho” em nossa língua. Localizado no início do token, o header é um objeto do tipo JSON. É composto por dois elementos, o alg e o typ. O alg indica qual o algoritmo de criptografia usado e o typ informa qual o tipo de token. Juntos eles formam a primeira sequência antes do primeiro ponto.

São vários os algoritmos que podem ser usados no alg, como o HMAC, o SH256, o HS384 ou o RSA, por exemplo. 

A seguir, o algoritmo (alg) usado é o HS256. Já o tipo do token, informado pelo typ, é JWT. No nosso exemplo, o HS256 é um algoritmo da web json que possui chave simétrica e não usa certificados. Toda a demonstração de token aqui nesse texto usou a geração de jwt tokens da JWT.

{

  "alg": "HS256",

  "typ": "JWT"

}

Seu segmento no token é o seguinte: 



eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9

Payload

O Payload, segundo segmento do nosso JWT, também é um objeto do tipo JSON. É no segmento do Payload onde estão as claims, que podem ser de três tipos: registred, private e public (registrada, privada e pública, respectivamente). As claims são as reivindicações, fazem parte da carga útil de um desses tokens. 

Enquanto as claims registradas são dadas de forma pré-determinada pelo próprio JWT, as privadas e públicas são criadas pela própria pessoa usuária. A diferença entre as claims personalizadas privadas e públicas é que as privadas costumam conter informações particulares da organização em questão e estão no âmbito apenas daqueles usuários e usuárias implicados nesse jwt token.

Ao usar claims públicas, deve-se tomar muito cuidado para não haver colisões. Para isso, é necessário o uso da ferramenta IANA Json Web Token Registry.

As claims registred (registradas ou reservadas) não são obrigatórias, mas garantem a singularidade do token. Essas claims pré-determinadas podem ainda ser de vários tipos, padronizadas pelo próprio sistema. Veremos a seguir cada uma delas:

  • jti: significa Json Token Identifier, é a identidade (id) única do token.
  • iss: essa claims refere-se ao usuário ou usuária que emitiu o token. O termo vem de Issuer.
  • iat: vem do termo Issued At. Identifica o tempo de existência do token, a partir da hora em que foi emitido.
  • nbf: significa Not Before (Não Antes). Ou seja, dita a partir de quando o jwt token passa a ter validade. Na prática, a iat, que vimos anteriormente, pode ser tratada como nbf, quando ativada essa opção.
  • exp:  vem do termo expiration. É usado para referir-se ao tempo de expiração do jwt token. Após esse período, o token não é mais aceito para processamento. É especialmente útil, porque previne que o jwt token seja usado por alguém indesejado, já que dá ao token uma vida útil.
  • sub: vindo do termo Subject, identifica o assunto do token.
  • aud: por último, essa claim vem do termo Audience (audiência ou público). Ela identifica o público desse token, ou seja, quem vai consumi-lo. Pode ser informado ao token como público uma única pessoa usuária, ou várias. No caso de múltiplos usuários e usuárias, a informação é dada por um array.

É importante não adicionar informações sensíveis no payload, visto que é possível verificar o conteúdo de cada segmento de um jwt token. Esse processo, para visualização do conteúdo, é feito com um Base64 decode. Como você pode observar, o processo para um Base64 decode para visualizar o conteúdo do token é o inverso do que é feito para sua geração, que é um Base64 code.

Vejamos agora como é um segmento payload na prática: 

{

  "sub": "1234567890",

  "name": "John Doe",

  "iat": 1516239022

}

No exemplo, foi usada a claim registrada sub, que trata do assunto do jwt token, a claim personalizada name e, por último, outra claim registrada, iat, que indica a hora em que o jwt token foi emitido. Esse segmento, no resultado final do jwt token, vai ficar da seguinte forma:



JzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ

Signature

O segmento Signature é um dos componentes mais sensíveis do nosso jwt token. Na prática, a Signature (Assinatura) é dada pela codificação (encode) do header e do payload, somado a uma palavra-chave. Ou seja, esse segmento é, por consequência, uma espécie do produto dos outros dois anteriores. A palavra-chave é da escolha de quem cria o jwt token.

O processamento desse segmento se dá no formato que foi especificado no typ do header, JWT. Voltando ao nosso exemplo, tínhamos no header a referência ao tipo JWT. A Signature possibilita verificar se a mensagem do jwt token não foi em algum momento violada.

Essa palavra-chave segredo é que dá poder de geração de outros tokens, sendo então exclusiva do servidor. No nosso token, a palavra-chave escolhida foi segredo. Logo, o campo da Signature ficou assim:

HMACSHA256(

  base64UrlEncode(header) + "." +

  base64UrlEncode(payload),

segredo

)

Já como jwt token, temos o seguinte:



B3I_4fBaJu8mC5J3VSdlvy0lZiIuakS0_MmMrqEY_e4

Como funcionam os JWT (JSON Web Tokens)?

Na prática, os jwt tokens são chaves de acesso assinadas digitalmente, o que garante a segurança e confiabilidade em relação ao acesso aos endpoints da API.. Como os tokens são assinados, é possível ao servidor verificar a legitimidade do token, já que ele mesmo carrega em si essa informação da origem do token. 

Tais tokens se destacam por carregarem conteúdo e assinatura, ao mesmo tempo. Assim, como vimos, os conteúdos de um são visíveis através de um Base64 decode, motivo pelo qual, apesar da mistura extensa de caracteres, deve-se atentar para o fato de que seu conteúdo não é, de forma alguma, secreto ou difícil de ser lido!

Agora sabemos que o que diferencia a forte segurança do JWT não é a ocultabilidade das informações, e sim a confiabilidade das claims e mecanismos de assinatura. Por isso, é importante aproveitar ainda mais as possibilidades da função e usar formas de restringir e garantir ainda mais sua segurança, como por meio da claim de tempo de expiração, a exp, ou claim nbf, not before.

Quando usar e para que serve o JWT?

O JWT é usado principalmente para autenticação, autorização e compartilhamento de informações. A utilização mais comum é para autorização (jwt authorization). Como você já sabe, para a autorização é preciso antes uma autenticação. 

Um outro uso frequente é para a troca de informações. Nesse sentido, o JWT se destaca pela forte segurança dessa operação. Isso porque é verificável o dado de quem o emitiu. É possível ainda, graças a existência de um cabeçalho e payload, conferir a integridade do conteúdo, garantindo assim segurança contra adulterações no material.

Como usar o JWT? Criando um token na prática!

Agora que você já sabe com detalhes cada segmento de um jwt token, vamos à criação! Para chegar ao resultado final, um token pronto, passamos por alguns passos. 

Como vimos, primeiro é necessário ditar um algoritmo (alg) e um tipo (typ), isso no header. O header que é o cabeçalho do token, o primeiro segmento antes do primeiro ponto, a primeira concatenação. 

Segundo, no payload, informa-se as claims daquele token, que podem ser registradas ou personalizadas, sendo que as personalizadas podem ser do tipo público ou privado. O header é processado através de um Base64. O segundo, o Payload, também. Ambos são então concatenados com um ponto “.”

Por último, temos o segmento Signature, com parte do header, do payload e uma palavra-chave. Utilizando ainda o exemplo de criação de jwt token que viemos usando até aqui, temos ainda que concatenar os três elementos. A concatenação do header, payload e signature se dá com 2 pontos finais, entre cada um dos segmentos:



6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.B3I_4fBaJu8mC5J3VSdlvy0lZiIuakS0_MmMrqEY_e4

Você pode testar o que vimos aqui por meio da plataforma jwt.io Debugger!

Validação do Token

Existem algumas formas de observar a validação de um jwt token. A primeira delas passa pela observação de sua estrutura. Agora que você já sabe quais são os três segmentos e como eles são construídos, é possível reconhecer quando estão, pelo menos, de acordo com a estrutura básica. Você pode ainda olhar as claims usadas e verificar se estão de acordo com o proposto. 

Para além dessa forma mais intuitiva, pode-se validar especificamente a assinatura de um jwt. Dessa forma, aplique o decode e utilize a livraria jwt decode para a verificação.

Como fazer autenticação do JWT (JSON Web Token)?

A autenticação é essencial. Nela, depois de realizado um login, a pessoa usuária recebe seu token e passa a poder acessar os endpoints da API. Esse acesso é realizado com usuário e senha, ou ainda algum outro tipo de dado solicitado. Esse login para autenticação é feito no seguinte formato:

{ 

“email” : “[email protected]”,

“senha” : “m94s32uz08a”

}

A partir desse momento, vai ser criado um token que será enviado de volta a pessoa usuária que solicitou sua autenticação. 

Agora que você entendeu o que é um token da JSON e como usá-lo, você pode explorar as possibilidades desse tipo de chave. Com esse token e agora conhecendo o jwt decode e jwt authentication, você pode compartilhar informações com muito mais tranquilidade e segurança.

Gostou desse conteúdo? Veja também uma lista com 26 ferramentas úteis para desenvolvedores

Deixe um comentário
You May Also Like