Volver al blog

URLs firmadas de S3: qué son, cómo funcionan y cuándo usarlas (2026)

Si alguna vez has necesitado dar acceso a un archivo de un bucket privado de S3 sin cambiar permisos ni hacer nada público, las URLs prefirmadas (presigned URLs) son la respuesta. Son una de las funcionalidades más útiles y menos conocidas de Amazon S3, y funcionan también en proveedores compatibles como Cloudflare R2, DigitalOcean Spaces y Wasabi.

En esta guía te explico qué son las URLs prefirmadas, cómo funcionan a nivel técnico, cómo generarlas para descargas y subidas, y cuáles son sus limitaciones de seguridad. También veremos cómo Nubbo las usa internamente para transferir archivos directamente entre tu navegador y tu proveedor de almacenamiento sin tocar los datos en ningún momento.

Qué es una URL prefirmada

Una URL prefirmada es una URL temporal que da acceso a un objeto específico dentro de un bucket privado de S3. La URL contiene una firma criptográfica generada a partir de tus credenciales de AWS, la clave del objeto y una marca de tiempo de expiración. Cualquier persona que tenga la URL puede realizar la acción para la que fue firmada (descarga o subida) hasta que la URL expire. Después, devuelve un error.

Lo importante es que el bucket sigue siendo privado. No cambias ningún permiso. Estás creando un pase temporal para un objeto concreto y una acción concreta.

Las URLs prefirmadas se generan completamente en el lado del cliente (o en tu backend) usando tus credenciales. No se hace ninguna llamada a la API de S3 para crear la URL. S3 solo valida la firma cuando alguien realmente la usa.

Cómo funcionan a nivel técnico

Cuando generas una URL prefirmada, los siguientes componentes se incluyen en la query string:

  • X-Amz-Algorithm — El algoritmo de firma (normalmente AWS4-HMAC-SHA256).
  • X-Amz-Credential — Tu access key ID, la fecha, la región y el servicio.
  • X-Amz-Date — La marca de tiempo de creación de la URL.
  • X-Amz-Expires — Cuántos segundos es válida la URL.
  • X-Amz-SignedHeaders — Los headers incluidos en el cálculo de la firma.
  • X-Amz-Signature — La firma HMAC-SHA256 calculada a partir de todos los parámetros anteriores más la clave del objeto y el método HTTP.

Cuando alguien abre la URL, S3 reconstruye la firma usando los mismos parámetros y la clave secreta asociada al access key ID. Si las firmas coinciden y la URL no ha expirado, S3 responde con el contenido. Si se ha modificado cualquier cosa — la clave del objeto, la expiración, cualquier parámetro — la verificación falla y la petición se rechaza.

Es el mismo mecanismo de Signature Version 4 que asegura todas las llamadas autenticadas a la API de AWS, solo que codificado en una URL en lugar de en un header de la petición.

URLs prefirmadas para descargas (GET)

El caso de uso más habitual es generar una URL prefirmada para que alguien descargue un archivo de un bucket privado. La URL se firma para el método HTTP GET, así que solo se puede usar para leer el objeto.

Con la CLI de AWS:

aws s3 presign s3://mi-bucket/informes/trimestral-2026.pdf --expires-in 3600

Esto devuelve una URL válida durante una hora. Puedes enviársela a cualquier persona y podrá descargar el archivo abriéndola en un navegador o usando curl. No necesita credenciales de AWS.

Con el SDK de Python (boto3):

import boto3

s3 = boto3.client('s3')
url = s3.generate_presigned_url(
    'get_object',
    Params={'Bucket': 'mi-bucket', 'Key': 'informes/trimestral-2026.pdf'},
    ExpiresIn=3600
)
print(url)

Ambos métodos producen el mismo resultado: una URL larga con parámetros de query que contienen la firma y la expiración.

URLs prefirmadas para subidas (PUT)

Las URLs prefirmadas también funcionan en la dirección contraria. Puedes generar una URL que permita a alguien subir un archivo a una clave específica de tu bucket, sin darle ninguna credencial.

Esto es útil cuando quieres que usuarios externos envíen archivos (entregas de clientes, contenido generado por usuarios o formularios con adjuntos) sin exponer tu bucket ni pasar el archivo por tu servidor.

Ejemplo con boto3:

import boto3

s3 = boto3.client('s3')
url = s3.generate_presigned_url(
    'put_object',
    Params={
        'Bucket': 'mi-bucket',
        'Key': 'subidas/brief-cliente.pdf',
        'ContentType': 'application/pdf'
    },
    ExpiresIn=3600
)
print(url)

El destinatario puede subir el archivo con una petición PUT:

curl -X PUT -H "Content-Type: application/pdf" \
  --upload-file brief-cliente.pdf \
  "URL_PREFIRMADA_AQUI"

El archivo va directamente a S3. Tu servidor nunca toca los bytes.

Subidas multipart con URLs prefirmadas

Para archivos grandes (típicamente de más de 100 MB), S3 soporta subidas multipart. En lugar de enviar el archivo completo en una sola petición, lo divides en partes y subes cada una por separado. Esto mejora la fiabilidad (si falla una parte se puede reintentar sin empezar de cero) y permite subidas en paralelo para mejor rendimiento.

Se pueden generar URLs prefirmadas para cada parte individual de una subida multipart. El flujo es el siguiente:

  1. Iniciar la subida multipart a través de la API de S3 para obtener un upload ID.
  2. Generar una URL prefirmada para cada parte usando el upload ID y el número de parte.
  3. Subir cada parte usando las URLs prefirmadas.
  4. Completar la subida multipart enviando la lista de partes y sus ETags.

Es más complejo que un simple PUT, pero es la única forma fiable de subir archivos muy grandes. La mayoría de herramientas y SDKs manejan esto automáticamente.

Consideraciones de seguridad

Las URLs prefirmadas son muy útiles, pero tienen limitaciones que conviene conocer:

  • Expiración máxima. Con credenciales de un usuario IAM, la expiración máxima es de 7 días (604.800 segundos). Con credenciales temporales de STS (como las de un rol asumido), el límite es menor: normalmente 12 horas o la duración restante del token de sesión, lo que sea menor.

  • Las URLs se pueden compartir o filtrar. Una URL prefirmada es un bearer token. Cualquiera que la tenga puede usarla. Si el destinatario reenvía la URL o aparece en el historial del navegador, logs de un servidor o un archivo de chat, el archivo queda accesible para quien la encuentre.

  • Sin protección por contraseña. Las URLs prefirmadas de S3 no tienen ningún mecanismo nativo para requerir contraseña. Si necesitas compartir con contraseña, tienes que construir esa capa tú mismo o usar una herramienta que lo haga.

  • Sin seguimiento de descargas. Los logs de acceso de S3 registran las peticiones, pero no hay forma integrada de ver quién descargó un archivo, cuántas veces se descargó ni si la URL se compartió con destinatarios no previstos.

  • Sin revocación. Una vez generada, una URL prefirmada no se puede revocar individualmente. Las únicas formas de invalidarla antes de que expire son eliminar el objeto, cambiar la política del bucket para denegar acceso o desactivar las credenciales IAM usadas para firmarla. Son medidas drásticas.

  • La URL expone metadatos. La URL contiene el nombre de tu bucket, la ruta completa del objeto y tu access key ID. Aunque el access key ID por sí solo no es un riesgo de seguridad, el nombre del bucket y la ruta del objeto pueden revelar información sobre tu infraestructura o la organización de tus archivos.

Cómo usa Nubbo las URLs prefirmadas

Nubbo es un explorador de archivos y herramienta de compartición web que se conecta a tu almacenamiento compatible con S3. Internamente, cada transferencia de archivos en Nubbo — tanto subidas como descargas — funciona con URLs prefirmadas.

Cuando subes un archivo a través de la interfaz de Nubbo, el backend genera una URL prefirmada de tipo PUT (o un conjunto de URLs prefirmadas para cada parte de una subida multipart si el archivo es grande). Tu navegador envía el archivo directamente a tu proveedor de almacenamiento usando esa URL. Los servidores de Nubbo nunca reciben ni almacenan los datos del archivo.

Las descargas funcionan igual. Cuando descargas un archivo o cuando alguien accede a un enlace compartido, el backend de Nubbo genera una URL prefirmada GET y el navegador obtiene el archivo directamente del proveedor.

Esta arquitectura significa que Nubbo actúa como una capa de orquestación, no como un proxy. Tus archivos viajan por el camino más corto entre el navegador y el proveedor de almacenamiento. Esto funciona de forma idéntica con AWS S3, Cloudflare R2, DigitalOcean Spaces y Wasabi.

Tus credenciales de almacenamiento se cifran con AES-256-GCM y solo se usan en el servidor para generar las URLs prefirmadas. Nunca se exponen al navegador. Puedes leer más sobre el modelo de seguridad en la página de seguridad.

Protección adicional sobre las URLs prefirmadas

Las URLs prefirmadas resuelven el problema de acceso pero dejan huecos en el control: sin contraseñas, sin límites de descarga, sin seguimiento. La funcionalidad de compartición de archivos de Nubbo cubre esos huecos.

Cuando compartes un archivo a través de Nubbo, puedes configurar una contraseña, una fecha de expiración y un número máximo de descargas. El destinatario ve una página de descarga limpia en lugar de una URL que expone el nombre de tu bucket y la clave del objeto.

Modal de compartir archivos en Nubbo con opciones de contraseña, expiración y límite de descargas Entre bastidores, Nubbo solo genera la URL prefirmada después de verificar la contraseña y comprobar el límite de descargas. Si el límite se ha alcanzado o el enlace ha expirado, no se genera ninguna URL prefirmada y el archivo no se puede descargar.

Esto te da lo mejor de ambos mundos: la transferencia directa navegador-a-proveedor de las URLs prefirmadas con los controles de acceso de una plataforma de compartición gestionada.

Si te interesa el flujo de compartición en más detalle, lo explicamos en un artículo anterior: Cómo compartir archivos de S3 sin hacerlos públicos.

Primeros pasos

Las URLs prefirmadas son una de las herramientas más prácticas del ecosistema S3. Ya sea que las generes desde la CLI para compartir un archivo puntual o uses una herramienta que las aplique de forma transparente en cada operación, te permiten mantener tus buckets privados y dar acceso a archivos solo cuando es necesario.

Si quieres una interfaz visual que gestione URLs prefirmadas, subidas multipart, compartición con contraseña y seguimiento de descargas automáticamente, crea tu cuenta gratuita de Nubbo y conecta tu primer bucket en menos de dos minutos. Tus archivos se quedan en tu almacenamiento, transferidos directamente entre el navegador y tu proveedor, sin que ningún dato pase por servidores de terceros.