Что такое куки и для чего они нужны
Что проверяют
Знаете ли вы, что куки это часть протокола HTTP, а не файлы на диске, и как их правильно выставлять на бэкенде. С Go-разработчика спросят про атрибуты безопасности и про то, что попадает в куку, а что остаётся на сервере.
Как отвечать
Кука это пара имени и значения: сервер отдаёт её заголовком Set-Cookie, браузер хранит и на подходящие запросы возвращает заголовком Cookie. Обратно уходят только имя и значение, атрибуты живут на стороне браузера и в запросе не появляются.
Нужны они там, где протокол без состояния, а состояние требуется: идентификатор сессии, токен защиты от подделки запросов, язык интерфейса, согласие на аналитику. Объём мал, порядка нескольких килобайт, поэтому в куку кладут ключ к данным, а не сами данные.
http.SetCookie(w, &http.Cookie{
Name: "session",
Value: id,
Path: "/",
HttpOnly: true,
Secure: true,
SameSite: http.SameSiteLaxMode,
MaxAge: int((24 * time.Hour).Seconds()),
})Дальше про атрибуты: HttpOnly закрывает куку от JavaScript и снижает ущерб от XSS, Secure запрещает отдавать её по открытому каналу, SameSite отсекает отправку с чужих сайтов и сегодня это основная защита от CSRF, Domain расширяет область на поддомены, Path сужает по пути. Если значение содержательное, его подписывают, иначе клиент перепишет его как угодно.
Где спотыкаются
Описывают куки как текстовые файлы, которые сервер записывает на диск пользователя. Хранилище целиком на совести браузера, а для разработчика это два заголовка и набор правил отправки.
Считают, что HttpOnly защищает от подделки запроса. Он мешает краже через скрипт, но браузер и так сам приложит куку к запросу, начатому с чужой страницы: от этого спасают SameSite и отдельный токен, который приходит не куками.
Кладут в куку признак роли или флаг оплаты и доверяют ему на сервере. Значение полностью под контролем клиента: либо подпись и проверка, либо в куке только идентификатор, а права читаются из хранилища.