더북(TheBook)

세션 관리

현재 로그인한 사용자 정보를 세션에 저장하거나 세션에서 가져오는 기능을 구현해 보자. 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 시간이 지나면 로그인을 다시 하게 한다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.