Модуль Apache mod_session
| Описание: | Поддержка сессий |
|---|---|
| Статус: | Расширение |
| Идентификатор модуля: | session_module |
| Файл исходного кода: | mod_session.c |
| Совместимость: | Доступен в Apache 2.3 и более поздних версиях |
Краткое описание
Предупреждение
Модули сессий используют HTTP-куки, и, следовательно, могут стать жертвами атак типа Cross-Site Scripting или раскрыть потенциально конфиденциальную информацию клиентам. Пожалуйста, убедитесь, что соответствующие риски учтены перед включением функциональности сессий на вашем сервере.
Этот модуль предоставляет поддержку интерфейса сессий на уровне всего сервера для каждого пользователя. Сессии могут использоваться для отслеживания входа пользователя в систему или для другой информации, относящейся к пользователю, которая должна быть доступна во всех запросах.
Сессии могут храниться на сервере или в браузере. Сессии также могут быть необязательно зашифрованы для повышения безопасности. Эти функции разделены на несколько модулей помимо mod_session; mod_session_crypto, mod_session_cookie и mod_session_dbd. В зависимости от требований сервера загружайте соответствующие модули на сервер (статически во время компиляции или динамически через директиву LoadModule).
Сессии могут быть обработаны другими модулями, зависящими от сессии, или сессия может быть прочитана и записана с использованием переменных окружения и HTTP-заголовков, по мере необходимости.
Что такое сессия?
В основе интерфейса сессий лежит таблица пар «ключ-значение», которые доступны в запросах браузера. Эти пары могут быть установлены на любую допустимую строку, в соответствии с потребностями приложения, использующего сессию.
«Сессия» — это строка application/x-www-form-urlencoded, содержащая эти пары «ключ-значение», как определено в спецификации HTML.
Сессия необязательно может быть зашифрована и закодирована в base64 перед записью в механизм хранения, как определено администратором.
Кто может использовать сессию?
Интерфейс сессии в первую очередь разработан для использования другими модулями сервера, такими как mod_auth_form, однако приложения на основе CGI могут получить доступ к содержимому сессии через переменную окружения HTTP_SESSION. Сессии могут быть изменены и/или обновлены путем вставки в HTTP-ответ заголовка с новыми параметрами сессии.
Хранение сессий на сервере
Apache может быть настроен на отслеживание сессий каждого пользователя, хранящихся на конкретном сервере или группе серверов. Эта функциональность похожа на сессии в типичных приложениях-серверах.
При настройке сессии отслеживаются с помощью идентификатора сессии, хранящегося в куки или извлечённого из параметров, вставленных в строку запроса URL, как в типичном запросе GET.
Поскольку содержимое сессии хранится исключительно на сервере, ожидается конфиденциальность содержимого сессии. Это влечёт за собой последствия для производительности и ресурсов в случае большого количества сессий или в случае, когда большое количество веб-серверов должны совместно использовать сессии друг с другом.
Модуль mod_session_dbd позволяет хранить сессии пользователей в базе данных SQL через mod_dbd.
Хранение сессий в браузере
В средах с высокой нагрузкой, где отслеживание сессий на сервере слишком ресурсоёмко или неудобно, существует возможность хранить содержимое сессии в куки на клиентском браузере вместо этого.
Это имеет преимущество, что для отслеживания сессий требуется минимальное количество ресурсов на сервере, и несколько серверов в ферме серверов не нуждаются в совместном использовании информации о сессиях.
Однако содержимое сессии открыто для клиента, что влечёт за собой соответствующий риск нарушения конфиденциальности. Модуль mod_session_crypto может быть настроен на шифрование содержимого сессии перед записью сессии клиенту.
Модуль mod_session_cookie позволяет хранить сессии пользователей в браузере в HTTP-куках.
Основные примеры
Создание сессии так же просто, как включение сессии и выбор места хранения сессии. В данном примере сессия будет храниться в браузере в куки под названием session.
Сессия на базе браузера
Session On SessionCookieName session path=/
Сессия бесполезна, если ею нельзя воспользоваться для записи или чтения. Следующий пример показывает, как можно ввести значения в сессию с помощью заранее определенного HTTP-заголовка ответа под названием X-Replace-Session.
Запись в сессию
Session On SessionCookieName session path=/ SessionHeader X-Replace-Session
Заголовок должен содержать пары «имя-значение», выраженные в том же формате, что и строка запроса в URL, как в примере ниже. Установка ключа в пустую строку эквивалентна удалению этого ключа из сессии.
CGI для записи в сессию
#!/bin/bash echo "Content-Type: text/plain" echo "X-Replace-Session: key1=foo&key2=&key3=bar" echo env
При необходимости сессия может быть считана из переменной окружения HTTP_SESSION. По умолчанию сессия конфиденциальна, поэтому это нужно явно включить с помощью директивы SessionEnv.
Чтение из сессии
Session On SessionEnv On SessionCookieName session path=/ SessionHeader X-Replace-Session
После чтения переменная CGI HTTP_SESSION должна содержать значение key1=foo&key3=bar.
Конфиденциальность сессии
Используя функцию «Показать куки» в браузере, вы увидели бы текстовое представление сессии. Это может стать проблемой, если пользователю нужно скрыть содержимое сессии или если у третьих лиц будет несанкционированный доступ к данным в сессии.
Содержимое сессии необязательно можно зашифровать перед размещением в браузере с помощью модуля mod_session_crypto.
Зашифрованная сессия на базе браузера
Session On SessionCryptoPassphrase secret SessionCookieName session path=/
Сессия автоматически расшифруется при загрузке и шифруется при сохранении Apache, приложению, использующему сессию, не нужно знать, что происходит шифрование.
Сессии, хранящиеся на сервере, а не в браузере, также могут быть зашифрованы по мере необходимости, обеспечивая конфиденциальность, когда потенциально конфиденциальная информация обменивается между веб-серверами в ферме серверов с использованием модуля mod_session_dbd.
Конфиденциальность куки
Механизм HTTP-куки также предлагает функции конфиденциальности, такие как возможность ограничить передачу куки только защищенными SSL страницами или предотвратить доступ браузерного JavaScript к содержимому куки.
Предупреждение
Некоторые из функций конфиденциальности HTTP-куки являются либо нестандартными, либо не реализованы последовательно в различных браузерах. Модули сессий позволяют устанавливать параметры куки, но не гарантируют, что конфиденциальность будет соблюдена браузером. Если безопасность является проблемой, используйте mod_session_crypto для шифрования содержимого сессии или храните сессию на сервере с помощью модуля mod_session_dbd.
Стандартные параметры куки можно указать после имени куки, как в примере ниже.
Установка параметров куки
Session On SessionCryptoPassphrase secret SessionCookieName session path=/private;domain=example.com;httponly;secure;
В случаях, когда веб-сервер Apache выступает в качестве фронтэнда для серверов-источников бэкэнда, можно удалить куки сессии из входящих HTTP-заголовков с помощью директивы SessionCookieRemove. Это предотвращает доступ к содержимому куки сессии на сервере бэкэнда.
Поддержка сессий для аутентификации
Как и во многих приложениях-серверах, модули аутентификации могут использовать сессию для хранения имени пользователя и пароля после входа в систему. Модуль mod_auth_form сохраняет имя пользователя и пароль пользователя в сессии.
Аутентификация по форме
Session On SessionCryptoPassphrase secret SessionCookieName session path=/ AuthFormProvider file AuthUserFile "conf/passwd" AuthType form AuthName "realm" #...
См. модуль mod_auth_form для документации и полных примеров.
Интеграция сессий с внешними приложениями
Чтобы сессии были полезны, необходимо возможность обмена содержимым сессии с внешними приложениями и возможность внешнему приложению записывать собственную сессию.
Типичным примером может быть приложение, которое изменяет пароль пользователя, установленный mod_auth_form. Это приложение должно прочитать текущее имя пользователя и пароль из сессии, внести необходимые изменения в пароль пользователя и записать новый пароль в сессию, чтобы обеспечить плавный переход к новому паролю.
Второй пример может включать приложение, которое регистрирует нового пользователя впервые. После завершения регистрации имя пользователя и пароль записываются в сессию, обеспечивая плавный переход к входу в систему.
- Модули Apache
- Модули на сервере, которым требуется доступ к сессии, могут использовать API mod_session.h для чтения и записи в сессию. Этот механизм используется модулями, такими как
mod_auth_form. - CGI-программы и языки сценариев
- Приложения, выполняемые в веб-сервере, могут получить значение сессии из переменной окружения HTTP_SESSION. Сессия должна быть закодирована как строка application/x-www-form-urlencoded, как описано в спецификации HTML. Переменная окружения контролируется настройкой директивы
SessionEnv. Сценарий может записать сессию, вернув ответный заголовок application/x-www-form-urlencoded с именем, заданным директивойSessionHeader. В обоих случаях все шифрование или дешифрование и чтение/запись сессии в выбранный механизм хранения обрабатываются модулямиmod_sessionи соответствующей конфигурацией. - Приложения за
mod_proxy - Если используется директива
SessionHeaderдля определения заголовка HTTP-запроса, сессия, закодированная как строка application/x-www-form-urlencoded, будет доступна приложению. Если тот же заголовок предоставляется в ответе, значение этого заголовка ответа будет использоваться для замены сессии. Как и выше, все шифрование или дешифрование и чтение/запись сессии в выбранный механизм хранения обрабатываются модулямиmod_sessionи соответствующей конфигурацией. - Автономные приложения
- Приложения могут выбрать обработку сессии вне контроля веб-сервера Apache. В этом случае приложение отвечает за чтение сессии из выбранного механизма хранения, дешифрование сессии, обновление сессии, шифрование сессии и запись сессии в выбранный механизм хранения, по мере необходимости.
Директива Session
| Описание: | Включает сеанс для текущей директории или расположения |
|---|---|
| Синтаксис: | Session On|Off |
| Значение по умолчанию: | Session Off |
| Контекст: | настройка сервера, виртуальный хост, директория, .htaccess |
| Переопределение: | AuthConfig |
| Статус: | Расширение |
| Модуль: | mod_session |
Директива Session включает сеанс для контейнера директории или расположения. Дополнительные директивы управляют тем, где будет храниться сеанс и как поддерживается конфиденциальность.
Директива SessionEnv
| Описание: | Управление тем, записываются ли содержимое сеанса в переменную окружения HTTP_SESSION |
|---|---|
| Синтаксис: | SessionEnv On|Off |
| Значение по умолчанию: | SessionEnv Off |
| Контекст: | настройка сервера, виртуальный хост, директория, .htaccess |
| Переопределение: | AuthConfig |
| Статус: | Расширение |
| Модуль: | mod_session |
Если установлено значение On, директива SessionEnv заставляет содержимое сеанса записываться в переменную окружения CGI под названием HTTP_SESSION.
Строка записывается в формате запроса URL, например:
key1=foo&key3=barДиректива SessionExclude
| Описание: | Определение префиксов URL, для которых сеанс игнорируется |
|---|---|
| Синтаксис: | SessionExclude path |
| Значение по умолчанию: | none |
| Контекст: | настройка сервера, виртуальный хост, директория, .htaccess |
| Статус: | Расширение |
| Модуль: | mod_session |
Директива SessionExclude позволяет отключить сеансы, относящиеся только к префиксам URL. Это может быть использовано для повышения эффективности сайта, нацелившись на более точный URL-пространство, для которого должен поддерживаться сеанс. По умолчанию все URL в директории или расположении включаются в сеанс. Директива SessionExclude имеет приоритет над директивой SessionInclude.
Предупреждение
Эта директива имеет сходное назначение с атрибутом path в HTTP-куках, но не следует путать их. Данная директива не устанавливает атрибут path, который необходимо настроить отдельно.
Директива SessionExpiryUpdateInterval
| Описание: | Определение количества секунд, в течение которых срок действия сеанса может измениться без обновления сеанса |
|---|---|
| Синтаксис: | SessionExpiryUpdateInterval interval |
| Значение по умолчанию: | SessionExpiryUpdateInterval 0 (always update) |
| Контекст: | настройка сервера, виртуальный хост, директория, .htaccess |
| Статус: | Расширение |
| Модуль: | mod_session |
| Совместимость: | Доступно в Apache 2.4.41 и более поздних версиях |
Директива SessionExpiryUpdateInterval позволяет сеансам избежать затрат, связанных с записью сеанса в каждом запросе, когда изменилось только время истечения срока действия. Это может быть использовано для повышения эффективности сайта или уменьшения нагрузки на базу данных при использовании mod_session_dbd. Сеанс всегда записывается, если данные, хранящиеся в сеансе, изменились или срок действия изменился более чем на заданный интервал.
Установка интервала в ноль отключает эту директиву, и срок действия сеанса обновляется для каждого запроса.
Эта директива действует только в сочетании с SessionMaxAge для включения срока действия сеанса. Сеансы без срока действия записываются только при изменении данных, хранящихся в сеансе.
Предупреждение
Поскольку срок действия сеанса может не обновляться с каждым запросом, сеансы могут истечь до interval секунд раньше. Использование небольшого интервала обычно обеспечивает достаточную экономию, при этом минимально влияя на решение о времени истечения срока действия.
Директива SessionHeader
| Описание: | Импорт обновлений сеанса из заданного HTTP-заголовка ответа |
|---|---|
| Синтаксис: | SessionHeader header |
| Значение по умолчанию: | none |
| Контекст: | настройка сервера, виртуальный хост, директория, .htaccess |
| Переопределение: | AuthConfig |
| Статус: | Расширение |
| Модуль: | mod_session |
Директива SessionHeader определяет имя HTTP-заголовка ответа, который, если присутствует, будет обработан и записан в текущий сеанс.
Значение заголовка должно быть в формате запроса URL, например:
key1=foo&key2=&key3=barГде ключ установлен в пустую строку, этот ключ будет удален из сеанса.
Директива SessionInclude
| Описание: | Определение префиксов URL, для которых сеанс действителен |
|---|---|
| Синтаксис: | SessionInclude path |
| Значение по умолчанию: | all URLs |
| Контекст: | настройка сервера, виртуальный хост, директория, .htaccess |
| Переопределение: | AuthConfig |
| Статус: | Расширение |
| Модуль: | mod_session |
Директива SessionInclude позволяет сделать сеансы действительными только для определенных префиксов URL. Это может быть использовано для повышения эффективности сайта, нацелившись на более точное URL-пространство, для которого должен поддерживаться сеанс. По умолчанию все URL в директории или расположении включаются в сеанс.
Предупреждение
Эта директива имеет сходное назначение с атрибутом path в HTTP-куках, но не следует путать их. Данная директива не устанавливает атрибут path, который необходимо настроить отдельно.
Директива SessionMaxAge
| Описание: | Определение максимального срока действия сеанса в секундах |
|---|---|
| Синтаксис: | SessionMaxAge maxage |
| Значение по умолчанию: | SessionMaxAge 0 |
| Контекст: | настройка сервера, виртуальный хост, директория, .htaccess |
| Переопределение: | AuthConfig |
| Статус: | Расширение |
| Модуль: | mod_session |
Директива SessionMaxAge определяет временной лимит, в течение которого сеанс будет оставаться действительным. При сохранении сеанса этот лимит сбрасывается, и можно продолжить существующий сеанс. Если сеанс станет старше этого лимита без запроса к серверу для обновления сеанса, сеанс истечёт и будет удалён. В случае использования сеанса для хранения данных входа в систему пользователя, это приводит к автоматическому выходу пользователя после заданного времени.
Установка maxage в ноль отключает срок действия сеанса.
© 2018 The Apache Software Foundation
Licensed under the Apache License, Version 2.0.
https://httpd.apache.org/docs/2.4/en/mod/mod_session.html