A melhor maneira de fazer isso é na sua página que o código gere um URL pré-assinado do S3 que tenha um tempo de vida curto. Se, por exemplo, o objeto for sempre baixado em < 60 segundos, você poderá gerar um URL assinado válido por 60 segundos. O usuário não pode reutilizar esse mesmo URL após 60 segundos. Eles não poderiam mais incorporar esse objeto em sua página, pois cada solicitação é válida apenas por 60 segundos.
Você pode ler mais sobre URLs assinados aqui: link