Ну, любые данные, которые вы отправляете клиенту, могут быть изменены (это может быть не тривиально, но, тем не менее, существует возможность).
Есть много вариантов; Строки запросов, скрытые поля, куки, чтобы назвать несколько. Каждый из них страдает от этого самого недостатка - возможности того, что злоумышленник может изменить данные в этих объектах.
Лучше всего использовать надежное шифрование. Будь то данные в скрытом поле или файл cookie, их можно легко зашифровать. Затем, когда запрос получен, его можно сравнить со значением, существовавшим до более раннего ответа, и его можно расшифровать с разумной уверенностью в том, что данные не были подделаны. Для хорошего примера вам следует изучить, как работает ASP.NET Viewstate .
Итак, чтобы ответить на ваш вопрос, вы не должны полагаться ни на один из методов сохранения состояния без дополнительной реализации безопасности. Как говорится, Безопасность через неизвестность вовсе не является безопасностью.