Можно ли хранить пароль в cookie и почему
Что проверяют
Понимаете ли вы модель угроз, а не только слово «небезопасно», и умеете ли превратить это знание в проверки. Для тестировщика вопрос двойной: почему так нельзя и как вы поймаете такое в чужом продукте за десять минут.
Как отвечать
Нет. Пароль не хранится ни в cookie, ни в локальном хранилище, ни в скрытом поле формы, ни в логах. В cookie кладут идентификатор сессии или токен, который сервер умеет отозвать.
Причины стоит назвать по пунктам, а не одной фразой. Cookie лежит на диске пользователя в открытом виде и читается любым, у кого есть доступ к машине. Она уезжает на сервер с каждым запросом к домену, то есть попадает в журналы прокси и веб-сервера. Без флага HttpOnly её заберёт любой скрипт на странице, включая стороннюю аналитику. И главное: сессию можно отозвать, а пароль нет, к тому же пользователи повторяют его на других сайтах, поэтому утечка бьёт дальше вашего продукта.
Кодирование в Base64 или «шифрование» на клиенте ничего не меняет: ключ лежит рядом.
Дальше проверки, ради которых вопрос и задают тестировщику. После входа заглянуть в хранилище браузера и поискать не только сам пароль, но и его закодированные варианты. Посмотреть флаги HttpOnly, Secure, SameSite и срок жизни сессионной cookie. Убедиться, что выход завершает сессию на сервере, а не просто стирает cookie: подставьте сохранённое значение обратно и повторите запрос. Проверить, что смена пароля рвёт остальные сессии, что данные входа не уходят в адресной строке и что «запомнить меня» сделан отдельным токеном с ограниченным сроком.
Где спотыкаются
Останавливаются на «это небезопасно». Без механизма ответ звучит заученным, и следующий вопрос, чем плох пароль в локальном хранилище, ставит в тупик.
Считают флаг HttpOnly индульгенцией. Он закрывает только доступ из JavaScript и ничего не делает с перехватом по незащищённому соединению, с доступом к файлам профиля и с журналами на сервере.
Ищут точное совпадение строки. Пароль в хранилище редко лежит как есть: он бывает закодирован или урезан, и поиск по значению ничего не находит. Проверять надо производные, а заодно смотреть, что уходит в теле запросов и что пишется в консоль.