Tudo o que você precisa saber sobre JSON Web Tokens
Published: 2020-01-08 16:34:01

![JWT](https://thepracticaldev.s3.amazonaws.com/i/b6xlt9dc50d5cryssjw7.png)

O **J**SON **W**eb **T**oken (JWT) é um **padrão** aberto, que define uma maneira compacta e independente de **transmitir informações com segurança** entre as partes, utilizando um objeto JSON.

Os tokens assinados podem verificar a integridade das reivindicações (_claims_) contidas nele, enquanto os tokens criptografados ocultam essas reivindicações de outras partes. Quando os tokens são assinados usando pares de chaves pública / privada, a assinatura também certifica que apenas a parte que detém a chave privada é a que o assinou.

## E onde deveria usá-los?

Dois cenários principais, onde JWTs são úteis:

**Autorização**: este é o cenário mais comum para o uso do JWT. Após o login do usuário, cada solicitação subsequente incluirá o JWT, permitindo que o usuário acesse rotas, serviços e recursos permitidos com esse token. O SSO (Single sign-on) é um recurso que usa amplamente o JWT atualmente, devido à sua pequena sobrecarga e à capacidade de ser facilmente usado em diferentes domínios. 

**Troca de informações**: os JSON Web Tokens são uma boa maneira de transmitir informações com segurança entre as partes. Como as JWTs podem ser assinadas (por exemplo, usando pares de chaves públicas / privadas), você pode ter certeza de que os remetentes são quem eles dizem que são. Além disso, como a assinatura é calculada usando o cabeçalho e o payload, você também pode verificar se o conteúdo não foi violado.


## Certo, e como é a estrutura de um JWT?

JSON Web Tokens são compostos por 3 partes, separadas por um ponto: Cabeçalho (_header_), dados (_payload_) e assinatura (_signature_).

### Cabeçalho (_header_)

![Header JWT](https://thepracticaldev.s3.amazonaws.com/i/yos4dgaygpgazrieu1mb.png)

O cabeçalho geralmente consiste em duas partes: o **tipo do token**, que é JWT, e o **algoritmo de assinatura** que está sendo usado, como HMAC SHA256 ou RSA.

![Conteúdo do cabeçalho](https://thepracticaldev.s3.amazonaws.com/i/opoupkjm59nhfxkacqy0.png)

Em seguida, esse JSON é codificado em **Base64Url** para formar a primeira parte do JWT.


### Dados (_payload_)

![Payload JWT](https://thepracticaldev.s3.amazonaws.com/i/00mlh2sjyglx3osmy5mp.png)

O payload é exatamente os **dados** que você deseja enviar para a outra parte. Geralmente segue um **padrão** (_registered claims_), mas não é obrigatório, portanto aceita qualquer JSON

![Conteúdo do payload](https://thepracticaldev.s3.amazonaws.com/i/jnt73t4ysx19rmckoxod.png)

O payload é então codificado em **Base64Url** para formar a **segunda parte** do JWT.

### Assinatura (_signature_)

![Assinatura JWT](https://thepracticaldev.s3.amazonaws.com/i/tpl00cn5admh0blm9bpq.png)

Para criar a parte da assinatura, é necessário pegar o **cabeçalho** codificado, a **payload** codificado, **um segredo**, o **algoritmo** especificado no cabeçalho e assinar isso.

![Conteúdo da assinatura](https://thepracticaldev.s3.amazonaws.com/i/cfyvniiqrb81gqlafqt6.png)

A assinatura é usada para **verificar** se a mensagem não foi **alterada** ao longo do caminho e, no caso de tokens assinados com uma **chave privada**, também pode verificar se o remetente da JWT **é quem diz ser**.

> Esse conteúdo também está lá no [insta da codar.me](http://bit.ly/30cofQt), segue lá, que tenho postado conteúdo com frequência! Ah, e se inscreve no [canal do youtube](http://bit.ly/2FyBaCF) pra conteúdos mais aprofundados! :)