Objetivos de aprendizaje
Después de leer este artículo podrás:
- Decidir qué archivos deben ser públicos y cuáles privados
- Comprobar con curl que un archivo está realmente protegido
- Elegir entre URL firmada y enlace para compartir al abrir un archivo privado
En esta página
- ¿Cuál es la diferencia entre un archivo público y uno privado?
- ¿Qué archivos deben ser públicos y cuáles privados?
- ¿Cómo compruebo que un archivo está realmente protegido?
- ¿Cómo comparto un archivo privado con alguien?
- ¿Compartir un archivo público lo protege?
- ¿Qué errores evitar?
- Cómo hacerlo en Square Cloud
- Preguntas frecuentes
Cada archivo que guardas en un object storage lleva una decisión implícita: quién puede abrirlo. Logotipos, imágenes de producto y el JavaScript de tu sitio deben verlos todos. Contratos, facturas y fotos de documentos, no.
El error caro es dejar público lo que debería ser privado. El archivo se filtra sin ningún mensaje de error, porque servir archivos públicos es justo para lo que se configuró el storage. Por eso conviene decidir la visibilidad antes de subirlo y comprobarla después con una prueba sencilla.
¿Cuál es la diferencia entre un archivo público y uno privado?#
Público: cualquiera con la URL descarga el archivo, sin login, sin firma y sin caducidad. La URL es permanente y puede pasar por la caché de una CDN, lo que hace la entrega rápida y barata.
Privado: una petición sin autorización recibe un error (normalmente 403). El acceso exige una credencial del dueño o un enlace generado por él, con plazo y, a veces, posibilidad de cancelarlo.
La visibilidad no es una propiedad "natural" del archivo: es una configuración del bucket, de la carpeta o del objeto, y puedes cambiarla. Lo que no cambia es lo que ya salió: una URL pública que alguien copió sigue funcionando mientras el archivo siga público.
¿Qué archivos deben ser públicos y cuáles privados?#
Una regla simple: si el contenido puede aparecer en una página abierta sin login, puede ser público. Si aparece solo tras autenticarse, es privado.
| Tipo de archivo | Visibilidad | Motivo |
|---|---|---|
| Imágenes del sitio, CSS, JS, fuentes | Público | Todos las ven, la caché de CDN ayuda |
| Avatares e imágenes de producto | Público | Ya aparecen en páginas abiertas |
| Facturas, contratos, documentos fiscales | Privado | Datos de una sola persona |
| Fotos de documentos, exámenes | Privado | Datos personales sensibles |
| Exportaciones e informes | Privado | Contienen datos internos |
| Contenido solo para suscriptores | Privado | El acceso es parte del producto |
Si dudas, empieza en privado. Abrir después es un cambio de una línea; cerrar después no recupera lo que ya se copió.
¿Cómo compruebo que un archivo está realmente protegido?#
Pide la URL directa sin credenciales, como lo haría un desconocido. Usa una terminal o una ventana de incógnito:
curl -I "https://mi-bucket.s3.amazonaws.com/facturas/2026-10.pdf"Un archivo privado responde algo como:
HTTP/1.1 403 ForbiddenUn archivo público responde HTTP/1.1 200 OK. Si tu archivo "privado" devuelve 200, no es privado, por imposible de adivinar que parezca la URL. Repite la prueba tras cualquier cambio de políticas o permisos.
En Amazon S3 (consulta qué es el almacenamiento compatible con S3), la documentación oficial indica que los buckets, puntos de acceso y objetos nuevos no permiten acceso público por defecto. Block Public Access tiene cuatro ajustes (BlockPublicAcls, IgnorePublicAcls, BlockPublicPolicy y RestrictPublicBuckets) que prevalecen sobre políticas y ACL, y AWS recomienda activar los cuatro. Otros storages tienen controles parecidos con otros nombres: busca el equivalente en la documentación de tu proveedor.
¿Cómo comparto un archivo privado con alguien?#
Hay dos mecanismos comunes. La elección depende de cuánto tiempo debe durar el enlace y de si podrías necesitar cancelarlo antes de tiempo.
URL firmada (enlace temporal). Tu backend firma una URL con un plazo corto. Quien la abre descarga el archivo, sin cuenta ni credenciales. No se puede cancelar un enlace concreto antes de que caduque. Detalles en qué es una URL firmada.
Enlace para compartir. Un enlace de mayor duración, registrado en el storage, que el dueño puede revocar. Sirve para el archivo que difundes durante días y que quizá quieras retirar.
Un ejemplo en Python con boto3 (pip install boto3), con las credenciales en variables de entorno:
import os
import boto3
from botocore.config import Config
s3 = boto3.client(
"s3",
region_name="us-east-1",
endpoint_url=os.environ.get("S3_ENDPOINT"), # omítelo en AWS S3
aws_access_key_id=os.environ["S3_ACCESS_KEY"],
aws_secret_access_key=os.environ["S3_SECRET_KEY"],
config=Config(signature_version="s3v4"),
)
url = s3.generate_presigned_url(
ClientMethod="get_object",
Params={"Bucket": "mi-bucket", "Key": "facturas/2026-10.pdf"},
ExpiresIn=600, # 10 minutos
)
print(url)Ejecuta curl -o factura.pdf "<url>" (con comillas) y el archivo se descarga. La misma URL sin los parámetros de firma sigue devolviendo 403. En Amazon S3 el plazo máximo es de 12 horas desde la consola y de 7 días con un SDK o la CLI con credenciales de usuario IAM; con credenciales temporales, la URL muere junto con ellas.
¿Compartir un archivo público lo protege?#
No, y es el error más común. Crear un enlace para compartir de un archivo que ya es público no restringe nada: la URL pública sigue abierta para quien la tenga. Ponerle contraseña al enlace tampoco ayuda, porque el camino directo nunca la pide.
Para que el enlace para compartir (o su contraseña, cuando el storage la ofrece) tenga algún efecto, el archivo debe estar privado. Solo entonces el enlace autorizado es el único camino. El orden correcto es cerrar el archivo primero y solo después generar el enlace.
¿Qué errores evitar?#
- Confiar en una URL larga y aleatoria. Se filtra por logs, historial y mensajes reenviados. El control de acceso es una verificación, no un secreto en la URL.
- Guardar la URL firmada en la base de datos. Caduca. Genera una nueva en cada petición de un usuario autenticado.
- Mezclar público y privado en la misma carpeta. Sepáralos por carpeta o bucket y aplica reglas distintas a cada uno. Un archivo privado en la carpeta pública es la filtración clásica.
- Olvidar la caché. Un archivo público puede seguir en la caché de una CDN después de cerrarlo. Tras cambiar la visibilidad, prueba otra vez y, si hace falta, purga la caché.
- Dar más acceso del necesario. Un enlace debe alcanzar un solo archivo, durante el tiempo que dure la tarea.
Cómo hacerlo en Square Cloud#
En el Blob Storage de Square Cloud, la decisión de la tabla anterior se convierte en el bucket donde escribes: cada cuenta tiene los buckets fijos public, servido desde una CDN global en el edge, y private. Los logotipos y las imágenes de producto van al primero; las facturas, los contratos y las exportaciones, al segundo. La visibilidad también se puede definir por carpeta, junto con caducidad, caché, tamaño máximo y extensiones permitidas, lo que ayuda a evitar la fuga clásica del archivo privado olvidado en la carpeta pública.
Un archivo privado se abre de tres formas, con las diferencias que ya viste: la URL prefirmada SigV4 que genera tu código, de hasta 7 días; el enlace temporal del panel, de hasta 24 horas y no revocable; y el enlace para compartir, de hasta 30 días y revocable, con contraseña y metadatos en los planes Pro y Enterprise. Como el enlace y la contraseña solo protegen archivos privados, escribe primero en private y genera el enlace después.
El código boto3 de arriba funciona con el Blob usando S3_ENDPOINT=https://s3-blob.squarecloud.app, la región auto en lugar de us-east-1, el bucket private en lugar de mi-bucket y las claves S3 de la pestaña "Acceso S3" del panel, derivadas de una API key. Después de la primera subida, repite la prueba de este artículo: con la firma el archivo se descarga, sin ella no debe abrir. No hay tarifa de salida ni de entrada, y la cuota incluida va de 5 GB a 250 GB según el plan. Conoce el Blob Storage y compara las cuotas en Precios.
Blob Storage
Object storage compatible con S3, sin tarifas de salida
Preguntas frecuentes
¿Compartir un archivo público lo protege?
No. El enlace para compartir es solo un camino más de acceso. La URL pública del archivo sigue funcionando para cualquiera que la tenga. Para controlar el acceso, el archivo debe estar privado.
¿Basta una URL difícil de adivinar para proteger un archivo?
No. La seguridad por oscuridad falla cuando la URL se filtra en un log, un historial del navegador o un mensaje reenviado. Quien tiene la URL de un archivo público accede sin ninguna verificación.
¿Cómo sé si un archivo es público?
Pide la URL directa sin credenciales, por ejemplo con curl -I. Un 200 significa que cualquiera puede abrirlo. Un archivo privado responde 403 (o 401, según el storage).
¿Los buckets nuevos de S3 son privados por defecto?
Sí. Según la documentación de AWS, los buckets, puntos de acceso y objetos nuevos no permiten acceso público por defecto, y Block Public Access evita que políticas o ACL lo abran por error.
Más en Storage
Ver los 15 artículos- Qué es una URL prefirmada (presigned URL)Una URL prefirmada (presigned URL) es un enlace temporal a un archivo privado que funciona sin login. Mira cómo funciona, sus límites y cuándo usarla.
- Qué es el almacenamiento de objetosEl almacenamiento de objetos guarda archivos como objetos con clave y metadatos, accesibles por una API HTTP. Mira cómo funciona, para qué sirve y sus límites.
- Qué es S3 y qué significa 'compatible con S3'S3 es el almacenamiento de objetos de Amazon y su API se volvió el estándar del sector. Aprende qué significa ser compatible con S3 y cómo conectarte.
- Subir archivos grandes: carga multiparte y reanudableLa carga multiparte divide un archivo grande en partes que se envían en paralelo y se reintentan por separado. Mira el paso a paso en Python y cómo reanudar.