Про печеньки
Давайте поговорим об http-куках. Если вы думаете, что это такие пары «ключ-значение», которые сервер и клиент гоняют туда-сюда в каждом запросе, то это верно лишь отчасти.
За годы развития веба куки обзавелись дополнительной атрибутикой. Вот как выглядит структура Cookie в Go 1.23:
— Name и Value — ключ и значение.
— Quoted — true, если значение передано в кавычках.
— Path — разрешает куку на страницах, которые начинаются с указанного пути.
— Domain — разрешает куку на указанном домене и всех его поддоменах.
— Expires — дата окончания годности куки.
— MaxAge — срок жизни куки в секундах.
— Secure — разрешает куку только по HTTPS.
— HttpOnly — закрывает доступ к куке из JavaScript.
— SameSite — разрешает или запрещает куку при кросс-доменных запросах.
— Partitioned — ограничивает доступ к third-party кукам.
Неслабо, да?
Начиная с версии Go 1.23, серверную куку можно распарсить из строки с помощью http.ParseSetCookie:
line := "session_id=abc123; SameSite=None; Secure; Partitioned; Path=/; Domain=example.com"
cookie, err := http.ParseSetCookie(line)
Браузерные куки тоже можно распарсить из строки, с помощью http.ParseCookie:
line := "session_id=abc123; dnt=1; lang=en; lang=de"
cookies, err := http.ParseCookie(line)
песочница
Давайте поговорим об http-куках. Если вы думаете, что это такие пары «ключ-значение», которые сервер и клиент гоняют туда-сюда в каждом запросе, то это верно лишь отчасти.
За годы развития веба куки обзавелись дополнительной атрибутикой. Вот как выглядит структура Cookie в Go 1.23:
— Name и Value — ключ и значение.
— Quoted — true, если значение передано в кавычках.
— Path — разрешает куку на страницах, которые начинаются с указанного пути.
— Domain — разрешает куку на указанном домене и всех его поддоменах.
— Expires — дата окончания годности куки.
— MaxAge — срок жизни куки в секундах.
— Secure — разрешает куку только по HTTPS.
— HttpOnly — закрывает доступ к куке из JavaScript.
— SameSite — разрешает или запрещает куку при кросс-доменных запросах.
— Partitioned — ограничивает доступ к third-party кукам.
Неслабо, да?
Начиная с версии Go 1.23, серверную куку можно распарсить из строки с помощью http.ParseSetCookie:
line := "session_id=abc123; SameSite=None; Secure; Partitioned; Path=/; Domain=example.com"
cookie, err := http.ParseSetCookie(line)
Браузерные куки тоже можно распарсить из строки, с помощью http.ParseCookie:
line := "session_id=abc123; dnt=1; lang=en; lang=de"
cookies, err := http.ParseCookie(line)
песочница