CookieにJSONの内容を格納する際などは、base64を用いて事前にエンコードし、Cookieから取り出した後にデコードします。
Cookieには許容されない文字を使うと、Cookieにそもそも登録できない、または異なるValueの値が登録されてしまうからです。
func main() {
http.HandleFunc("/", foo)
http.Handle("/favicon.ico", http.NotFoundHandler())
http.ListenAndServe(":8080", nil)
}
func foo(w http.ResponseWriter, req *http.Request) {
s := ";≠|:;" // エンコードしないと、意図した内容をCookieに登録できない
s64Value := base64.StdEncoding.EncodeToString([]byte(s))
http.SetCookie(w, &http.Cookie{
Name: "session",
Value: s64Value, // エンコードした内容を登録
})
c, _ := req.Cookie("session")
ds, _ := base64.StdEncoding.DecodeString(c.Value) // デコード
fmt.Println(string(ds)) // byte配列からstringにキャストすると、「;≠|:;」と出力される
}
ほとんどないことかもしれませんが、CookieのNameには「=」を使用できません。
base64のStdEncodingは「=」を含んでしまうため、CookieのNameもエンコードしたい場合、RawStdEncodingを使う必要があります。
s64Value := base64.RawStdEncoding.EncodeToString([]byte(s)) // 「=」(padding)が含まれないようにエンコードされる