На мой взгляд надо заставить веб-клиента делать какую-то работу, например, ставить куку и смотреть, что он ее предъявил, с помощью javascript на стороне клиента проводить простые вычисления, но не предсказуемые вычисления, которые он должен предъявить.
Брутфорс наверняка идет в отношении конкретного аккаунта, можно на каждую неудачную попытку увеличивать время ответа, чтобы разительно снижать темп перебора.
Можно начать показывать CAPTCHA в случае детектирования таких проблем.
Можно сделать блокировку учетной записи в случае N неудачных попыток за период времени.
Возьмите за образец логику PIN кодов банковский карт - 3 неудачных попытки - блокировка карты. Поэтому даже весьма простой 4-х численный PIN код становится не подбираемым брутфорсом.
Существуют различные практики приблизительной деанонимизации веб-клиента, которые позволят установить, что с разных адресов идет один и тот же веб-клиент.