Makrosites

Suas ideias em realidade digital!

Como armazenar JWT com segurança: cookie httpOnly ou localStorage?

Como armazenar JWT com segurança: cookie httpOnly ou localStorage?

Onde armazenar JWT com segurança?

Depois de implementar login com JWT, surge uma dúvida comum: onde armazenar o token no front-end?

As opções mais usadas são:

Cada uma tem vantagens e riscos.


1) localStorage (mais comum, mas perigoso)

É simples e funciona bem:

localStorage.setItem("token", jwt);

Mas o problema é o XSS (Cross-Site Scripting). Se seu site tiver uma falha de XSS, um atacante pode executar:

localStorage.getItem("token");

E roubar o token.

Risco

---

2) sessionStorage

Funciona igual ao localStorage, mas o token é apagado ao fechar o navegador.

sessionStorage.setItem("token", jwt);

Ainda sofre com XSS.

---

3) Cookie httpOnly (mais seguro)

O cookie httpOnly não pode ser acessado via JavaScript.

<?php
setcookie("access_token", $jwt, [
  "expires" => time()+900,
  "path" => "/",
  "secure" => true,
  "httponly" => true,
  "samesite" => "Lax"
]);

Vantagens

Desvantagens

---

JWT + CSRF: cuidado importante

Se usar cookie, você precisa proteger contra CSRF.

Exemplo simples de proteção CSRF

<?php
if ($_SERVER["REQUEST_METHOD"] === "POST") {
  $csrfHeader = $_SERVER["HTTP_X_CSRF_TOKEN"] ?? "";
  if ($csrfHeader !== $_SESSION["csrf_token"]) {
    http_response_code(403);
    exit;
  }
}
---

Resumo comparativo

Armazenamento XSS CSRF Recomendado?
localStorage ❌ Vulnerável ✔️ Não sofre CSRF ⚠️ Só se não puder usar cookie
sessionStorage ❌ Vulnerável ✔️ Não sofre CSRF ⚠️ Melhor que localStorage
Cookie httpOnly ✔️ Protegido ⚠️ Precisa proteção ✅ Recomendado
---

Conclusão

Para aplicações web modernas:

Evite armazenar JWT sensível em localStorage se segurança for prioridade.