Codificación Base64 segura para URLs: qué es y por qué importa
¿Qué es la codificación Base64 segura para URLs?
La codificación Base64 segura para URLs (también llamada Base64url) es una variante del Base64 estándar que reemplaza los caracteres que tienen significados especiales en URLs y nombres de archivo con alternativas seguras. El Base64 estándar utiliza + y / como parte de su alfabeto de 64 caracteres, además de = para el relleno, y los tres son problemáticos en URLs, cadenas de consulta y rutas de archivo.
Base64url resuelve esto con dos sustituciones simples:
| Base64 estándar | Base64 seguro para URLs |
|-----------------|-----------------|
| + (más) | - (menos) |
| / (barra) | _ (guion bajo) |
| = (relleno) | omitido (normalmente) |
Por qué el Base64 estándar rompe las URLs
Cuando una cadena codificada en Base64 que contiene + o / aparece en una URL, el comportamiento del navegador y del servidor se vuelve impredecible.
El problema del +
En las cadenas de consulta de URLs, el carácter + se interpreta como un espacio. Este comportamiento proviene de la especificación application/x-www-form-urlencoded y hace que los datos decodificados contengan espacios inesperados.
Por ejemplo, una cadena Base64 como Pj4+Pz8/Pw== contiene caracteres +. Si esto aparece en un parámetro de URL ?token=Pj4+Pz8/Pw==, el servidor verá ?token=Pj4 Pz8/Pw== — el + se convierte en un espacio.
El problema del /
En las rutas de URL, el carácter / es un separador de ruta. Una cadena Base64 como ab/CD+Ef== contiene un / que se interpretará como un nivel de directorio. Si esto aparece en un segmento de URL, tanto el cliente como el servidor pueden malinterpretar la estructura.
El problema del =
El carácter = se utiliza para pares clave-valor en cadenas de consulta. Un = final en ?data=SGVsbG8= podría ser ambiguo — ¿el = es parte del relleno de Base64 o de la sintaxis del parámetro de consulta?
Si bien la codificación de porcentaje puede solucionar estos problemas (+ se convierte en %2B, / se convierte en %2F), infla la longitud de la cadena y hace que la depuración sea más difícil. Base64url es una solución más limpia.
Cómo funciona Base64url
Base64url está definido formalmente en RFC 4648 Sección 5. Utiliza exactamente el mismo algoritmo que el Base64 estándar — 3 bytes se convierten en 4 caracteres — pero con la sustitución de un carácter en las posiciones 62 y 63 del alfabeto:
- Índice 62 del alfabeto:
+→-(menos) - Índice 63 del alfabeto:
/→_(guion bajo)
El relleno (=) normalmente se elimina, ya que puede inferirse de la longitud de la cadena al decodificar. Una cadena Base64url es siempre un componente de URL válido sin escape adicional.
Antes y después
Así es como se ven los mismos datos binarios en ambos formatos:
Standard: Pj4+Pz8/Pw==
URL-safe: Pj4-Pz8_Pw
Dónde se utiliza Base64url
JSON Web Tokens (JWT)
JWT es el usuario más destacado de Base64url. Cada JWT consta de tres partes — cabecera, carga útil y firma — cada una codificada en Base64 segura para URLs y separadas por puntos:
eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxMjM0NTY3ODkwIn0.dozjgNqP0m2iTgCjD0
Observa los guiones y guiones bajos — sin signos más ni barras. Si JWT utilizara Base64 estándar, los tokens se romperían al pasarse como parámetros de URL, que es la forma más común en que se usan en aplicaciones web.
OAuth y OpenID Connect
Tanto OAuth 2.0 como OpenID Connect dependen de JWT para tokens de acceso y tokens de identidad, lo que hace que la codificación Base64url sea fundamental para la autenticación moderna. El flujo de código de autorización, el flujo implícito y el flujo de credenciales de cliente transmiten tokens que utilizan Base64url.
APIs web y parámetros de consulta
Muchas APIs REST y GraphQL aceptan datos codificados en Base64 en parámetros de consulta para cursores de paginación, filtros o cargas útiles codificadas. Base64url garantiza que estos parámetros funcionen correctamente sin codificación de URL adicional.
Ejemplo del mundo real — paginación por cursor en APIs:
GET /api/users?cursor=MjAyNC0wMS0xNVQxMDozMDowMFo
La API de GitHub utiliza este patrón exacto para paginar grandes conjuntos de resultados.
Nombres de archivo y almacenamiento de archivos
Las cadenas Base64url son nombres de archivo seguros porque no contienen separadores de ruta (/), ni caracteres especiales que confundan a los sistemas de archivos, ni caracteres inválidos en Windows (:, *, ?, etc.).
Redes de distribución de contenido y claves de caché
Los CDN y las capas de caché a menudo utilizan valores codificados en Base64url como claves de caché. El Base64 estándar con / crearía jerarquías de directorio falsas en el espacio de nombres de la caché, lo que llevaría a claves ambiguas.
Conversión entre Base64 estándar y Base64url
Convertir entre las dos variantes es sencillo en cualquier lenguaje:
JavaScript
// Standard Base64 to URL-safe Base64
function base64ToBase64url(base64) {
return base64.replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, '');
}
// URL-safe Base64 to Standard Base64
function base64urlToBase64(base64url) {
let result = base64url.replace(/-/g, '+').replace(/_/g, '/');
// Restore padding
while (result.length % 4) {
result += '=';
}
return result;
}
Node.js
Node.js proporciona soporte nativo de Base64url desde la versión 15.7.0:
// Encode to Base64url
const encodedUrl = Buffer.from('Hello, world!').toString('base64url');
console.log(encodedUrl);
// Output: SGVsbG8sIHdvcmxkIQ
// Decode from Base64url
const decoded = Buffer.from(encodedUrl, 'base64url').toString('utf-8');
console.log(decoded);
// Output: Hello, world!
Python
import base64
# Encode to Base64url
encoded = base64.urlsafe_b64encode(b"Hello, world!")
print(encoded.decode())
# Output: SGVsbG8sIHdvcmxkIQ==
# Decode from Base64url
decoded = base64.urlsafe_b64decode(encoded)
print(decoded.decode())
# Output: Hello, world!
Cuándo usar Base64 estándar vs Base64url
Usa Base64 estándar cuando:
- Codifiques archivos adjuntos de correo electrónico (el estándar MIME lo requiere)
- Generes data URLs para incrustar en HTML/CSS
- Almacenes datos en bases de datos donde la seguridad para URLs sea irrelevante
- Interactúes con sistemas heredados que esperan Base64 estándar
Usa Base64url cuando:
- Crees o analices tokens JWT
- Pases datos codificados en parámetros de consulta de URL o segmentos de ruta
- Generes nombres de archivo a partir de datos binarios
- Crees claves de caché o identificadores
- Trabajes con tokens OAuth u OpenID Connect
Prueba la codificación Base64 segura para URLs en línea
Usa nuestro codificador y decodificador Base64 gratuito en línea para convertir entre formatos Base64 estándar y Base64 seguro para URLs. Pega tus datos, elige tu variante y obtén el resultado al instante.