# Сессии, Куки, Формы и Шаблонизация Сегодняшнее занятие будет посвящено взаимодействию с пользователем и браузером пользователя. Будут рассмотрены механизмы персонализации сгенерированных PHP страниц, прием данных от пользователя, верстка и шаблонизация. ## Сессии и Куки ### HTTP **HTTP** - протокол, изначально предназначенный для работы в режиме запрос -> ответ, после чего соединение закрывается (вспомним о том, что изначально HTTP - просто средство выдачи страниц для чтения, не более того). **Например** Запрос: ``` GET / HTTP/1.1 Host: example.com Accept: text/html <пустая строка> ``` Ответ: ``` HTTP/1.1 200 OK Content-Length: 1983 Content-Type: text/html; charset=utf-8 ... ... ``` Таким образом, запрос и ответ состоят из стартовой строки(*GET*), заголовков (*Content-Length*), и собственно контента, ради которого весь этот обмен данных был сделан (html-файл). По окончанию обмена данными соединение разрывается, и следующее обращение к серверу происходит с **чистого листа**. ### Сессия и Cookie Под сессией подразумевается определенный контекст, в котором происходит обмен данными между клиентом (браузером) и сервером. В этом контексте хранится определенная информация, касающаяся только конкретного клиента (например залогиненного пользователя). Как это работает: - При создании сессии (например, при удачном логине) сервер создает уникальный ключ. Ключ должен быть достаточно большим, что бы его было **крайне** маловероятно подобрать. ``` POST /login/ HTTP/1.1 Host: example.com Accept: text/html login=user&password=eightasterisks ``` - Ключ отсылается в браузер в заголовке вместе с ответом. Браузер запоминает его на определенное время для определенного URL ``` HTTP/1.1 200 OK Content-Type: text/html; charset=utf-8 Set-Cookie: key=LongAndWeirdRandomSecureCharset ... ... ``` Обратите внимание на заголовок **Set-Cookie**. Именно он в себе хранит уникальный ключ, который будет запомнен браузером - Браузер при каждом запросе к серверу отсылает ему этот ключ, подтверждая таким образом, что данное соединение - от конкретного пользователя. ``` GET / HTTP/1.1 Host: example.com Accept: text/html Cookie: key=LongAndWeirdRandomSecureCharset ```