Go言語によるWebサーバー作成入門 ーBase64ー

公開:2020/11/03
更新:2020/11/03
2 min読了の目安(約2000字TECH技術記事

(作成2020.11.3)

Base64

これまでCookieを使ってきました。Cookieを使うにはBase64というツールが使えるようになっておく必要がありますので、ここで触れたいと思います。
実は、多少触れましたがCookieには使える文字に限りがあります。例えば、日本語の全角文字はCookieに含めることができません。では定義はどうなっているかということですが、現時点でダブルスタンダードになっています。もともとはNetscapeブラウザでHTTPCookieが使われました。ただこの仕様にあいまいな部分があり、設計者によって実装が異なることで互換性に問題がときどき発生していました。その後、幾度か標準化が試みられましたが、落ち着いたのが最近の2011年、RFC6265が実用的に採用されてきており、現在では旧版と新版が両方使われている状況になっています。今後、新たにコーディングして行く際にはRFC6265に準拠しておけばよいかと思います。
とりあえず、Cookieの作成にはRFC6265に準拠しておけばよいということですが、具体的にどうすればよいかというと、ずばりBase64を使えばよいです。Base64は文字を7bit文字に変換するツールです。Cookieに残したい文字列はBase64にエンコードしてCookieに格納し、取り出すときはBase64でデコードします。

エンコード

Cookieに使える文字は文字コードが7bitの文字です。7bitでは64種類しか表現できないので使えるのは64文字です。(実際は空文字埋め(パディング)用の=を加えて65文字が使われます。)

main.go
package main

import (
	"encoding/base64"
	"fmt"
)

func main() {
	s := "本日は晴天なり。あいうえおかきくけこ"
	encodeStd := "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
	s64 := base64.NewEncoding(encodeStd).EncodeToString([]byte(s))

	fmt.Println(len(s))
	fmt.Println(len(s64))
	fmt.Println(s)
	fmt.Println(s64)
}

NewEncodingにエンコード文字を指定して、入力文字sをエンコードしています。エンコード文字としてA-Z,a-z,0-9,+,/の64文字を指定しました。これは標準的に用いられるエンコード文字です。

標準エンコード文字を使う場合は次のコードで書けます(したがって、上記のコードと同じ結果が得られます。)。上記のようにエンコード文字を特に指定して、自分にしかわからないCookieにして他人がデコードできないようにするということも可能ですが、通常はこちらでコードしておけばよいと思います。

main.go
package main

import (
	"encoding/base64"
	"fmt"
)

func main() {
	s := "本日は晴天なり。あいうえおかきくけこ"
	s64 := base64.StdEncoding.EncodeToString([]byte(s))

	fmt.Println(len(s))
	fmt.Println(len(s64))
	fmt.Println(s)
	fmt.Println(s64)
}

デコード

復号化はDecodeStringを使います。

main.go
package main

import (
	"encoding/base64"
	"fmt"
	"log"
)

func main() {
	s := "本日は晴天なり。あいうえおかきくけこ"
	s64 := base64.StdEncoding.EncodeToString([]byte(s))

	fmt.Println(s64)

	bs, err := base64.StdEncoding.DecodeString(s64)
	if err != nil {
		log.Fatalln(err)
	}
	fmt.Println(string(bs))
}