Такая функция «запомнить меня» всегда является дополнительной угрозой безопасности.
Потому что, как и в сеансе, у вас есть только один идентификатор, который достаточен не только для идентификации пользователя ( Кто это?), но также для аутентификации этого пользователя ( Это действительно он / она? ) без выполнения реальной аутентификации.
Но в отличие от сеанса, который имеет (или должен иметь)просто короткое время жизни (в основном менее часа) и идентификатор (или должен быть) периодически изменяется (по времени и по необходимости из-за изменений состояния аутентичности / авторитета), идентификатор «запомнить меня» действителен в течение нескольких дней, если нетдаже на месяцы или годы!И этот длительный период действия представляет дополнительную угрозу безопасности.
Поэтому, прежде чем спрашивать, как реализовать такую функцию «запомнить меня», вы должны спросить себя, действительно ли вы хотите эту дополнительную угрозу безопасности.Это в основном зависит от активов, которые имеет ваше приложение, и от того, для какой цели предназначена аутентификация, и если вы хотите рискнуть олицетворением / кражей личных данных, которые создает функция «запомнить меня».
Если это так, обязательнообеспечьте базовую безопасность с помощью HTTPS и установите в своих файлах cookie флаг HTTPOnly и флаг secure .Затем вы можете сделать следующее, чтобы создать такую функцию «запомнить меня»:
Запрос аутентификации
Если пользователь прошел аутентификацию через HTTPS и установил «запомнить»я », сгенерируйте случайный запомнить меня токен, сохраните его на стороне сервера в базе данных« запомнить меня »и установите запомнить меня cookie с безопасным флаг с этим значением.Затем начните новый сеанс и установите флаг Запомнить меня .
Любой другой запрос
- Если естьэто не текущий сеанс, перенаправьте на страницу Запомнить меня через HTTPS, которая проверяет, есть ли файл cookie Запомнить меня .Если есть токен Запомнить меня , и он действителен, аннулируйте его, сгенерируйте новый, сохраните его в базе данных «запомнить меня», установите cookie с этим новым токеном и создайте новый сеанс с запомни меня флаг установлен.В противном случае перенаправьте на страницу входа в систему.
- Если текущий сеанс недействителен (обязательно используйте строгое аннулирование сеанса ), перенаправьте на страницу Запомнить меня через HTTPSесли установлен флаг Запомнить меня ;в противном случае перенаправьте на страницу входа в систему.
При этом аутентификация обеспечивается через HTTPS, как первоначальная аутентификация, так и аутентификация «Запомнить меня».И пользователь аутентичен только во время текущего сеанса;по истечении этого срока пользователь должен повторно пройти аутентификацию либо с помощью токена Запомнить меня , либо предоставив свои учетные данные для входа.И так как запомнить меня токены хранятся в базе данных, пользователь может аннулировать любой существующий запомнить меня токен.