gorilla/sessions๋ฅผ ์ฌ์ฉํ์ฌ ์๋ฒ ๊ฐ ์ธ์ ์ ๋ง๋ค ์ ์์ต๋๊น? ํ๋์ ์น ์ฌ์ดํธ๋ฅผ ์ ๊ณตํ๊ธฐ ์ํด ์ฌ๋ฌ ์๋ฒ๊ฐ ์๋ค๊ณ ๊ฐ์ ํฉ๋๋ค. ์ฌ์ฉ์๊ฐ ํ ์๋ฒ์ ๋ก๊ทธ์ธํ๋ฉด ๋ค๋ฅธ ์๋ฒ์๋ ๋ก๊ทธ์ธํ ๊ฒ์ผ๋ก ์์ํฉ๋๋ค.
@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
.
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)
...
}
๋นํ๋์ผ๋ก ์ธํ ํด๊ด์ ๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
@CasperHK ๊ธฐ๋ณธ์ ์ผ๋ก ์ฟ ํค๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๋๋ค. ์๋ฒ๊ฐ ๋ชจ๋ ๋์ผํ ๋๋ฉ์ธ(์: github.com ๋๋ *.github.com)์ ์ผ๋ถ์ธ ๊ฒฝ์ฐ ๋ธ๋ผ์ฐ์ ์์ ์ฟ ํค๋ฅผ ์ ์กํฉ๋๋ค.
๋๋ ์ธ์ ์ ์๋ฒ ์ธก ์ ์ฅ์ ๋