Принцип сеансов состоит в том, чтобы сохранять данные на стороне сервера, к которым может получить доступ только пользователь, имеющий соответствующий идентификатор сеанса.
Существует два вида данных: частные или общедоступные в отношениях с клиентом.,Конечно, сессия закрыта для публичного доступа.
Обычно мы храним идентификатор пользователя и некоторые случайные данные (у меня нет конкретного примера).
Я думаю о том, чтобы не использовать сессии ввсе.Вместо этого используется функция, которая проверяет достоверность данных, отправленных пользователем.Сервер будет иметь закрытый ключ, который будет использоваться для хеширования пользовательских данных.
Например, если у пользователя есть id = 9999, мы обычно храним его в файле, связанном с идентификатором сеанса.Каждый раз, когда клиент делает запрос, мы проверяем его идентификатор сеанса и извлекаем данные из файла сеанса, связанного с ним.
Я думаю о сохранении данных сеанса на стороне клиента, и каждый раз, когда клиент делает это запросотправляет хэш этих данных и данных.
Если пользователь входит в систему, он отправляет свои учетные данные, а сервер возвращает свой идентификатор метку времени и хэш, рассчитанный на основе идентификатора пользователя и личного ключа.Для любого будущего запроса сервер использует ту же функцию, и если результирующий хеш-код совпадает, то сеанс действителен, а данные проверены ранее.
Является ли это допустимым способом замены сеансов?Какие недостатки существуют, кроме того, что они не сохраняют данные сеанса на сервере?
Я был обеспокоен скоростью и сделал небольшой тест ...
<?php
$session = array(
'userId' => 999,
'timestamp' => time()
);
$privateKey = 'da39a3ee5e6b4b0d3255bfef95601890afd80709';
$startTime = microtime(true);
for ($i = 0; $i < 1000000; $i++){
$hash = hash_hmac('sha1', json_encode($session), $privateKey);
}
echo 'Script took ' . (microtime(true) - $startTime) . ' seconds';
... который печатает
Script took 5.246542930603 seconds
Я запустил это на ноутбуке (Intel Duo).На мой взгляд, это доступное время (0,000005247 за хэш).Тест верен?
РЕДАКТИРОВАТЬ: метка времени хешируется вместе с идентификатором пользователя для обеспечения истечения сеанса.Таким образом, на стороне сервера, даже если сеанс действителен, но он слишком старый, его можно считать истекшим.
То есть, если мы хэшируем данные вместе с меткой времени с использованием закрытого ключа, это можно использовать в производстве