Зачем запоминать мой токен?

Почему при реализации функции «запомнить меня» для веб-сайта мы все усложняем и имеем токен, называемый токеном «запомнить меня», помимо токена сеанса.

Насколько я понимаю, токен «запомнить меня» можно использовать для входа в систему и создания нового токена сеанса, в то время как токен сеанса длится всего несколько минут или до того момента, когда пользователь закроет браузер. Почему мы не можем увеличить срок действия самого токена сеанса до желаемого времени, до которого мы хотим, чтобы пользователь вошел в систему?

Мне нужно реализовать такую ​​​​функциональность в приложении на основе flex, работающем над tomcat, и мне интересно, нужно ли мне запоминать токены

Кроме того, возможно ли получить эту функциональность из коробки в tomcat?


person Ashish    schedule 15.03.2011    source источник


Ответы (5)


1) Сеансы обычно содержат целую кучу данных, кроме имени пользователя. Поэтому, если вы просто установите дату истечения срока действия на несколько недель или месяцев, как токен «запомнить меня», вы, вероятно, столкнетесь с проблемами производительности на сервере из-за тысяч или миллионов тяжеловесных объектов сеанса.

2) Помните, что токены находятся на стороне клиента, а не на стороне сервера. Это возлагает все требования к хранилищу на браузер пользователя, что является лучшим решением для простых данных, таких как имена для входа. Если вы полагались на идентификатор сеанса, связанный с объектами в памяти на сервере, то каждый раз, когда вы перезапускаете сервер или серверный процесс (например, для развертывания обновленного приложения), все эти объекты сеанса будут потеряны.

person Jesse Barnum    schedule 18.03.2011
comment
Можно ли незаметно интегрировать Spring Security в ваше гибкое приложение, не затрагивая клиентский код? - person Ashish; 19.03.2011
comment
Я понятия не имею, как интегрировать мое гибкое приложение в безопасность Spring, чтобы использовать его функцию «Запомнить меня», возможно ли это сделать. - person Ashish; 20.03.2011
comment
Я не знаю, я не использую Spring или Flex. - person Jesse Barnum; 20.03.2011

Потому что по определению сеанс заканчивается, как только пользователь закрывает свой браузер. Таким образом, срок действия файла cookie сеанса истекает, как только браузер закрывается.

Поскольку функция «запомнить меня» предназначена для того, чтобы пользователь оставался в системе между сеансами, информация, хранящаяся в файле cookie «запомнить меня», должна сохраняться при перезапусках браузера.

Чтобы получить эту функциональность «из коробки», посмотрите на использование фреймворка например, Spring Security.

person matt b    schedule 15.03.2011
comment
если мы добавим пункт expires в файл cookie сеанса, то его можно будет продлить на любое количество дней, какой в ​​этом вред? Есть ли какая-то конкретная причина для написания сложного механизма с двумя разными токенами? - person Ashish; 15.03.2011

Файлы cookie «запомнить меня» обычно хранят имя пользователя и какой-либо токен. Оба они используются для аутентификации пользователя. Взгляните на Рекомендации по улучшению файлов cookie для постоянного входа, где этот процесс довольно хорошо описан.

Файл cookie сеанса используется для хранения идентификатора сеанса на клиенте, что позволяет серверу распознавать сеанс и загружать данные сеанса, связанные с сеансом.

Таким образом, cookie-файлы типа «запомнить меня» имеют более длительный срок службы (обычно дни или недели), чем сеансовые cookie-файлы. Срок действия сеансовых файлов cookie обычно истекает через несколько минут или при закрытии браузера.

На мой взгляд, есть несколько причин, по которым используются два разных файла cookie:

  • Если бы использовался только постоянный файл cookie «запомнить меня», серверу нужно было бы аутентифицировать пользователя при каждом запросе. Когда используется дополнительный файл cookie сеанса, серверу не нужно этого делать, пока сеанс действителен. Конечно, идентификатор сеанса можно хранить в файле cookie «запомнить меня», но какой в ​​этом смысл?
  • С точки зрения кодирования лучше повторно использовать существующий механизм сеанса. Зачем изобретать велосипед вместо того, чтобы просто добавить функцию (аутентификация с помощью cookie-файла «запомнить меня»), которую можно легко включить/отключить?
person Gerhard Schlager    schedule 18.03.2011
comment
но я не понимаю, почему нельзя продлить срок действия файла cookie сеанса, когда нам требуются более длительные сеансы. Я попытался добавить фильтр сервлета, который добавляет предложение об истечении срока действия в файл cookie сеанса и, таким образом, увеличивает срок его действия. Я не увидел вреда в использовании такого вполне удобного для меня подхода вместо построения совершенно нового механизма введения cookie-файла Remember me в свое приложение. Если я добавлю файл cookie «запомнить меня», мне нужно будет внести ряд изменений в свое приложение. - person Ashish; 18.03.2011
comment
Итак, я предполагаю, что вы не используете Spring Security или даже комбинацию BlazeDS, Spring Security и Spring BlazeDS Integration на своем сервере, не так ли? Они могут обеспечить функцию «запомнить меня» из коробки. Если вы действительно измените дату истечения срока действия файла cookie сеанса, не забудьте также настроить время ожидания сеанса на сервере. В противном случае сервер может слишком рано аннулировать сеанс. - person Gerhard Schlager; 18.03.2011
comment
Я только на этапе оценки, у меня есть приложение blazed, в котором я пытаюсь реализовать аутентификацию. Добавление срока действия к файлу cookie сеанса оказалось простым вариантом, тогда как я не уверен, что Spring Security может легко работать с приложением blazed, включая его функцию «запомнить меня». - person Ashish; 18.03.2011
comment
Взгляните на интеграцию Spring BlazeDS. В последней версии добавлена ​​поддержка функции «запомнить меня» от Spring Security. Таким образом, он позволяет вам использовать Spring Security и BlazeDS, а с небольшой настройкой Spring все должно работать из коробки. - person Gerhard Schlager; 21.03.2011

Люди правильно сказали, что сессия содержит ряд тяжелых объектов. При достаточном количестве пользователей в вашей системе, если вы попытаетесь удержать их всех в ограниченном объеме памяти, который есть у сервера, в конечном итоге вы сломаете сервер, когда эта память иссякнет.

Однажды я работал над проектом, в котором обновление производственного кода имело утечку памяти. Это был проект J2EE (да, J2EE, а не Java EE). Когда пользователь вошел в систему, чтобы проверить свой счет в этой телефонной компании, сеанс пользователя не был должным образом освобожден из памяти (я не могу вспомнить причину, но это определенно было проблемой). Эта ошибка имитирует то, что вы спрашиваете о том, чтобы делать это намеренно.

Сервер продолжал падать. Поэтому ставим на него профайлер. Мы наблюдали, как использование памяти увеличивалось в течение дня, пока оно не достигало максимума, и вскоре после сбоя сервера приложений. Мы добавили памяти и увеличили параметр памяти ВМ. Я сказал им, что это была утечка памяти, но, поскольку я не был «экспертом по серверам» за 200 долларов в час, люди не хотели в это верить, потому что люди, которые там были, все еще верили, что сборщик мусора был всемогущим, а не просто очень хорошим.

Двумя днями позже (это затронуло систему «просмотр счета», а не основную бизнес-систему, т. е. у нее не было такой же рабочей нагрузки или требований к памяти, хотя на серверах было много аппаратной памяти), они наняли пару $200,00 в час консультанты, которые через день сказали им, что в приложении есть вышеупомянутая утечка памяти. Это было исправлено, и все было хорошо... за вычетом гонораров консультантов.

В любом случае, вот вывод из этого: если вы не завершаете пользовательские сеансы, когда пользователи выходят из системы или закрывают свой браузер (время сеанса истекает), вы подвергаетесь реальному риску исчерпания вашей памяти и сбоя ваших серверов. Особенно, если ваш сайт или приложение имеет значительное количество пользователей. Как упоминалось другими, лучше всего использовать облегченные токены/куки.

person Bill Rosmus    schedule 17.06.2012

Причина, по которой мы должны использовать другой файл cookie, отличный от файла cookie sessionId, для запоминания пользователя, заключается не в том, что сеансы должны истекать быстро или вы столкнетесь с проблемами производительности на сервере.

Jetty (и, возможно, многие другие контейнеры сервлетов) имеет функцию, которая позволяет автоматически вытеснять простаивающие сеансы из памяти на диск или в базу данных, что, ИМХО, исключает все приведенные выше обоснования проблем с производительностью, связанных с хранением тяжеловесных сеансов в памяти.

Причина, по которой используется другой файл cookie, заключается в том, что функция «запомнить меня» предназначена для запоминания пользователя даже после истечения срока действия сеанса. Таким образом, если срок действия сеанса пользователя истек, другой файл cookie используется для аутентификации пользователя без необходимости вводить пароль, что, очевидно, снижает вероятность фишинговых атак. Хотя у него есть и недостатки, например, если кто-то получит доступ к вашему ноутбуку и украдет ваши токены аутентификации, он сможет выдать себя за вас, если только сервер не применит еще больше мер безопасности, чтобы привязать токен только к вашему клиенту и местоположению.

Короче говоря, функция «запомнить меня» — это механизм аутентификации, а не замена сессионных файлов cookie.

Я считаю, что хорошо иметь долгосрочные даты истечения сеанса, если они хранятся вне памяти. И как только они истечет, просто запросите пароль. Многие веб-сайты предлагают эту функцию как «Запомнить меня на 30 дней», что достигается только с помощью долгосрочного файла cookie sessionId, ничего больше.

person Hooman Valibeigi    schedule 06.12.2016