Можно ли изменять куки
Что проверяют
Понимаете ли вы, кто и как управляет куками: сервер, скрипт на странице и сам пользователь. Следом обычно спрашивают, почему JavaScript не видит сессионную куку и можно ли доверять значению, которое пришло в куке.
Как отвечать
Да, изменить можно, но с разных сторон по-разному:
- сервер: заголовком
Set-Cookieс тем же именем. Только так выставляетсяHttpOnly; - скрипт: присваиванием
document.cookie = "theme=dark; Path=/; Max-Age=31536000". Одно присваивание меняет одну куку, остальные не затираются. Удаление: та же кука сMax-Age=0; - Cookie Store API: асинхронные
cookieStore.set()иcookieStore.get()плюс событиеchange. Поддержку в целевых браузерах проверьте отдельно; - пользователь: через DevTools или расширение меняет любые куки, включая
HttpOnly.
Главная деталь про изменение: кука определяется тройкой имя, Domain, Path. Если исходная выставлена с Path=/app, запись с Path=/ создаст вторую куку с тем же именем, а не заменит первую. Удаление без точного совпадения этих атрибутов тоже молча не сработает.
Дальше атрибуты: Secure, SameSite (в Chrome без явного значения работает как Lax, а None требует Secure), префикс __Host- запрещает Domain и требует Path=/ и Secure. Ограничения: около 4 КБ на куку, и каждая уходит с каждым запросом на свой домен, поэтому объёмные данные держат в localStorage или на сервере.
Где спотыкаются
Пишут HttpOnly в document.cookie. Браузер такую куку не установит вовсе: флаг доступен только из заголовка ответа сервера.
Доверяют содержимому куки на сервере. Раз пользователь её свободно меняет, в ней хранят идентификатор сессии или подписанное значение, а не role=admin.
Забывают про Safari: куки, выставленные скриптом, живут там не дольше семи дней, поэтому «запомнить на год» через document.cookie в нём не работает.