cookie와 session은 웹 애플리케이션 개발에서 사용되는 중요한 개념으로, 사용자 인증 및 상태 관리를 위해 필수적입니다. 이번 글에서 cookie와 session에 대한 개념과 Go 언어에서 cookie와 session을 다루는 방법에 대하여 기록하겠습니다.
제목을 제외한 내용에서 cookie는 쿠키로, sessoin은 세션으로 부르겠습니다.
목차
cookie
session
cookie
쿠키는 클라이언트와 서버 간의 정보를 저장하고 교환하기 위한 작은 데이터 조각입니다. 주로 사용자 인증, 선호 설정, 장바구니 등의 상태 정보를 유지하는 데 사용됩니다.
쿠키는 클라이언트 브라우저에 저장되며, 각 요청과 응답에서 함께 전송됩니다.
주요 특징
이름과 값 : 쿠키는 이름과 해당 값을 가집니다.
만료 날짜 및 시간 : 쿠키는 만료 시간을 설정하여 일시적인 정보를 저장할 수 있습니다.
도메인 및 경로 제한 : 쿠키를 특정 도메인 및 경로에서만 사용할 수 있도록 제한할 수 있습니다.
보안 옵션 : 'httpOnly' 및 'Secure'과 같은 옵션을 사용하여 보안을 강화할 수 있습니다.
Go 언어로 cookie 다루기
Go 언어에서 쿠키를 다루기 위하여 'net/http' 패키지를 사용합니다.
cookie 설정
func setCookie(w http.ResponseWriter, r *http.Request) {
cookie := http.Cookie{
Name: "username",
Value: "johndoe",
Path: "/",
MaxAge: 3600,
HttpOnly: true,
}
http.SetCookie(w, &cookie)
}
'setCookie'라는 hanlder에서 'http.Cookie'를 활용하여 쿠키를 생성하고 'http.SetCookie'를 사용하여 응답에 쿠키를 포함시켰습니다.
쿠키에는 아래의 옵션을 사용할 수 있습니다.
Path : 쿠키를 사용할 수 있는 경로를 지정합니다. 지정된 경로의 하위 경로에서 사용 가능합니다.
MaxAge : 쿠키의 만료 시간을 설정합니다. 단위는 s입니다.
httpOnly : javaScript 코드에서 쿠키의 접근을 제한합니다. 주로 XSS공격을 방시하기 위하여 사용됩니다.
Secure : 쿠키를 HTTPS 연결을 통해서만 전송되도록 설정합니다.
cookie 읽기
요청에 포함된 쿠키를 읽는 예시는 아래와 같습니다.
func readCookie(w http.ResponseWriter, r *http.Request) {
cookie, err := r.Cookie("username")
if err != nil {
if err == http.ErrNoCookie {
fmt.Fprintln(w, "쿠키를 찾을 수 없습니다.")
} else {
fmt.Fprintln(w, "쿠키를 읽는 중 오류가 발생했습니다.")
}
return
}
fmt.Fprintf(w, "쿠키 값: %s", cookie.Value)
}
응답 정보의 'r.Cookie'를 이용하여 cookie의 값을 불러옵니다. 'r.Cookie'의 매개변수로 쿠키의 이름을 입력합니다.
session
세션은 웹 애플리케이션에서 사용자의 상태를 유지하기 위한 메커니즘 중 하나입니다. 세션은 서버 측에서 사용자의 정보를 저장하고 고유한 세션 ID를 클라이언트로부터 받아 유지합니다.
주요 특징
서버 측 저장 : 세션 데이터는 서버에 저장되므로 클라이언트에게 노출되지 않습니다.
세션 ID : 세션을 고유하게 식별하기 위한 세션 ID가 클라이언트에게 쿠키로 전송됩니다.
만료 시간 : 세션은 서버에서 만료 시간을 설정하여 일정 시간이 지나면 종료됩니다.
용도 : 주로 사용자 로그인 상태 유지, 장바구니, 로그인 정보 저장 등의 용도로 활용됩니다.
Go 언어로 session 다루기
Go 언어에서 세션을 다루기 위하여 'net/http'를 사용합니다.
session 설정
var sessions = make(map[string]string)
var mu sync.Mutex // 세션 맵에 대한 동시성 제어를 위한 뮤텍스
func setSession(w http.ResponseWriter, r *http.Request) {
mu.Lock()
defer mu.Unlock()
sessionID := "unique-session-id"
sessions[sessionID] = "user-data"
http.SetCookie(w, &http.Cookie{
Name: "session",
Value: sessionID,
Path: "/",
})
}
세션을 저장하기 위한 map을 생성하였습니다. ID와 해당하는 값을 저장하기 위하여 'map[string]string'으로 설정하였습니다. 세션을 다루는 경우에는 동시에 접근하게 되면 기록이 꼬이는 경우가 발생할 수 있습니다. 따라서 Mutex를 활용하여 동시성을 제어합니다.
응답을 보낼 때 세션의 ID를 값으로 가지는 쿠키를 생성하여 응답합니다.
session 읽기
func readSession(w http.ResponseWriter, r *http.Request) {
cookie, err := r.Cookie("session")
if err != nil {
fmt.Fprintln(w, "세션을 찾을 수 없습니다.")
return
}
mu.Lock()
defer mu.Unlock()
sessionID := cookie.Value
userData, exists := sessions[sessionID]
if !exists {
fmt.Fprintln(w, "세션 데이터를 찾을 수 없습니다.")
return
}
fmt.Fprintf(w, "세션 데이터: %s", userData)
}
세션의 값을 읽는 방법은 요청에 포함된 쿠키에서 세션의 ID를 확인하여 세션을 저장해 둔 map에 접근하여 세션을 읽습니다.
'Go language' 카테고리의 다른 글
[Go] Go 서버를 통하여 Mysql 사용하기 (go-sql-driver) (0) | 2023.09.17 |
---|---|
[Go] 웹 서버 테스트하기 (net/http/httptest 패키지) (0) | 2023.09.13 |
[Go] 테스트 코드 작성하기 (테스트, 벤치마크) (0) | 2023.09.13 |
[Go] 데이터 압축하기 (compress/gzip 사용하기) (0) | 2023.09.11 |
[Go] RESTful API 설계 (HTTP 메서드 사용, gorila/mux) (0) | 2023.09.05 |