Sessions: ๊ต์ฐจ ์›น ์„œ๋ฒ„ ์„ธ์…˜

์— ๋งŒ๋“  2016๋…„ 07์›” 24์ผ  ยท  11์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: gorilla/sessions

gorilla/sessions๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„œ๋ฒ„ ๊ฐ„ ์„ธ์…˜์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ํ•˜๋‚˜์˜ ์›น ์‚ฌ์ดํŠธ๋ฅผ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด ์—ฌ๋Ÿฌ ์„œ๋ฒ„๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ํ•œ ์„œ๋ฒ„์— ๋กœ๊ทธ์ธํ•˜๋ฉด ๋‹ค๋ฅธ ์„œ๋ฒ„์—๋„ ๋กœ๊ทธ์ธํ•  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•ฉ๋‹ˆ๋‹ค.

question

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

@CasperHK ๊ธฐ๋ณธ์ ์œผ๋กœ ์ฟ ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์„œ๋ฒ„๊ฐ€ ๋ชจ๋‘ ๋™์ผํ•œ ๋„๋ฉ”์ธ(์˜ˆ: github.com ๋˜๋Š” *.github.com)์˜ ์ผ๋ถ€์ธ ๊ฒฝ์šฐ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ฟ ํ‚ค๋ฅผ ์ „์†กํ•ฉ๋‹ˆ๋‹ค.

๋˜๋Š” ์„ธ์…˜ ์€ ์„œ๋ฒ„ ์ธก ์ €์žฅ์†Œ ๋„

๋ชจ๋“  11 ๋Œ“๊ธ€

@CasperHK ๊ธฐ๋ณธ์ ์œผ๋กœ ์ฟ ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์„œ๋ฒ„๊ฐ€ ๋ชจ๋‘ ๋™์ผํ•œ ๋„๋ฉ”์ธ(์˜ˆ: github.com ๋˜๋Š” *.github.com)์˜ ์ผ๋ถ€์ธ ๊ฒฝ์šฐ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ฟ ํ‚ค๋ฅผ ์ „์†กํ•ฉ๋‹ˆ๋‹ค.

๋˜๋Š” ์„ธ์…˜ ์€ ์„œ๋ฒ„ ์ธก ์ €์žฅ์†Œ ๋„

gorilla/session ๋Š” ๋‚ด ์ž‘์—…์— ์ ํ•ฉํ•ด ๋ณด์ž…๋‹ˆ๋‹ค. ์‚ฌ์‹ค, ์ €๋Š” ๋Œ€ํ•™์˜ ๋งˆ์ง€๋ง‰ ํ•ด ํ”„๋กœ์ ํŠธ์— Go๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์ด์ œ ๊ฐ™์€ ๋„๋ฉ”์ธ์— 12๊ฐœ์˜ ์šฐ๋ถ„ํˆฌ ์„œ๋ฒ„๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋“ค ์ค‘ ์ผ๋ถ€๋Š” ์›น ์„œ๋ฒ„๋กœ ์‚ฌ์šฉ๋˜๊ณ  ํ•˜๋‚˜๋Š” MySQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„œ๋ฒ„๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ชจ๋“  ์›น ์„œ๋ฒ„์—์„œ ์„ธ์…˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋™๊ธฐํ™”ํ•  ์ˆ˜ ์žˆ๋„๋ก MySQL ๊ธฐ๋ฐ˜ ์„ธ์…˜ ์„œ๋น„์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.
์ด์ „์—๋Š” MySQL ๊ธฐ๋ฐ˜ ๊ต์ฐจ ์„œ๋ฒ„ ์„ธ์…˜์„ ํ”„๋กœ๊ทธ๋ž˜๋ฐํ•˜๋ ค๊ณ  ํ–ˆ์Šต๋‹ˆ๋‹ค. srinathgs/mysqlstore ์ด ๋™์ผํ•œ ์ž‘์—…์„ ๋” ์‰ฝ๊ฒŒ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•œ๋‹ค๋ฉด ๊ณต๋ถ€ํ•˜๊ณ  ์ž‘์—…์„ ๋‹จ์ˆœํ™”ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

๊ธฐ๋ณธ CookieStore๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ๋ชจ๋“  ์„œ๋ฒ„์— ๋™์ผํ•œ ์„œ๋ช… ํ‚ค๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ
๋™์ผํ•œ ๋„๋ฉ”์ธ์— ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ ๊ทธ๋Œ€๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

2016๋…„ 7์›” 24์ผ ์ผ์š”์ผ ์˜คํ›„ 10์‹œ 48๋ถ„ Casper LI [email protected]์ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ผ์Šต๋‹ˆ๋‹ค.

๊ณ ๋ฆด๋ผ/์„ธ์…˜์ด ๋‚ด ์ž‘์—…์— ์ ํ•ฉํ•ด ๋ณด์ž…๋‹ˆ๋‹ค. ์‚ฌ์‹ค, ๋‚˜๋Š” ๋‚ด์—์„œ Go๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.
๋Œ€ํ•™์˜ ๋งˆ์ง€๋ง‰ ํ•ด ํ”„๋กœ์ ํŠธ์ด๋ฉฐ ์ด์ œ 12๊ฐœ์˜ ์šฐ๋ถ„ํˆฌ ์„œ๋ฒ„๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
๊ฐ™์€ ๋„๋ฉ”์ธ. ๊ทธ๋“ค ์ค‘ ์ผ๋ถ€๋Š” ์›น ์„œ๋ฒ„๋กœ ์‚ฌ์šฉ๋˜๊ณ  ํ•˜๋‚˜๋Š”
MySQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„œ๋ฒ„๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ตฌํ˜„ํ•˜๊ณ  ์‹ถ์€
๋ชจ๋“  ์›น์—์„œ ์„ธ์…˜ ๋ฐ์ดํ„ฐ ๋™๊ธฐํ™”๋ฅผ ํ—ˆ์šฉํ•˜๋Š” MySQL ๊ธฐ๋ฐ˜ ์„ธ์…˜ ์„œ๋น„์Šค
์„œ๋ฒ„.
์ด์ „์—๋Š” MySQL ๊ธฐ๋ฐ˜ ๊ต์ฐจ ์„œ๋ฒ„ ์„ธ์…˜์„ ํ”„๋กœ๊ทธ๋ž˜๋ฐํ•˜๋ ค๊ณ  ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋งŒ์•ฝ์— "
github.com/gorilla/sessions"๋Š” ๋™์ผํ•œ ์ž‘์—…์„ ๋” ์‰ฝ๊ฒŒ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
๊ณต๋ถ€ํ•˜๊ณ  ์ž‘์—…์„ ๋‹จ์ˆœํ™”ํ•˜๋Š” ๋ฐ ์ข‹์Šต๋‹ˆ๋‹ค.

โ€”
๋‹น์‹ ์ด ํ• ๋‹น๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ ๋ฐ›๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ณ  GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/gorilla/sessions/issues/87#issuecomment -234845955,
๋˜๋Š” ์Šค๋ ˆ๋“œ ์Œ์†Œ๊ฑฐ
https://github.com/notifications/unsubscribe-auth/AABIcNfC7H8DrZq5NX1Tu7W_Vd1LM5BIks5qZE43gaJpZM4JTizF
.

์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ CookieStore์™€ ์„œ๋ช… ํ‚ค๊ฐ€ ๋ฌด์—‡์ธ์ง€ ๋ฌป๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. CookieStore๋Š” gorilla/sessions ํŒจํ‚ค์ง€๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๊นŒ?

์˜ˆ. http://www.gorillatoolkit.org/pkg/sessions๋ฅผ ์‚ดํŽด๋ณด์‹ญ์‹œ์˜ค.

  • something-very-secret ๋Š” ์„œ๋ช… ํ‚ค์ž…๋‹ˆ๋‹ค.
  • sessions.NewCookieStore ๋Š” ์„œ๋ฒ„ ๊ฐ„์— ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค/๊ณต์œ  ์ƒํƒœ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์€ *CookieStore sessions.NewCookieStore ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
import (
    "net/http"
    "github.com/gorilla/sessions"
)

var store = sessions.NewCookieStore([]byte("something-very-secret"))

func MyHandler(w http.ResponseWriter, r *http.Request) {
    // Get a session. We're ignoring the error resulted from decoding an
    // existing session: Get() always returns a session, even if empty.
    session, err := store.Get(r, "session-name")
    if err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
        return
    }

    // Set some session values.
    session.Values["foo"] = "bar"
    session.Values[42] = 43
    // Save it before we write to the response/return from the handler.
    session.Save(r, w)
}

์ฝ”๋“œ๋ฅผ ์ฝ์—ˆ์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๋ณผ ๋•Œ

var store = sessions.NewCookieStore([]byte("something-very-secret")) 

store ๋ณ€์ˆ˜๊ฐ€ ํ”„๋กœ์ ํŠธ ์ „์ฒด์˜ ๋ชจ๋“  ํ•ธ๋“ค๋Ÿฌ์—์„œ ์‚ฌ์šฉ๋˜๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ๋‹ค๋ฅธ ํŒจํ‚ค์ง€๋กœ ํฌ์žฅํ•ด์„œ ๋‚ด๋ณด๋‚ด์•ผ ํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋‚ด๊ฐ€ ์ œ๊ณตํ•˜๋Š” ํŽ˜์ด์ง€(์˜ˆ: index , projbrwsr , codeeditor )์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ํŒจํ‚ค์ง€์˜ ๋ชจ๋“  ๋‹ค๋ฅธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ๋ถ„๋ฆฌํ–ˆ๊ณ  ํ•ด๋‹น ํ•ธ๋“ค๋Ÿฌ๋Š” ๊ฐ™์€ Store .
image

something-very-secret ๋Š” ๋น„๋ฐ€ ํ‚ค๋ผ๊ณ  ํ•˜์ง€๋งŒ NewCookieStore() ํ•จ์ˆ˜์— ๋ฌด์—‡์„ ์ „๋‹ฌํ•ด์•ผ ํ•˜๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

์ €์žฅ์†Œ(sessions.Store)๋ฅผ ๋‹ค๋ฅธ ํŒจํ‚ค์ง€์— ์ข…์†์„ฑ์œผ๋กœ ์‚ฝ์ž…ํ•ฉ๋‹ˆ๋‹ค.

2016๋…„ 7์›” 25์ผ ์›”์š”์ผ ์˜ค์ „ 8์‹œ 57๋ถ„์— Casper LI [email protected]์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ผ์Šต๋‹ˆ๋‹ค.

์ฝ”๋“œ๋ฅผ ์ฝ์—ˆ์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๋ณผ ๋•Œ

var ์ €์žฅ์†Œ = session.NewCookieStore([]byte("๋ญ”๊ฐ€ ๋งค์šฐ ๋น„๋ฐ€"))

store ๋ณ€์ˆ˜๊ฐ€ out๋ถ€ํ„ฐ ๋ชจ๋“  ํ•ธ๋“ค๋Ÿฌ์—์„œ ์‚ฌ์šฉ๋˜๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.
ํ”„๋กœ์ ํŠธ. ๊ทธ๋ ‡๋‹ค๋ฉด ๋‹ค๋ฅธ ํฌ์žฅ์— ์‹ธ์„œ ํฌ์žฅํ•ด์•ผ ํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
์ˆ˜์ถœํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋‚ด๊ฐ€ ๋ชจ๋“  ๋‹ค๋ฅธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ๋ถ„๋ฆฌํ–ˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
์ œ๊ณตํ•˜๋Š” ํŽ˜์ด์ง€์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ํŒจํ‚ค์ง€(์˜ˆ: ์ƒ‰์ธ,
projbrwsr, codeeditor) ๋ฐ ํ•ด๋‹น ํ•ธ๋“ค๋Ÿฌ๋Š” ๋™์ผํ•œ Store๋ฅผ ํ˜ธ์ถœํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
[์ด๋ฏธ์ง€: ์ด๋ฏธ์ง€]
https://cloud.githubusercontent.com/assets/6957401/17107410/a34dcc50-52c1-11e6-92f7-a4227da60244.png

โ€”
๋‹น์‹ ์ด ํ• ๋‹น๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ ๋ฐ›๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ณ  GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/gorilla/sessions/issues/87#issuecomment -234996994,
๋˜๋Š” ์Šค๋ ˆ๋“œ ์Œ์†Œ๊ฑฐ
https://github.com/notifications/unsubscribe-auth/AABicOHzeq8IabUoj-SZx_B-7er-PJf9ks5qZNzsgaJpZM4JTizF
.

์•„์ฃผ ๋น„๋ฐ€์Šค๋Ÿฌ์šด ๊ฒƒ์ด ๋น„๋ฐ€ ํ‚ค๋ผ๊ณ  ํ•˜์ง€๋งŒ NewCookieStore() ํ•จ์ˆ˜์— ๋ฌด์—‡์„ ์ „๋‹ฌํ•ด์•ผ ํ• ์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

https://godoc.org/github.com/gorilla/sessions#NewCookieStore

ํ‚ค๋Š” ํ‚ค ์ˆœํ™˜์„ ํ—ˆ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์Œ์œผ๋กœ ์ •์˜๋˜์ง€๋งŒ ์ผ๋ฐ˜์ ์ธ ๊ฒฝ์šฐ๋Š” ๋‹จ์ผ ์ธ์ฆ ํ‚ค์™€ ์„ ํƒ์ ์œผ๋กœ ์•”ํ˜ธํ™” ํ‚ค๋ฅผ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์Œ์˜ ์ฒซ ๋ฒˆ์งธ ํ‚ค๋Š” ์ธ์ฆ์— ์‚ฌ์šฉ๋˜๊ณ  ๋‘ ๋ฒˆ์งธ ํ‚ค๋Š” ์•”ํ˜ธํ™”์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์•”ํ˜ธํ™” ํ‚ค๋Š” ๋งˆ์ง€๋ง‰ ์Œ์—์„œ nil๋กœ ์„ค์ •ํ•˜๊ฑฐ๋‚˜ ์ƒ๋žตํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ธ์ฆ ํ‚ค๋Š” ๋ชจ๋“  ์Œ์—์„œ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

NewCookieStore ๋Š” ์ธ์ฆ/์„œ๋ช… ํ‚ค์™€ (์„ ํƒ ์‚ฌํ•ญ) ์•”ํ˜ธํ™” ํ‚ค๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ์ €๋Š” Go๋ฅผ ์ฒ˜์Œ ์ ‘ํ•ฉ๋‹ˆ๋‹ค. Inject store ์— ๋Œ€ํ•ด ๋” ์ž์„ธํžˆ ์„ค๋ช…ํ•˜๊ฑฐ๋‚˜ ์„ค๋ช…์„ ์œ„ํ•œ ๋งํฌ๋ฅผ ์ œ๊ณตํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

@CasperHK ํŒจํ‚ค์ง€์˜ ์ƒ์„ฑ์ž๊ฐ€ ์ข…์†์„ฑ์„ ์ˆ˜๋ฝํ•˜๋„๋ก ํ•˜์‹ญ์‹œ์˜ค.

  • NewProjectBrowser(store sessions.Store, debug bool) (*ProjectBrowser, error) { ... }
  • NewCodeEditor(store sessions.Store) (*CodeEditor, error) { ... }

main.go

func main() {
    // Create a store, and then pass it (inject it) into your other packages via their constructors
    store  := sessions.NewCookieStore(key)
    ...
    ce, err := package.NewCodeEditor(store)
    ...
    pb, err := package.NewProjectBrowser(store)
    ...
}

๋น„ํ™œ๋™์œผ๋กœ ์ธํ•œ ํœด๊ด€์ž…๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰