На самом деле вменяемого готового решения этой проблемы нет.
Нужно ловить пользователей по уникальным кукам, писать сколько они скачали (+range) в базу, складывать rang-ы и проверять, что там хватает rang-ей на целый файл (пользователь мог скачать половину файла или скачать файл в 10 потоков/попыток).