Сначала я нашёл простое описание в одной статейке.
При загрузке страницы содержащей форму с токеном сервер также задаёт клиенту куки содержащий этот токен.
При post запросе же на форму, клиент отсылает токен в теле запроса и указывает эту куки с токеном. И мол, сервер сравнивает при получении post запроса полученную куку и токен из формы, а защищает нас то что кука принадлежит домену и с других доменов она недоступна.
Так было написано в той статье.
Только вот, а что мешает создать xmlhttprequest, создать рандомный токен прописать его как куки для xhr, ну и в тело положить разумеется.
Сервер же не хранит какие токены он там создавал, только сравнивает токен из куки и из тела запроса, а значит можно же любой рандом использовать?
На самом деле конечно я уже проверил что там токен и кука по разному шифруются, но ведь можно разобрать алгоритм как они шифруются чтобы сгенерировать пару токен и куки такую, что сервер их провалидирует.
UPD: "а что мешает создать xmlhttprequest, создать рандомный токен прописать его как куки для xhr, ну и в тело положить разумеется."
Мешает то, что браузер не даст задавать куки через setRequestHeader() у кросс-доменного запроса.