логотип PurpleSchool
логотип PurpleSchool

Работа с cookie в Golang

Автор

Олег Марков

Введение

Управление cookie в веб-приложениях всегда было важным аспектом, и Golang делает этот процесс достаточно простым благодаря своей стандартной библиотеке. Cookie помогают сохранять состояние между HTTP-запросами, что позволяет, например, отслеживать сессии пользователей, сохранять настройки сайта и многое другое. В этой статье мы погрузимся в детали работы с cookie в Golang, чтобы вы могли максимально эффективно использовать их в ваших приложениях.

Golang предоставляет все необходимое для работы с cookie в своем базовом пакете net/http. Давайте разберем основные аспекты и методы, которые помогут вам в создании и управлении cookie.

Создание cookie в Go осуществляется достаточно просто. Для этого используется структура http.Cookie, которая содержит всю необходимую информацию о cookie, такую как имя, значение, домен, путь и другие свойства.

// Здесь мы создаем новое cookie с именем "session_token"
cookie := &http.Cookie{
    Name:     "session_token",     // Название cookie
    Value:    "xyz123",            // Значение cookie
    Path:     "/",                 // Путь, для которого cookie применяется
    HttpOnly: true,                // Cookie доступно только через HTTP(S), а не JavaScript
}

После создания cookie, следующим шагом является его отправка клиенту, чтобы браузер мог сохранить его. Это делается посредством метода SetCookie объекта http.ResponseWriter.

http.HandleFunc("/set", func(w http.ResponseWriter, r *http.Request) {
    // Устанавливаем cookie в браузер
    http.SetCookie(w, cookie)
    w.Write([]byte("Cookie установлено!"))
})

Чтение cookie из запроса — это также просто, как и его создание. В Golang для этого используется метод Cookie объекта http.Request, который возвращает cookie по указанному имени.

http.HandleFunc("/get", func(w http.ResponseWriter, r *http.Request) {
    // Извлекаем cookie с именем "session_token"
    cookie, err := r.Cookie("session_token")
    if err != nil {
        w.Write([]byte("Не удалось найти cookie"))
        return
    }
    w.Write([]byte("Cookie значение: " + cookie.Value))
})

Удаление cookie заключается в установке его срока действия в прошлое. Это гарантирует, что браузер удалит cookie.

http.HandleFunc("/delete", func(w http.ResponseWriter, r *http.Request) {
    // Устанавливаем срок действия cookie в прошлое для его удаления
    expiredCookie := &http.Cookie{
        Name:    "session_token",
        Value:   "",
        Path:    "/",
        Expires: time.Unix(0, 0), // Устанавливаем дату истечения в прошлое
        MaxAge:  -1,
    }
    http.SetCookie(w, expiredCookie)
    w.Write([]byte("Cookie удалено!"))
})

Cookie в Golang могут содержать множество дополнительных свойств, которые существенно влияют на их поведение, таких как Secure, SameSite, MaxAge. Давайте кратко рассмотрим, что они делают:

  • Secure: если установлено в true, cookie будут передаваться только по HTTPS.
  • SameSite: политика защиты от csrf-атак, может быть значением Lax, Strict или None.
  • MaxAge: время жизненного цикла cookie в секундах.

Пример:

cookie := &http.Cookie{
    Name:     "example",
    Value:    "12345",
    Path:     "/",
    Domain:   "example.com",
    Expires:  time.Now().Add(48 * time.Hour), // Срок действия cookie 48 часов
    Secure:   true,                           // Cookie передается только через HTTPS
    HttpOnly: true,                           // Доступно только через HTTP(S)
    SameSite: http.SameSiteStrictMode,        // Строгий режим для защиты от CSRF атак
}

Как видите, Golang предоставляет множество возможностей для управления cookie, что упрощает разработку безопасных и эффективных веб-приложений.

В заключение, работа с cookie в Golang интуитивно понятна благодаря пакету net/http. Управление состоянием и безопасностью веб-приложений становится проще, если вы умеете правильно и эффективно работать с cookie. Надеюсь, эта статья помогла вам разобраться в основных методах и функциях, необходимых для управления cookie в ваших проектах.

Стрелочка влевоЧтение и запись CSV-файлов в GolangРегистры в GoСтрелочка вправо

Все гайды по Golang

Работа с YAML в GolangПреобразование типов в GolangКонвертация структур в JSON в GolangStrconv в GolangИспользование пакета SQLx для работы с базами данных в GolangРазбираемся с SQL в GolangРазделение строк с помощью функции split в GolangSort в GoПоиск и замена строк в Go - GolangИспользование пакета reflect в GolangРабота с PostgreSQL в GoPointers в GolangПарсинг в GoРабота со списками (list) в GolangПреобразование int в string в GolangРабота с числами с плавающей точкой в GolangРабота с полями в GolangИспользование enum в GolangОбработка JSON в GoЧтение и запись CSV-файлов в GolangРабота с cookie в GolangРегистры в GoКэширование данных в GolangПреобразование byte в string в GolangByte в GoИспользование bufio для работы с потоками данных в GolangДобавление данных и элементов (add) в Go
Логирование в Golang. Zap, Logrus, Loki, GrafanaРабота с Docker-контейнерами в GoИспользование pprof в GolangМеханизмы синхронизации в GolangРабота с пакетом S3 в GolangМониторинг Golang приложений с помощью PrometheusОптимизация проектов на GoПаттерны проектирования в GolangМиграции базы данных в GolangОркестрация контейнеров Go с Kubernetes + DockerGjGo Playground и компилятор GolangИспользование go mod init для создания модулей GolangРабота с переменными окружения (env) в GolangКоманда go build в GolangАвтоматизация Golang проектов — CI/CD с GitLab CI и JenkinsОтладка кода в GolangЧтение и использование конфигурации в приложениях на GolangКомпиляция в GolangКак развернуть Go-приложение на облаке AWSАутентификация в Golang
Сетевые протоколы в GoПеременные в GolangЗначения в GolangДженерик %T и его применение в GolangТипы данных в GolangИспользование tls в GolangИспользование tag в структурах GolangSwitch в GoСтроки в GolangРабота с потоками (stream) в GolangSelect в GoРуны в GoРабота с пакетом params в GolangКонвертация строк в числа в GolangNull, Nil, None, 0 в GoНаименования переменных, функций и структур в GoInt в GolangУстановка GolangЧтение и установка HTTP заголовков в GolangMethods в GolangGoLand — IDE для разработки на Golang от JetBrainsОбработка «not found» в GolangFloat в GolangФлаги командной строки в Go (Golang)Запуск внешних команд в GolangОбработка ошибок в GoИспользование defer в GolangЗначения default в GolangГенерация кода в GoФорматирование кода в GolangЧистая архитектура в GolangКаналы (channels) в GolangПолучение body из HTTP запроса в Golang
Открыть базу знаний