Как именно устроены session и cookies?
========================================

Насколько я знаю, cookies хранятся на клиенте (браузере), а session на сервере.  
  

Возникают следующие вопросы:  
1. Как происходит синхронизация cookies при обращении к ним с сервера (какие http headers для этого используются или это отдельный запрос, или при изменении их на клиенте браузер отправляет какой-то запрос на сервер)?
2. Где именно хранятся данные session и как сервер понимает как сопоставить конкретные данные session конкретному http запросу?
3. Правда ли что session - это всего лишь зашифрованные cookies на клиенте?
4. Если cookies на стороне клиента отключены - как в таком случае реализовывается авторизация пользователя и управление session?

 

 1. Нет никакой синхронизации. Сервер может только указать клиенту, что ему нужно установить куку X в значение Y хэдером Set-Cookie и считать с пришедшего на сервер запроса куки (все куки отправляются в каждом запросе на сервер).  

2. Сессии могут храниться на клиенте (signed cookie session). При этом используется подпись куки с помощью [HMAC](https://ru.wikipedia.org/wiki/HMAC), чтобы данные сессии не могли быть свободно изменены клиентом. Но обычно сессии хранятся на сервере. Тут выбор огромный: от баз данных и key-value хранилищ (Redis, например) до простых файлов. При этом, клиенту посылается кука ID сессии (так сервер идентифицирует юзера), которую злоумышленник может стащить. Таким кукам, дабы защитить юзеров от XSS, ставится флаг HttpOnly, который советует браузеру не давать эту куку скриптам вроде JS. В этом случае, стащить куку получится только завладев браузером, файловой системой юзера или через багу браузера.  

3. Смотри второй ответ. В некоторых случаях - да. Но редко.  

4. Можно передавать значение session id в строке URL (GET - параметром), вроде такого: [example.com/some/page/?session\_id=2af26905dcf31a1d...](http://example.com/some/page/?session_id=2af26905dcf31a1dfb1bf857106323fe) Некоторые сервисы используют это, как fallback вариант, однако, он **очень** небезопасен, т.к. любой XSS или простой безобидный JS вроде Яндекс.Метрика видит весь URL. Так что, посылаем юзера включать куки. 

 1. Кукисы пересылаются вместе с каждым запросом через заголовок Cookie. При изменении их на клиенте до ближайшего запроса ничего не будет.  

2. Или в зашифрованной куке, или в файле на сервере, или в базе данных, или где еще. Если не первый вариант, то используется кука с id сессии.  

3. Когда как, см. п. 2 

 Cookies - файл на клиенте хранящий какие-то данные в виде ключ-знавение и передающиеся в заголовке https запроса  

На клиенте хранится идентификатор сессии по которому на сервере получаются данные о клиенте