Autenticacao e Complexa Por Um Bom Motivo
Autenticacao mal feita e a vulnerabilidade numero 1 em aplicacoes web. Vamos entender cada abordagem e quando usar.
Session-Based (Classica)
O servidor cria uma sessao e guarda no banco/Redis. O cliente recebe um cookie com o session ID.
- Pros: simples, facil de invalidar, seguro
- Contras: nao escala horizontalmente sem Redis, problemas com mobile
- Quando usar: aplicacoes web tradicionais, admin panels
JWT (JSON Web Token)
Token auto-contido que carrega as informacoes do usuario. O servidor nao precisa guardar estado.
- Pros: stateless, escala facil, funciona com mobile e SPAs
- Contras: nao da para invalidar individualmente, token pode ser grande
- Quando usar: APIs, microservicos, apps mobile
Implementacao Segura de JWT
import { SignJWT, jwtVerify } from 'jose';
const SECRET = new TextEncoder().encode(process.env.JWT_SECRET);
// Criar token
const token = await new SignJWT({ userId: user.id })
.setProtectedHeader({ alg: 'HS256' })
.setExpirationTime('7d')
.setIssuedAt()
.sign(SECRET);
// Verificar token
const { payload } = await jwtVerify(token, SECRET);
OAuth 2.0 / Social Login
Delega autenticacao para terceiros (Google, GitHub, etc).
- Pros: sem gerenciar senhas, confiavel, UX simples
- Contras: dependencia de terceiro, configuracao inicial complexa
- Quando usar: apps B2C, quando nao quer gerenciar senhas
Onde Guardar Tokens
| Metodo | Seguranca | Acesso JS |
|---|---|---|
| Cookie httpOnly | Alta | Nao (bom) |
| localStorage | Baixa (XSS) | Sim |
| sessionStorage | Media | Sim |
Recomendacao: sempre use cookies httpOnly com flags Secure e SameSite.
NextAuth.js
Para projetos Next.js, o NextAuth simplifica tudo:
// Suporta Google, GitHub, Email, Credentials...
import NextAuth from 'next-auth';
import GoogleProvider from 'next-auth/providers/google';
export default NextAuth({
providers: [
GoogleProvider({
clientId: process.env.GOOGLE_ID,
clientSecret: process.env.GOOGLE_SECRET,
})
]
});
Dicas de Seguranca
- Nunca armazene senhas em texto puro — use bcrypt com salt
- Rate limit em login (maximo 5 tentativas por minuto)
- Tokens de curta duracao + refresh tokens
- HTTPS obrigatorio
- Protecao contra CSRF em formularios