Comment on page
JWT
Aqui vão os principais cuidados ao utilizar tokens JWT:
Quando assinamos o nosso token, precisamos utilizar um segredo de tamanho considerável.
Podemos assinar um token JWT de várias formas, mas as principais são utilizando chaves simétricas (HS256, HMAC + SHA-256) e assimétricas (RS256, RSA + SHA-256).
Como recomendação, é melhor utilizar assinatura assimétrica, uma vez que:
- Apenas um serviço consegue gerar o token (utilizando chave privada), enquanto outros serviços só conseguem verificar (chave pública).
- Se a chave privada for comprometida, rotacionar ela não quebra as outras aplicações com o token atual, afinal, as chaves públicas de verificação continuarão funcionando.
JWT com chave assimétrica
1
const fs = require('fs');
2
const jwt = require('jsonwebtoken');
3
4
// use 'utf8' to get string instead of byte array (512 bit key)
5
const privateKEY = fs.readFileSync('./private.key', 'utf8');
6
const publicKEY = fs.readFileSync('./public.key', 'utf8');
7
8
const payload = {
9
name: 'Gandalf'
10
}
11
12
// SIGN
13
const signOptions = {
14
issuer: "Authorizaxtion/Resource/This server",
15
subject: "[email protected]",
16
audience: "Client_Identity",
17
expiresIn: "1d",
18
algorithm: "RS256"
19
};
20
21
const token = jwt.sign(payload, privateKEY, signOptions);
22
console.log('\n\n=== TOKEN ===');
23
console.log(token);
24
25
26
// VERIFY
27
var verifyOptions = {
28
issuer: "Authorizaxtion/Resource/This server",
29
subject: "[email protected]",
30
audience: "Client_Identity",
31
expiresIn: "1d",
32
algorithm: "RS256"
33
};
34
35
const verified = jwt.verify(token, publicKEY, verifyOptions);
36
console.log('\n\n=== VERIFIED ===');
37
console.log(verified);
38
39
40
// DECODE
41
const decoded = jwt.decode(token, { complete: true });
42
console.log('\n\n=== DECODED ===');
43
console.log(decoded);
44
Existe um tipo de vulnerabilidade que ocorre em algumas configurações de JWT que é o None Algorithm.
Em resumo, o atacante muda o header do JWT para:
{
"typ": "JWT",
"alg": "none"
}
E no backend a lib que usamos pega o valor do alg e ignora a chave de verificação.
Para que isto não aconteça, sempre devemos definir o alg no momento de verificar o token:
var verifyOptions = {
//...
algorithm: "RS256"
};
const verified = jwt.verify(token, publicKEY, verifyOptions);
Last modified 8mo ago