При любом запросе проверяем, что у клиента установлена Cookie csrf. Если не установлена - генерируем случайную и отправляем ему в ответе. Вообще этот токен сохраняем в запросе каким-то образом, чтобы он был доступен на время генерации HTML ответа.
При генерации HTML формы ставим hidden параметр с этим значением. JS может из cookie вытащить этот токен для AJAX запросов.
При любом не-GET запросе проверяем, что у нас есть CSRF токен в параметрах запроса и что он соответствует куке перед обработкой запроса.
Основная выгода - чтобы не хранить на сервере ничего, ассоциированного с клиентом. А то логин-форму сейчас модно размешать прямо на главной странице, а если защищать традиционным способом с хранением csrf в серверной сессии - придётся каждому анониму генерировать сессию, жалко оперативной памяти на это.
Вроде никаких явных проблем не вижу, но хочу перестраховаться. Или может есть другие способы.