Archivos públicos o privados: cómo controlar quién accede

Un archivo público abre para cualquiera que tenga la URL. Uno privado solo abre mediante un enlace autorizado, como una URL firmada o un enlace para compartir revocable.

Actualizado el 6 min de lectura

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

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.

¿El archivo es el mismopara todos?sínoPúblicocualquiera conla URL lo baja;caché en CDNPrivadosin autorizaciónresponde 403PuntualURL prefirmada,caduca solaRevocableenlace paracompartir
¿Igual para todos? Público, con CDN. Si no, privado, abierto con una URL prefirmada o un enlace revocable.

¿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:

bash
curl -I "https://mi-bucket.s3.amazonaws.com/facturas/2026-10.pdf"

Un archivo privado responde algo como:

HTTP/1.1 403 Forbidden

Un 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:

python
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

Más información

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.

Siguiente artículoTarifas de salida (egress): el costo oculto del almacenamientoLa tarifa de salida (egress) es lo que se cobra por cada GB que sale de tu storage hacia internet. Mira cómo funciona la cuenta, ejemplos y cómo evitar sorpresas.

Más en Storage

Ver los 15 artículos