Goで学ぶCookie操作(設定・送信・取得)まとめ

GoにおけるCookie操作(設定・送信・取得)について気になったので、本やネットで調べて自分なりにまとめてみました。

Cookieおさらい

正式には「HTTP cookie」でWebサイトへアクセスした際に、ユーザのデバイス(PCやスマホ)に残していくデータのことです。

サーバからHTTPレスポンスメッセージを通して送られるもので、クライアントに保管されます。次回以降はCookieとともにWebサーバーへアクセスするため、ユーザが保持していたCookieにあわせてページを表示することができます。

分類としてはセッションクッキーと永続性クッキーの2種類に分けられます。

Goにおけるtype Cookie

httpパッケージのtype Cookieは以下のような構造体になっています。

基本的にはhttp.Cookie型へのポインタ変数を用意し、NameフィールドにCookie名、ValueフィールドにCookieの値を入れて設定します。

 

ExpiresとMaxAgeフィールドをしているすることで有効期限を設定することができます。

Expiresフィールドは、Cookieの期限切れとなるtime.Time型を指定します。

 

MaxAgeフィールドは、ブラウザ内で生成されてからどれだけの期間有効かを指定します。ちなみに秒単位です。

 

Expiresはほぼ全てのブラウザに対応しているが、HTTP1.1以降では非推奨となり、MaxAgeが推奨されています。ただ、MaxAgeはIE6、7、8で対応されていません。

参考:https://golang.org/pkg/net/http/#Cookie

Cookieの設定・送信

http.Cookie型へのポインタ変数を用意し、それぞれのフィールドに値を入れ、http.ResponseWriterとcookieを引数にセットします。

 

実際に使われる例として、ユーザログイン時にCookieを生成する場合だと以下のような流れになります。

メールアドレスとパスワードがPOSTされ、メールアドレスからユーザが存在するかをチェックします。ここでのdata.UserByEmailメソッド(処理は省略)はメールアドレスからユーザを取得してきています。

次にPOSTされたパスワードが取得したユーザのパスワードと一致しているかをチェックし、user.CreateSession()メソッド(処理は省略)でサーバ側で持つセッションを生成してセッションテーブルにインサートします。

その後、Cookieをセットしログイン後のページにリダイレクトさせます。

 

Cookieの取得

構造体RequestのCookieメソッドを使用して、HTTPリクエストからのCookieを取得できます。指定したCookieが存在しない場合はエラーを返します。

複数のCookieを取得したい場合は、Cookiesを使うことで全てのCookieをスライスに入れて取得できます。
cookie.ValueでCookieの値を取得することができます。

 

実際に使われる例として、クライアントとサーバ間でのCookieのやりとりの場合、以下のような流れになります。

request.Cookie()メソッド(処理は省略)でCookieを取得し、Session構造体にセットします。

その後、送られてきたセッションをチェックし、無効の場合はエラーにします。

GoにおけるCookie操作についてのまとめでした。