Esta resposta foi elaborada com a ajuda de dois desenvolvedores seniores (John Brayton e David Jennes).
O principal motivo para usar um token de atualização é reduzir a superfície de ataque.
Vamos supor que não haja chave de atualização e vamos seguir este exemplo:
Um edifício tem 80 portas. Todas as portas são abertas com a mesma chave. A chave muda a cada 30 minutos. No final dos 30 minutos, tenho de dar a chave antiga ao fabricante de chaves e obter uma nova chave.
Se eu sou o hacker e pega sua chave, no final dos 30 minutos, eu a enviarei por correio ao fabricante de chaves e pegarei uma nova chave. Serei capaz de abrir todas as portas continuamente, independentemente da alteração da chave.
Pergunta: Durante os 30 minutos, quantas oportunidades de hackers tive contra a chave? Eu tive 80 oportunidades de hackers, cada vez que você usava a chave (pense nisso como fazendo uma solicitação de rede e passando o token de acesso para se identificar). Então essa é a superfície de ataque 80X.
Agora vamos seguir o mesmo exemplo, mas desta vez vamos assumir que há uma chave de atualização.
Um edifício tem 80 portas. Todas as portas são abertas com a mesma chave. A chave muda a cada 30 minutos. Para obter uma nova chave, não consigo passar o token de acesso antigo. Devo apenas passar a chave de atualização.
Se eu sou o hacker e obtemos sua chave, posso usá-la por 30 minutos, mas no final dos 30 minutos o envio para o keymaker não tem valor. Se sim, o fabricante de chaves diria apenas esse token de atualização incorreta. Para poder estender meu hack, eu teria que hackear o correio para o keymaker. O correio tem uma chave distinta (pense nisso como um token de atualização).
Pergunta: Durante os 30 minutos, quantas oportunidades de hackers tive contra a chave de atualização? 80? Não. Eu só tive 1 oportunidade de hacking. Durante o tempo, o correio se comunica com o chaveiro. Então essa é a superfície de ataque 1X. Eu tive 80 oportunidades de hackers contra a chave, mas elas não são boas após 30 minutos.
Um servidor verificaria um token de acesso com base nas credenciais e na assinatura (normalmente) de um JWT.
Um token de acesso vazando é ruim, mas depois que expira, não é mais útil para um invasor. Um token de atualização vazando é muito pior, mas presumivelmente é menos provável. (Acho que há espaço para questionar se a probabilidade de um token de atualização vazar é muito menor do que a de um token de acesso, mas essa é a ideia.)
O ponto é que o token de acesso é adicionado a cada solicitação que você faz, enquanto um token de atualização é usado apenas durante o fluxo de atualização. Portanto, menos chance de um MITM ver o token
A frequência ajuda um invasor. Possíveis falhas de segurança no SSL, falhas de segurança no cliente e falhas de segurança no servidor tornam possível o vazamento.
Além disso, se o servidor de autorização for separado do servidor de aplicativos que processa outras solicitações do cliente, esse servidor de aplicativos nunca verá tokens de atualização. Ele verá apenas tokens de acesso que não permanecerão por muito mais tempo.
A compartimentalização é boa para segurança.
Por último, mas não menos importante, veja esta resposta incrível
De que token de atualização NÃO se trata?
A capacidade de atualizar / revogar o nível de acesso por meio de tokens de atualização é um subproduto da escolha de usar tokens de atualização; caso contrário, um token de acesso independente pode ser revogado ou ter seu nível de acesso modificado quando expirar e os usuários receberem um novo token