Go言語でセッション管理を行う基本!サードパーティライブラリ活用例
生徒
「先生、Go言語でWebアプリを作るときに、ユーザーごとの情報を安全に管理したいんですが、どうすればいいですか?」
先生
「それならセッション管理を使うと便利です。セッションは、ユーザーごとの情報をサーバー側で一時的に保存する仕組みです。」
生徒
「Cookieとは違うんですか?」
先生
「Cookieはブラウザに保存されますが、セッションはサーバー側で管理されます。CookieはセッションIDだけを保持し、実際の情報はサーバーで管理されるのが一般的です。」
1. セッション管理とは?
セッション管理とは、ユーザーごとの一時的な情報をサーバーで保持する仕組みです。例えば、ログイン状態の保持やショッピングカートの中身管理に使われます。ユーザーがブラウザを閉じても、セッションIDを用いることで情報を安全に保持できます。
2. Go言語でのセッション管理の基本
Go言語では標準ライブラリだけで簡単なセッション管理も可能ですが、より便利に扱うためにサードパーティのライブラリを使うのが一般的です。特に人気なのがgorilla/sessionsです。
gorilla/sessionsは、Cookieやファイル、メモリにセッション情報を安全に保存できるライブラリです。
3. gorilla/sessionsの使い方
まず、ライブラリをインストールします。
go get github.com/gorilla/sessions
次に、セッションストアを作成します。ここではCookieストアを使用します。
import (
"fmt"
"net/http"
"github.com/gorilla/sessions"
)
var store = sessions.NewCookieStore([]byte("secret-key"))
このsecret-keyは、セッションの暗号化に使われます。実際のアプリでは長くて複雑な文字列にすることが推奨されます。
4. セッションに値を保存する方法
セッションに値を保存するには、まずセッションを取得し、値をセットして保存します。
func setSessionHandler(w http.ResponseWriter, r *http.Request) {
session, _ := store.Get(r, "session-name")
session.Values["username"] = "gopher"
session.Save(r, w)
fmt.Fprintln(w, "セッションに値を保存しました!")
}
この例では、「username」というキーに「gopher」を保存しています。
5. セッションから値を取得する方法
保存した値は、同じセッションを取得してキーを指定することで取り出せます。
func getSessionHandler(w http.ResponseWriter, r *http.Request) {
session, _ := store.Get(r, "session-name")
username, ok := session.Values["username"].(string)
if !ok {
fmt.Fprintln(w, "セッションに値がありません")
return
}
fmt.Fprintf(w, "セッションの値は: %s", username)
}
型アサーションを使って値を取り出すことで、正しく文字列として取得できます。
6. セッションを削除する方法
セッションの値を削除するには、session.Valuesからキーを削除して保存します。
func deleteSessionHandler(w http.ResponseWriter, r *http.Request) {
session, _ := store.Get(r, "session-name")
delete(session.Values, "username")
session.Save(r, w)
fmt.Fprintln(w, "セッションの値を削除しました")
}
これにより指定した値だけを消すことができます。全ての値を削除したい場合はセッション全体を破棄することも可能です。
7. サンプルWebアプリ
package main
import (
"fmt"
"net/http"
"github.com/gorilla/sessions"
)
var store = sessions.NewCookieStore([]byte("secret-key"))
func setSessionHandler(w http.ResponseWriter, r *http.Request) {
session, _ := store.Get(r, "session-name")
session.Values["username"] = "gopher"
session.Save(r, w)
fmt.Fprintln(w, "セッションに値を保存しました!")
}
func getSessionHandler(w http.ResponseWriter, r *http.Request) {
session, _ := store.Get(r, "session-name")
username, ok := session.Values["username"].(string)
if !ok {
fmt.Fprintln(w, "セッションに値がありません")
return
}
fmt.Fprintf(w, "セッションの値は: %s", username)
}
func deleteSessionHandler(w http.ResponseWriter, r *http.Request) {
session, _ := store.Get(r, "session-name")
delete(session.Values, "username")
session.Save(r, w)
fmt.Fprintln(w, "セッションの値を削除しました")
}
func main() {
http.HandleFunc("/set", setSessionHandler)
http.HandleFunc("/get", getSessionHandler)
http.HandleFunc("/delete", deleteSessionHandler)
http.ListenAndServe(":8080", nil)
}
このアプリでは、/setでセッションに値を保存し、/getで取得、/deleteで削除できます。ブラウザでアクセスしてセッションの動作を確認できます。
8. セッション管理の注意点
- セッションIDは推測されにくい値にすること
- 重要な情報は暗号化やサーバー側での安全な保存が必要
- 有効期限を設定してセッションの無限保持を避ける
- サードパーティライブラリを使うと、セッション管理が簡単で安全に行える