쿠키
쿠키는 클라이언트에 저장된 작은 정보이다. 기본적으로 클라이언트가 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를 가져올 수 있다.
플래시 메시지를 위한 쿠키 사용
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를 이용해 쿠키를 브라우저에 전송한다.
show_message로 가보면 쿠키가 삭제되고, 그 내용을 확인할 수 있다.
showMessage 함수를 보면 같은 이름의 쿠키를 MaxAge는 -1, Expires가 과거의 시간이 되었기 때문에 만료된 값으로 확인되어 삭제 된다.
실제로 다시 새로고침을 해보면 내용이 사라진 것을 확인할 수 있다.
'Language > Go' 카테고리의 다른 글
[Go] - web programming : 액션 (0) | 2020.01.16 |
---|---|
[Go] - web programming : 템플릿과 템플릿 엔진 (0) | 2020.01.15 |
[Go] - web programming : request 처리 및 response 작성 (1) | 2020.01.04 |
[Go] - web programming : handler 기초 (0) | 2020.01.03 |
[GO] https 제공을 위한 인증된 SSL과 서버 개인 키 생성하기 (0) | 2020.01.03 |