Cookieに使える、base64エンコード【Go】
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)が含まれないようにエンコードされる