본문 바로가기

Language/Go

[Go] - web programming : 쿠키 cookie

쿠키

 

쿠키는 클라이언트에 저장된 작은 정보이다. 기본적으로 클라이언트가 HTTP 요청을 서버에 보낼 때마다 쿠키도 함께 전송된다. 쿠키는 HTTP가 상태를 가지지 않는(stateless-ness) 문제를 극복하기 위한 용도로 설계되었다.

 

공부한 것

1. 쿠키를 이용한작업

2. 쿠키를 이용한 플래시 메시지 작성

 

Go에서 쿠키 작성하기

 

Go에서의 쿠키 구조

type Cookie struct {
	Name string
    Value string
    Path string
    Domain string
    Expires time.Time
    RawExpires string
    MaxAge int
    Secure bool
    HttpOnly bool
    Raw string
    Unparsed []string
}

 

브라우저로 쿠키 전송

package main

import (
	"net/http"
)

func setCookie(w http.ResponseWriter, r *http.Request) {
	c1 := http.Cookie{
		Name:       "first_cookie",
		Value:      "Go Web Programming",
		HttpOnly:   true,
	}
	c2 := http.Cookie{
		Name:       "second_cookie",
		Value:      "Hello cookie!",
		HttpOnly:   true,
	}

	w.Header().Set("Set-Cookie", c1.String())
	w.Header().Add("Set-Cookie", c2.String())
}

func main() {
	server := http.Server{
		Addr: "127.0.0.1:8080",
	}
	http.HandleFunc("/set_cookie", setCookie)
	server.ListenAndServe()
}

http.Cookie 구조를 통해 쿠키 정보를 확인하고. w.Header().Set, Add를 통해 cookie를 넣어준다.

 

http.SetCookie(w, &c1)
http.SetCookie(w, &c2)

http 라이브러리의 SetCookie 메소드를 통해서도 전달할 수 있다.

 

개발자 도구로 확인한 쿠키

 

브라우저로부터 쿠키 얻기

func getCookie(w http.ResponseWriter, r *http.Request) {
	c1, err := r.Cookie("first_cookie")
	if err != nil {
		fmt.Fprintln(w, "Cannot get the first cookie")
	}
	cs := r.Cookies()

	fmt.Fprintln(w, c1)
	fmt.Fprintln(w, cs)
}

http.Request가 가진 Cookie를 통해 key, value로, Cookies로 모든 cookie를 가져올 수 있다.

 

쿠키 msg

 

플래시 메시지를 위한 쿠키 사용

 

1. 사용자에게 짧은 정보성 메시지를 보여줄 때 사용.

2. 요창 동작이 성공적으로 수행되거나 성공적이지 않을 때

3. 일시적이지만 특정 상태를 보여주어야 할 때 일시적인 메시지를 플래시 메시지(flash message)라고 한다.

4. 페이지가 갱신될 때 플래시 메시지를 저장하고 세션 쿠키를 제거하는 것으로 구현.

 

package main

import (
	"encoding/base64"
	"fmt"
	"net/http"
	"time"
)

func setMessage(w http.ResponseWriter, r *http.Request) {
	msg := []byte("Hello world!")
	c := http.Cookie{
		Name:  "flash",
		Value: base64.URLEncoding.EncodeToString(msg),
	}
	http.SetCookie(w, &c)
}

func showMessage(w http.ResponseWriter, r *http.Request) {
	c, err := r.Cookie("flash")
	if err != nil {
		if err == http.ErrNoCookie {
			fmt.Fprintln(w, "No message found")
		}
	} else {
		rc := http.Cookie{
			Name: "flash",
			MaxAge: -1,
			Expires: time.Unix(1, 0),
		}
		http.SetCookie(w, &rc)
		 val, _ := base64.URLEncoding.DecodeString(c.Value)
		 fmt.Fprintln(w, string(val))
	}
}

func main() {
	server := http.Server{
		Addr: "127.0.0.1:8080",
	}
	http.HandleFunc("/set_message", setMessage)
	http.HandleFunc("/show_message", showMessage)
	server.ListenAndServe()
}

쿠키를 발견한다면,

1. 동일한 이름에 대한 쿠리를 만들고, MaxAge를 음수로 설정하여 과거에 있던 것과 동일한 값으로 설정

2. SetCookie를 이용해 쿠키를 브라우저에 전송한다.

 

/set_message에 저장된 쿠키

 

 

/show_message에 표시된 쿠키 내용

show_message로 가보면 쿠키가 삭제되고, 그 내용을 확인할 수 있다.

showMessage 함수를 보면 같은 이름의 쿠키를 MaxAge는 -1, Expires가 과거의 시간이 되었기 때문에 만료된 값으로 확인되어 삭제 된다.

 

 

 

실제로 다시 새로고침을 해보면 내용이 사라진 것을 확인할 수 있다.