> 1) Где лучше хранить сами материалы? FTP-сервер, файловый хостинг?
На любом сервере с nginx с широким каналом. Ограничений типа качать только в 1 поток или ограничений на скорость скачивания ставить не надо — у вас же магазин, а не бесплатный рапидшеар. Думайте не как сделать проще вам, а как удобнее клиенту.
> 2) Каким образом формировать уникальную для каждого покупателя, но постоянную относительно ресурса ссылку?
Добавлять что-нибудь вроде key/session_id в ссылку, а в нгинксе использовать вызов внешнего скрипта для проверки ключа и учета. Например,
storage.example.org/key-123456789/История римского права в 3 томах, т.1, Иванов А.А.pdf
Key может быть привязан к логину, первым 3 цифрам IP и времени.
Если key неправильный — не выводить непонятных ошибок HTTP 403, а возвращать в личный кабинет на страницу ошибки и выводить телефон, на который можно позвонить в случае проблем со скачиванием.
У файла должно быть нормальное человекочитаемое имя, а не хеш md5.
> 3) Какие использовать защитные механизмы для предотвращения расшаривания этой ссылки? Срок жизни, привязка к IP, SMS-подтверждения?
См. ответ 2
> 4) Как обезопасить продаваемые материалы в хранилище? Использовать права доступа?
См. ответ 2