JWT (Json Web Token) é um padrão aberto para transmitir informações de forma segura entre partes como um objeto JSON. Um token JWT consiste em três partes separadas por pontos que contêm cabeçalho, carga útil e assinatura. A carga útil normalmente inclui informações como emissor, data de emissão e expiração que são usadas para validar o token.
2. O que é JWT?
Do site oficial:
JSON Web Token (JWT) is an open standard (RFC 7519) that defines a compact and self-contained way for
securely transmitting information between parties as a JSON object. – http://jwt.io
Traduzindo, é um padrão aberto que define uma forma compacta e auto-contida
para transmitir de forma segura, informações entre duas partes como objeto JSON.
3. Estrutura
O token é formado por 3 partes separados por pontos (.):
Header
Payload
Signature
São 3 partes, separadas por um . (ponto), encodadas por base64 individualmente:
<base64-encoded header>.<base64-encoded claims>.<base64-encoded assinatura>
4. Header
A primeira parte da estrutura é seu header que contém informações sobre qual
criptografia está sendo usada. Consiste em 2 partes encodados em Base64:
O tipo (JWT)
E o algoritmo de hash usado (HMAC SHA256 ou RSA).
{
"alg": "HS256",
"typ": "JWT"
}
6. Payload ou Claims
A segunda é seu conteúdo. O Conteúdo de um JWT são Claims. Claims são
informações que seu JWT passa como pares de chave valor para seu servidor
validar.
Existem 2 tipos de Claims que são Reserved Claims , que são Claims já pré-
definidos (compare com keywords de uma linguagem) e Application Defined
Claims , que são Claims “customizados”, que você vai criar para sua aplicação usar.
7. Exemplos de Claims
Alguns exemplos de Reserved Claims são:
“iss” (Issuer): Informar da onde o token está vindo.
“iat” (IssuedAt): Quando o token foi gerado.
“exp” (Expiration): Quando o token expira.
“sub” (Subject): A entidade a quem este token pertence (geralmente o Id do
usuário)
http://www.iana.org/assignments/jwt/jwt.xhtml
9. Signature
A terceira é a assinatura do token, ou seja, se queremos garantir que o token não
foi corrompido podemos usar a Signature(Assinatura) com o Header para isso.
Para assinar o token, usamos a Header, Payload, o algoritmo definido na header,
um secret.
Assim, no exemplo, foi usado o HMAC SHA256 (HS256), então teríamos:
HMACSHA256(header + "." + payload, secret)
Onde header e payload já estão encodados em Base64.
12. Fluxo de uso de JWT para um CLIENT
1. Quero acessar uma rota protegida, tipo /users
2. Faço o login, enviando (de forma segura, por https) usuário e senha.
3. Login com sucesso, recebe o ‘TOKEN’. Guardo pra usar depois
4. Faço a requisição que eu queria na /users porém, com o http Header
Authorization: meutokenaqui
5. Com o token enviado, o servidor me identifica e autoriza (ou não) meu acesso,
retornando a resposta à minha requisição.
13. Fluxo de uso de JWT para o SERVER
1. Se tentarem acessar uma rota protegida sem token, não autoriza.
2. Se tentar acessar com um token, verifica se é válido. Se for, consegue
identificar o usuário pelo TOKEN e libera o acesso.
3. Quando um usuário faz login, geramos um token, para ele poder fazer
requisições autenticadas.
14. Implementação
- No site oficial do JWT (jwt.io) existem links para diversas bibliotecas para
várias linguagens de programação.
- Também no site oficial é possível verificar se a lib implementa completamente
todos os recursos do JWT.
- No Packagist (https://packagist.org/) também encontramos várias opções
- Possibilidade de implementar manualmente o protocolo, sem utilização de libs
de terceiros.