세션 관리
현재 로그인한 사용자 정보를 세션에 저장하거나 세션에서 가져오는 기능을 구현해 보자. session.go 파일을 생성하고 다음과 같이 코드를 작성한다.
▼ session.go
package main import ( "encoding/json" "net/http" "time" "github.com/goincremental/negroni-sessions" ) const ( currentUserKey = "oauth2_current_user" // 세션에 저장되는 CurrentUser의 키 sessionDuration = time.Hour // 로그인 세션 유지 시간 ) type User struct { Uid string `json:"uid"` Name string `json:"name"` Email string `json:"user"` AvatarUrl string `json:"avatar_url"` Expired time.Time `json:"expired"` } func (u *User) Valid() bool { // 현재 시간 기준으로 만료 시간 확인 return u.Expired.Sub(time.Now()) > 0 } func (u *User) Refresh() { // 만료 시간 시간 연장 u.Expired = time.Now().Add(sessionDuration) } func GetCurrentUser(r *http.Request) *User { // 세션에서 CurrentUser 정보를 가져옴 s := sessions.GetSession(r) if s.Get(currentUserKey) == nil { return nil } data := s.Get(currentUserKey).([]byte) var u User json.Unmarshal(data, &u) return &u } func SetCurrentUser(r *http.Request, u *User) { if u != nil { // CurrentUser 만료 시간 갱신 u.Refresh() } // 세션에 CurrentUser 정보를 json으로 저장 s := sessions.GetSession(r) val, _ := json.Marshal(u) s.Set(currentUserKey, val) }
User 타입은 기본 사용자 정보와 Expired 필드를 가지고 있다. Expired 필드로 로그인 유지 기간을 설정하고, Expired 시간이 지나면 로그인을 다시 하게 한다.