Uma codificação, dois alfabetos
O Base64 transforma bytes arbitrários em 64 caracteres imprimíveis, quatro caracteres de saída para cada três bytes de entrada. O alfabeto padrão (RFC 4648, seção 4) é A a Z, a a z, 0 a 9 e os dois símbolos + e /, com = usado para preencher o último grupo.
O problema é que +, / e = têm significados especiais em outros contextos. Em uma URL, / é um separador de caminho, + historicamente significa um espaço em strings de consulta e = separa uma chave de um valor. Em um nome de arquivo, / é ilegal na maioria dos sistemas. Então o Base64 puro não pode ser colocado em uma URL ou nome de arquivo sem ser corrompido ou exigir escape adicional.
O que o Base64URL muda
O Base64URL (RFC 4648, seção 5) é a mesma codificação com um alfabeto mais seguro. Exatamente dois caracteres mudam:
+vira-(sinal de menos)/vira_(sublinhado)
Todos os demais caracteres são idênticos, e a aritmética de três bytes para quatro caracteres permanece inalterada. O resultado é uma string que sobrevive ao ser colocada em um caminho de URL, em um parâmetro de consulta ou em um nome de arquivo, sem nenhum percent-encoding.
O preenchimento é a outra diferença. O Base64 padrão preenche o último grupo até um múltiplo de quatro com =. O Base64URL geralmente omite o preenchimento por completo, porque = também é problemático em URLs. Um decodificador sempre consegue recalcular quanto preenchimento foi descartado a partir do comprimento da string, então nada se perde.
Onde você realmente o encontra
O Base64URL não é um canto exótico da especificação. É a codificação por trás de várias coisas que você usa constantemente:
- JSON Web Tokens. Um JWT são três segmentos Base64URL unidos por pontos (
header.payload.signature). A troca de+//e a remoção de=são exatamente o motivo pelo qual um token é uma única string limpa e segura para URLs. - PKCE. O
code_challengeem um fluxo de código de autorização OAuth é a codificação Base64URL (sem preenchimento) de um hash SHA-256, precisamente para que possa trafegar em uma URL. - Web Push, JWK e muitos tokens codificam seus campos binários da mesma forma.
Um cuidado prático
Como os alfabetos se sobrepõem tanto, uma string Base64URL e uma string Base64 padrão podem parecer quase idênticas, e um valor sem +, / ou = é válido em ambos. A incompatibilidade só aparece quando os bytes brutos produzem um -/_ ou um +//, ponto em que a decodificação com o alfabeto errado falha ou gera lixo. Quando um token não decodifica, o alfabeto é a primeira coisa a verificar.
A ferramenta Base64 codifica e decodifica tanto o alfabeto padrão quanto o seguro para URLs, lida com preenchimento ausente e mostra os bytes brutos, tudo no seu navegador. Nada do que você cola é enviado a lugar nenhum.