技術向上

プログラミングの学び、気になるテクノロジーやビジネストレンドを発信

Cookieに使える、base64エンコード【Go】

CookieJSONの内容を格納する際などは、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)が含まれないようにエンコードされる


Set-Cookie | MDN