No contexto das JWTs , o Stormpath escreveu um artigo bastante útil, descrevendo as possíveis maneiras de armazená-las e as (des) vantagens relacionadas a cada método.
Ele também possui uma breve visão geral dos ataques XSS e CSRF e como você pode combatê-los.
Anexamos alguns trechos curtos do artigo abaixo, caso o artigo seja colocado offline / o site seja desativado.
Armazenamento local
Problemas:
O armazenamento na Web (localStorage / sessionStorage) pode ser acessado por meio de JavaScript no mesmo domínio. Isso significa que qualquer JavaScript em execução no seu site terá acesso ao armazenamento na Web e, por isso, pode ser vulnerável a ataques de script entre sites (XSS). O XSS em poucas palavras é um tipo de vulnerabilidade em que um invasor pode injetar JavaScript que será executado na sua página. Os ataques XSS básicos tentam injetar JavaScript através de entradas de formulário, onde o invasor coloca alerta ('Você foi hackeado'); em um formulário para ver se ele é executado pelo navegador e pode ser visualizado por outros usuários.
Prevenção:
Para evitar o XSS, a resposta comum é escapar e codificar todos os dados não confiáveis. Mas isso está longe de ser a história completa. Em 2015, aplicativos web modernos usam JavaScript hospedado em CDNs ou em infraestrutura externa. Os aplicativos da Web modernos incluem bibliotecas JavaScript de terceiros para testes A / B, análise de funil / mercado e anúncios. Usamos gerenciadores de pacotes como o Bower para importar o código de outras pessoas para nossos aplicativos.
E se apenas um dos scripts que você usa estiver comprometido? JavaScript malicioso pode ser incorporado na página e o armazenamento na Web é comprometido. Esses tipos de ataques XSS podem obter o armazenamento na Web de todos que visitam seu site, sem o conhecimento deles. É provavelmente por isso que várias organizações aconselham a não armazenar nada de valor ou confiar em qualquer informação no armazenamento na web. Isso inclui identificadores de sessão e tokens.
Como mecanismo de armazenamento, o Armazenamento na Web não impõe nenhum padrão seguro durante a transferência. Quem lê o Armazenamento da Web e o utiliza deve fazer a devida diligência para garantir que sempre envie o JWT por HTTPS e nunca por HTTP.
Biscoitos
Problemas:
Os cookies, quando usados com o sinalizador de cookie HttpOnly, não são acessíveis por JavaScript e são imunes ao XSS. Você também pode definir o sinalizador de cookie seguro para garantir que o cookie seja enviado apenas por HTTPS. Esse é um dos principais motivos pelos quais os cookies foram aproveitados no passado para armazenar tokens ou dados de sessão. Os desenvolvedores modernos hesitam em usar cookies porque tradicionalmente exigem que o estado seja armazenado no servidor, quebrando assim as melhores práticas RESTful. Os cookies como mecanismo de armazenamento não exigem que o estado seja armazenado no servidor se você estiver armazenando um JWT no cookie. Isso ocorre porque o JWT encapsula tudo o que o servidor precisa para atender à solicitação.
No entanto, os cookies são vulneráveis a um tipo diferente de ataque: falsificação de solicitação entre sites (CSRF). Um ataque de CSRF é um tipo de ataque que ocorre quando um site, email ou blog malicioso faz com que o navegador da Web de um usuário execute uma ação indesejada em um site confiável no qual o usuário está autenticado. Esta é uma exploração de como o navegador lida com cookies. Um cookie pode ser enviado apenas para os domínios nos quais é permitido. Por padrão, este é o domínio que originalmente definiu o cookie. O cookie será enviado para uma solicitação, independentemente de você estar no galaxies.com ou hahagonnahackyou.com.
Prevenção:
Navegadores modernos suportam a SameSite
bandeira , além de HttpOnly
e Secure
. O objetivo desse sinalizador é impedir que o cookie seja transmitido em solicitações entre sites, impedindo muitos tipos de ataques CSRF.
Para navegadores que não suportam SameSite
, o CSRF pode ser evitado usando padrões de token sincronizados. Isso parece complicado, mas todas as estruturas da web modernas têm suporte para isso.
Por exemplo, o AngularJS tem uma solução para validar que o cookie é acessível apenas pelo seu domínio. Diretamente dos documentos do AngularJS:
Ao executar solicitações XHR, o serviço $ http lê um token de um cookie (por padrão, XSRF-TOKEN) e o define como um cabeçalho HTTP (X-XSRF-TOKEN). Como apenas o JavaScript executado em seu domínio pode ler o cookie, seu servidor pode ter certeza de que o XHR veio do JavaScript em execução no seu domínio. Você pode tornar esta proteção CSRF sem estado incluindo uma xsrfToken
reivindicação JWT:
{
"iss": "http://galaxies.com",
"exp": 1300819380,
"scopes": ["explorer", "solar-harvester", "seller"],
"sub": "tom@andromeda.com",
"xsrfToken": "d9b9714c-7ac0-42e0-8696-2dae95dbc33e"
}
Ao alavancar a proteção CSRF da estrutura de aplicativos da web, os cookies são sólidos para armazenar uma JWT. O CSRF também pode ser parcialmente evitado, verificando o referenciador HTTP e o cabeçalho Origin da sua API. Os ataques de CSRF terão cabeçalhos de referência e origem não relacionados ao seu aplicativo.
O artigo completo pode ser encontrado aqui:
https://stormpath.com/blog/where-to-store-your-jwts-cookies-vs-html5-web-storage/
Eles também têm um artigo útil sobre como melhor projetar e implementar JWTs, com relação à estrutura do próprio token:
https://stormpath.com/blog/jwt-the-right-way/