AULA 40 MÓDULO 5 autenticação ⏱ 50 min

JWT — JSON Web Token

Estrutura do JWT: header, payload, signature. Claims registrados. Middleware de autenticação. Access + refresh tokens.

JWTjsonwebtokenclaimsexpBearerrefresh tokenbcrypt

JWT — JSON Web Token

JWT é um padrão aberto (RFC 7519) para tokens auto-contidos. O token carrega o payload (claims) assinado digitalmente — qualquer servidor com a chave valida sem consultar banco.

eyJhbGciOiJIUzI1NiJ9.eyJpZCI6MSwidXNlciI6ImFuYSJ9.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
Header
alg + type
Payload
claims: id, role, exp
Signature
HMAC(header.payload, secret)
⚠️
JWT não é criptografia
JWT garante integridade (não foi alterado) mas não confidencialidade. O payload é base64 — qualquer um pode ler. Nunca coloque senha, cartão ou dados sensíveis no payload.

Claims e expiração

Claims são os dados no payload. Claims registrados: iss (emissor), sub (sujeito), exp (expiração), iat (emitido em). Claims customizados: seus dados de negócio.

refresh tokens
Access token: curto (15min-1h). Refresh token: longo (7-30 dias), armazenado com segurança. Quando o access expira, usa o refresh para obter um novo sem re-login.
javascript
// JWT com jsonwebtoken
const jwt    = require('jsonwebtoken')
const SECRET = process.env.JWT_SECRET

// Gerar token no login
app.post('/auth/login', async (req, res) => {
  const { email, password } = req.body
  const user = await userRepo.findByEmail(email)

  const valid = await bcrypt.compare(password, user.passwordHash)
  if (!valid) return res.status(401).json({ error: 'Credenciais inválidas' })

  const token = jwt.sign(
    { sub: user.id, role: user.role },
    SECRET,
    { expiresIn: '15m' }
  )
  res.json({ token })
})

// Middleware de autenticação
const authenticate = (req, res, next) => {
  const auth = req.headers.authorization
  if (!auth?.startsWith('Bearer '))
    return res.status(401).json({ error: 'Token ausente' })

  try {
    req.user = jwt.verify(auth.slice(7), SECRET)
    next()
  } catch {
    res.status(401).json({ error: 'Token inválido' })
  }
}
quiz · aula 40
Teste seus conhecimentos
0/3 respondidas
QUESTÃO 01
JWT garante confidencialidade do payload?
QUESTÃO 02
Para que serve o campo 'exp' no payload JWT?
QUESTÃO 03
Por que usar tokens de curta duração (15min) para acesso?
0/3