Recommanded Free YOUTUBE Lecture: <% selectedImage[1] %>

Contents

Session 과 Cookie

웹 브라우저를 이용한 HTTP 기반의 데이터 통신에서, 서버는 클라이언트의 상태를 유지하기 위해서 쿠키(cookie)를 사용한다.

세션(session)은 쿠키의 사용 방식 중 하나다. 서버는 클라이언트의 상태를 유지하기 위해서(예컨데 로그인 상태인지, 어떤 상품을 구매했는지, 이전에 어떤 페이지에 머물렀는지 등) 쿠키를 사용한다. 좋은 방법이긴 하지만, 중요 데이터가 인터넷을 가로지른다는 점과 유저의 PC에 저장이 된다는 점 때문에 위험한 방법이다. 간단한 정보는 상관 없지만, 유저의 아이디나 이메일등과 같은 개인정보를 쿠키로 주고 받는 것은 좋은 방법이 아니다.

중요한 정보는 서버의 데이터베이스에 저장하고, 유저에게는 정보를 조회할 수 있는 key를 쿠키로 담아보내면 어떨까 ? 예를 들어 유추하기 힘든 랜덤한 32byte 크기의 문자열을 쿠키에 담아서 보내는 거다. 쿠키에 담긴 이 정보는 로그인 할 때마다 랜덤하게 만들어지고 로그아웃하면 파기 된다. 이 정보가 누출된다고 하더라도 개인 정보를 담고 있지는 않으며, 로그아웃 후에는 파기 되므로 좀더 안전하게 사용 할 수 있을 것이다.

이게 세션이다. 쿠키에 담아보내는 이 랜덤한 유일한 키 값을 (솔류션 마다 조금씩 다르게 부르긴 하지만) Session-ID(세션 아이디)라고 한다.

세션 만들기

세션은 유추하기 힘들어야 하고(즉 랜덤해야 하고), 무차별 대입 공격을 견딜 수 있도록 충분히 커야 한다. 랜덤함수를 이용소 세션ID를 만드는 간단한 함수를 만들었다.
package main
import(
    "math/rand"
    "fmt"
    "time"
)

func Init() {
    rand.Seed(time.Now().UnixNano())
}

var letterRunes = []rune("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ")

func RandStringRunes(n int) string {
    b := make([]rune, n)
    for i := range b {
        b[i] = letterRunes[rand.Intn(len(letterRunes))]
    }
    return string(b)
}

func main() {
    Init()
    sessionid := RandStringRunes(32)
    fmt.Println(sessionid)
}
		
이렇게 유일한 세션ID을 만들었으니, 이제 이를 관리하기 위한 코드를 만들어야 한다. 세션을 관리하기 위해서는 아래 4개의 메서드가 필요 할 것이다.
  1. 세션 만들기 : 세션ID를 만들어서 클라이언트에 전달한다. 서버는 세션ID를 데이터베이스에 저장한다.
  2. 세션 조회 : 클라이언트는 세션ID를 쿠키 값으로 설정해서 서버에 접속한다. 서버는 세션ID를 읽어서, 데이터베이스에 세션ID가 있는지 확인한다.
  3. 세션 수정 : 세션값을 중간에 업데이트한다.
  4. 세션 삭제 : 클라이언트가 요청(주로 로그아웃)하면, 데이터베이스에서 세션 ID를 삭제한다.

세션의 단점

Secure Cookie

JWT