- Recapitular: Session Identifiers
- Cookies, da maneira correta
- Introdução a JWT
- Access Tokens e Refresh Tokens
- Armazenando JWTs no browser
- Angular especificidades
Identificadores de sessão, esse é uma maneira prática e simples para gerenciar uma sessão para um usuário que consiste básicamente em três passos:
a imagem abaixo detalha como isso acontece:
podemos ver que o usuário faz login e quando isso acontece é enviando o login e senha via POST estando tudo certo o servidor retorna um http statusCode 200 e seta um ID para a sessão armazena esse session ID em um cookie e quando o usuário fizer uma requisição para profile por exemplo é feito um get nesse cookie e nesse momento ocorre uma verificação se o session ID for igual ao que foi enviando pelo servidor então e retornado um 200 e para cada requisição tudo ocorre asim.
Preocupação com session ID
- eles não tem nenhum significado são códigos gerados aleatoreamente
- aumenta a carga ao banco de dados, é feita uma pesquisa pelo session ID em cada requisição
- precisam ser protegidos para evitar ataques a sessão
Cookies podem ser facilmente comprometidos:
- Man-in-the-middle (MITM)
- Cross-Site Scripting (XSS)
- Cross-Site Request Forgery (CSRF)
Man-in-the-middle (MITM)
Alguém pode ouvir a conversa entre o browser e o servidor e interceptar e roubar o cookie durante essa 'conversa'
Solução:
Cross-Site Scripting (XSS)
Esse é um problema real, e ocorre quando alguém roda um script mal intencionado dentro do browser direcionado para o dominio a ser atacado e pode ser usado para roubar cookies.
aqui temos um exemplo isso EXEMPLO. podemos ver no exemplo que é executado um código malicioso no browser e com isso o atacante tem acesso a todos os nossos cookies.
Solução:
links de exemplo:
https://www.owasp.org/index.php/XSS
https://www.google.com/about/appsecurity/learning/xss/
Cross-Site Request Forgery (CSRF)
Explora o fato de tags HTML não seguir a mesma política de origem ao fazer solicitações GET.
exemplo: um atacante coloca uma imagem com conteúdo malicioso dentro de uma pagina WEB que seus usuários visitam.
<img src="https://trustyapp.com/transferMoney?to=BadGuy&amount=10000"/>
o que irá acontecer aqui é:
Solução:
Double-submit cookie
a imagem abaixo detalha como isso acontece:
e o servidor agora sabe tratar e rejeitar a ação maliciosa.
a imagem abaixo detalha como isso acontece:
para saber mais:
https://www.owasp.org/index.php/Cross-Site_Request_Forgery_(CSRF)
https://developer.mozilla.org/en-US/docs/Web/Security/Same-origin_policy
Definição
JSON web tokens (JWT)
um JWT parece com uma string sem sentido algo do tipo
eyJ0eXAiOiJKV1QiLA0KICJhbGciOiJIUzI1NiJ9.eyJ
pc3MiOiJqb2UiLA0KICJleHAiOjEzMDA4MTkzODAsDQo
gImh0dHA6Ly9leGFtcGxlLmNvbS9pc19yb290Ijp0cnV
lfQ.dBjftJeZ4CVPmB92K27uhbUJU1p1r_wW1gFWFOEj
Xk
mas ele não é 'sem sentido', o JWT consiste em uma estrutura com três partes encodadas em Base64-URL:
e esse mesmo JWT decodificado fica dessa forma:
o body do JWT é a parte mais importante e está dividida da seguinte forma:
{
"iss":"http://trustapp.com/", <---- quem emitiu o token.
"exp":"1300819380", <---- quando vai expirar.
"sub":"users/258594", <---- quem representa ( usuário ).
"scope":"self api/buy", <--- o que pode fazer.
}
Enviando e verificando JWTs
Enviando JWTs:
Verificando JWTs:
OAuth2 + JWT ( Access & Refresh Tokens )
Access & Refresh tokens:
Lhe da o controle baseado no tempo de troca: stateless confiável vs Database lookup.
Exemplos:
- Super-seguro ( se deseja forçar o usuário a sair rapido: )
- Access token TTL = 1 minuto
- Refresh token TTL = 30 minutos
- Mobile/social app ( usuário deve ficar sempre logado )
- Access token TTL = 1 hora
- Refresh token TTL == 4 anos
preocupações:
- Local storage não é seguro ( XSS vulnerabilidade)
- Cookies são segures, com HttpOnly, Secure Flags e CSRF prevenção.
- Usando o header Authorização fica legal mas não é realmente necessário.
- Cross-domain request são sempre um inferno :D
Lógica de authenticação usnado cookies:
- Existe um token e acesso? ele é valido? ( assinatura e expiração)?
- Sim? libera o request!
- Não? tente pegar um novo access token, usando o refresh token
- Isso funcionou?
- Sim? libera o request e manda o novo acess token no response como cookie.
- Não? Rejeita o request e deleta o refresh token cookie.
- Isso funcionou?
JWT com angularJS
O usuário está logado?
- manter $rootScope.user
- null = nós não sabemos quem é
- fakse = não esta logado
- { } = nos temos um usuário data
Verificar o acesso do usuário para a view exemplo:
$stateProvider
.state('home', {
url:'/',
templateUrl:'views/home.html',
resolve: {
user: function($auth) {
return $auth.getUser()
.then(function(user) {
// pode ter acesso a view?
return true/false;
})
}
}
})
Se o acesso foi removido?