Conforme as aplicações foram deixando de ser só páginas web e passaram a incluir apps mobile, integrações e microsserviços, um novo problema apareceu: como autenticar sem depender de sessão guardada no servidor? A resposta mais popular hoje é o token Bearer, especialmente na forma de JWT.
Um token Bearer funciona de um jeito bem direto: quem apresenta o token é considerado autenticado. Ele é enviado em todas as requisições dentro do cabeçalho Authorization, assim: Authorization: Bearer <token>.
O JWT (JSON Web Token) é o formato mais usado de token Bearer hoje. Ele é dividido em três partes separadas por ponto, cada uma codificada em Base64: um cabeçalho, um conjunto de informações (chamadas de claims, como o ID do usuário e a data de expiração) e uma assinatura que garante que ninguém alterou o conteúdo pelo caminho.
Um exemplo de geração e validação de JWT em PHP, usando a biblioteca firebase/php-jwt:
<?php
use FirebaseJWTJWT;
use FirebaseJWTKey;
function gerarJwt(int $usuarioId, string $chaveSecreta): string {
$payload = [
'sub' => $usuarioId,
'iat' => time(),
'exp' => time() + 900, // expira em 15 minutos
];
return JWT::encode($payload, $chaveSecreta, 'HS256');
}
function validarJwt(string $token, string $chaveSecreta): ?array {
try {
$decodificado = JWT::decode($token, new Key($chaveSecreta, 'HS256'));
return (array) $decodificado;
} catch (Exception $e) {
return null;
}
}
A grande vantagem do JWT é não depender de nenhum estado guardado no servidor: qualquer serviço que conheça a chave secreta consegue validar o token sozinho, o que facilita muito arquiteturas com vários microsserviços.
Por outro lado, um JWT não pode ser "desligado" facilmente antes da hora marcada para expirar, por isso o tempo de vida costuma ser curto (minutos). Outro cuidado importante: o conteúdo do payload é apenas codificado, não criptografado, então nunca é uma boa ideia colocar dados sensíveis dentro dele.


