El primer paso para proteger los archivos es no colocarlos en el Storage en la carpeta public.
Cuando los subas, debes subirlo a un disco que no sea "public". Puede ser "local" o cualquier otro que tú hayas creado. Como no está en la carpeta public, en principio el archivo no podría ser accedido por cualquier persona directamente con una URL.
El segundo paso es crear una ruta de tu aplicación que se use para descargar ese archivo. A esa ruta puedes mandarle un identificador, un slug o algo que permita identificar qué archivo se desea descargar.
Dentro del controlador y/o el método que hayas asociado con esa ruta tendrás que hacer el tratamiento, con la lógica necesaria para saber si el archivo está o no permitido para descarga por parte del usuario.
Si no está permitido, puedes redirigir, por ejemplo, al usuario. O mostrar una vista de error. Todo eso depende de ti o de tu aplicación. Si el archivo se puede descargar, con la lógica que dependerá de tu aplicación, entonces procedes a enviar el archivo a tu usuario.
Para enviar el archivo en sí puedes usar el método de download() del facade Storage de Laravel. Que sería algo como esto.
Storage::disk('local')->download($fileName);
Consulta la documentación para ver otros parámetros que soporta el método download().
Esto permite hacer la descarga del archivo que sea necesario acceder y el navegador hace la descarga directa del archivo. Es decir, en lugar de mostrar una salida, el navegador simplemente procede con la descarga del fichero que hata en el parámetro primero (en mi caso $fileName, que lógicamente es una variable que tendrá la ruta de ese fichero que se desea descargar dentro del disco "local").
Espero que este resumen te ayude a completar tu tarea.