Клиент что-то просит. Сервер что-то отвечает.
Чтобы оно было идемпотентным, вы должны ожидать того же ответа, если попросите то же самое. Только сервер может решить, что находится в ответе, так что это должно быть реализовано сервером.
Чтобы это было безопасно, запрос не должен изменять сервер. Только сервер может решить что-то изменить или нет на основании запроса.
Кэширование происходит на клиенте (он решает, должен ли он сделать запрос или нет, основываясь на том, какие данные у него уже есть). Только клиент может принять это решение. (Конечно, сервер отвечает за предоставление клиенту информации, необходимой ему для принятия этого решения).