์ด ํจํค์ง๋ฅผ ๋ฐฉ๊ธ ์ ๊ทธ๋ ์ด๋ํ๋๋ฐ ์ฟ ํค๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ์ค์ ๋์ง ์์์ต๋๋ค. ์ผ๋ฐ base64 ์ธ์ฝ๋ฉ ์ฟ ํค ๋ฐ์ดํฐ ๋์ _ga = GA1.1.922831813.14264788986๊ณผ ๊ฐ์ ํญ๋ชฉ์ ์ค์ ํ๊ณ ์์ต๋๋ค. ๋ฌด์จ ์ผ์ด ์ผ์ด๋๊ณ ์๋์ง ๋๋ ์ธ์ ๊ณ ์ฅ ๋ฌ๋์ง ์๊ธฐ ๋๋ฌธ์ ์๋ํ๋ ๋ฒ์ ์ผ๋ก ๋๋๋ฆด ์ ์์ต๋๊น? ๊ฐ์ฌ!
"_ga"์ฟ ํค๋ ๊ณ ๋ฆด๋ผ / ์ธ์
๊ณผ ๊ด๋ จ์ด ์์ต๋๋ค. Google Analytics์
๋๋ค.
์ฟ ํค.
๊ณ ๋ฆด๋ผ / ์ธ์
์ด ์ฟ ํค๋ฅผ ์ค์ ํ์ง ์๋ ๊ฒฝ์ฐ (์ค๋จ๋์ง ์์
๋ณ๊ฒฝ ์ฌํญ) ๊ด๋ จ ์ฝ๋์ ์ฟ ํค ์ฐฝ์ ์ถ๋ ฅ์ ๊ฒ์ ํ ์ ์์ต๋๊น?
๋ธ๋ผ์ฐ์ ์์? (๊ฒ์ฌ๊ธฐ> ๋ฆฌ์์ค> Chrome์ ์ฟ ํค)
2015 ๋
7 ์ 10 ์ผ ๊ธ์์ผ ์ค์ 7:12 marksalpeter [email protected]
์ผ๋ค:
์ด ํจํค์ง๋ฅผ ๋ฐฉ๊ธ ์ ๊ทธ๋ ์ด๋ํ๋๋ฐ ์ฟ ํค๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ์ค์ ๋์ง ์์์ต๋๋ค. ์ด๊ฒ์
์ผ๋ฐ ๋์ _ga = GA1.1.922831813.14264788986๊ณผ ๊ฐ์ ์ค์
base64๋ก ์ธ์ฝ๋ฉ ๋ ์ฟ ํค ๋ฐ์ดํฐ. ๋ฌด์จ ์ผ์ด ์ผ์ด๋๊ณ ์๋์ง ๋๋ ์ด๊ฒ์ด ์ธ์ ๊ทธ๋ ๊ฒ ๊นจ ์ก๋์ง ์ ์ ์์ต๋๋ค.
์๋ํ๋ ๋ฒ์ ์ผ๋ก ๋๋๋ฆด ์ ์์ต๋๊น? ๊ฐ์ฌ!โ
์ด ์ด๋ฉ์ผ์ ์ง์ ๋ต์ฅํ๊ฑฐ๋ GitHub์์ ํ์ธํ์ธ์.
https://github.com/gorilla/sessions/issues/48.
์๋ ํ์ธ์ Matt,
Mark์ ํจ๊ป ํ๋ก์ ํธ๋ฅผ ์งํ ์ค์ด๋ฉฐ ์์ธํ ๋ด์ฉ์ ์๋ ค ๋๋ฆด ์ ์์ต๋๋ค. ๊ทธ๋์ ์๋ ๋ฌธ์ ๋ MaxAge๋ฅผ ๋งค์ฐ ๋ง์ ์๋ก ์ค์ ํ๋๋ผ๋ 30 ์ผ ํ์ ๋ง๋ฃ๋๋ ์ฟ ํค์ ๋ํ ๋ฌธ์ ์๊ธฐ ๋๋ฌธ์ ๋ฐฉ๊ธ ํจํค์ง๋ฅผ ์ ๋ฐ์ดํธํ์ต๋๋ค. ๋ค์์ ํ์ฌ ์ฌ์ฉ ์ค์ด๋ฉฐ ๋ฌธ์ ๋ฅผ ์ผ์ผํค๋ ์ธ์ฆ ์ฝ๋์ ๋๋ค.
const (
AUTH_SESSION_NAME = "์ธ์ฆ ์ธ์
"
)
var (
config = jconfig.LoadConfig (global.CONFIG () + "securecookie.json")
authKey = [] byte (config.GetString ( "authorization_key"))
encryptionKey = [] byte (config.GetString ( "encryption_key"))
์ธ์
= sessions.NewCookieStore (authKey, encryptionKey)
)
func init () {
apiRouter.HandleFunc("/auth/" , Authenticate )
apiRouter.HandleFunc("/deauth/" , Deauthenticate )
apiRouter.HandleFunc("/reauth/" , ReAuthenticate )
// register complex data types for saving in sessions
gob.Register(&models.Device{})
gob.Register(&models.Manager{})
gob.Register(&models.SalesRep{})
// modify the options of the session store so that the auth cookie never expires (this is set so it expires in 200 years...)
session.Options.MaxAge = 6307200000
}
//์ด ํธ๋ค๋ฌ๋ ์ฅ์น ๋ฐ ๊ด๋ฆฌ์๋ฅผ ์ํด ์์คํ
์์ ๊ถํ์ ๋ถ์ฌํฉ๋๋ค.
// ์์ฒญ์๊ฐ ์ด๋ฏธ ์ธ์ฆ ๋ ๊ฒฝ์ฐ ํด๋น ์ ๋ณด๋ฅผ ํ์ํฉ๋๋ค. defferent๋ฅผ ์ธ์ฆํ๋ ค๋ฉด
// ๊ณ์ , ๋จผ์ ํด๋ผ์ด์ธํธ๊ฐ ์ธ์ฆ์ ํด์ ํด์ผํฉ๋๋ค.
//
// ๋งค๊ฐ ๋ณ์
// ์ฌ์ฉ์:
//
// ์ฐธ๊ณ :์ด ์ธ์ฆ ํจ์์์ ๋ฐํ ๋ ๋ฐ์ดํฐ๋ ์ ํํจ ๋ง ๋ณด์ฅ๋ฉ๋๋ค.
// ์ฌ์ฉ์๊ฐ ์ฒ์ ์ธ์ฆ ํ ๋. ๊ทธ๋ ์ง ์์ผ๋ฉด ์ธ์
์ ์บ์ ๋ ๋ฐ์ดํฐ๋ฅผ ํ์ํฉ๋๋ค.
//
func Authenticate (response http.ResponseWriter, request * http.Request) {
log.Println("Authenticate")
// open the session
auth_session, err := session.Get(request, AUTH_SESSION_NAME)
if err != nil {
log.Println("there was an error retreiving the session:", err)
InternalServerError(response, request)
return
}
// already authroized as a manager
if manager, ok := auth_session.Values["manager"].(*models.Manager); ok {
log.Printf("already logged in as manager %d", manager.Id)
Success(response, request, manager)
// already authrorized as a device
} else if device, ok := auth_session.Values["device"].(*models.Device); ok {
log.Printf("already logged in as device %d", device.Id)
Success(response, request, device)
// attempt to gain authroization
} else {
fp := parsers.FormParser(request)
// login as a manager
if username, password := fp.GetString("user", ""), fp.GetString("pass", ""); username != "" && password != "" {
db := database.Open()
defer db.Close()
if manager := db.LoginAsManager(username, password); manager != nil {
auth_session.Values["manager"] = manager
// manager session error
if err := auth_session.Save(request, response); err != nil {
log.Printf("manager could not save session %s !\n", err.Error())
InternalServerError(response, request)
// manager login in success
} else {
log.Printf("logged in as manager %d !\n", manager.Id)
Success(response, request, manager)
}
// manager login failed
} else {
log.Printf("manager credentials not valid!")
Unauthroized(response, request)
}
// login as a salesrep
} else if username, password := fp.GetString("username", ""), fp.GetString("password", ""); username != "" && password != "" {
db := database.Open()
defer db.Close()
if sales_rep_id := db.LoginAsSalesRep(username, password); sales_rep_id > 0 {
sales_reps := db.GetSalesRep(&models.SalesRep{ Id: sales_rep_id });
auth_session.Values["sales_rep"] = sales_reps[0];
// sales rep session error
if err := auth_session.Save(request, response); err != nil {
log.Printf("sales rep could not save session %s !\n", err.Error())
InternalServerError(response, request)
// sales rep login in success
} else {
log.Printf("logged in as sales rep %d !\n", manager.Id)
Success(response, request, manager)
}
// sales rep login failed
} else {
log.Printf("sales rep credentials not valid!")
Unauthroized(response, request)
}
// login as a device
} else if pin_code := fp.GetInt32("PinCode", -1); pin_code > 0 {
db := database.Open()
defer db.Close()
if devices := db.GetDevice(&models.Device{ PinCode:pin_code }, nil); len(devices) > 0 {
auth_session.Values["device"] = &devices[0]
// device session error
if err := auth_session.Save(request, response); err != nil {
log.Printf("device could not save session %s !\n", err.Error())
InternalServerError(response, request)
// device login in success
} else {
log.Printf("logged in as device %d !\n", devices[0].Id)
Success(response, request, devices[0])
}
// device login failed
} else {
log.Printf("device credentials not valid!")
Unauthroized(response, request)
}
// no valid credentials were provided
} else {
log.Println("no valid deivce or manager credentials")
BadRequest(response, request)
}
}
}
๊ทธ๋ฆฌ๊ณ ์ด๊ฒ์ ์ฐ๋ฆฌ๊ฐ 30 ์ผ ํ์ ๋ก๊ทธ์์ ์ป๋ ๊ฒ์ ๋๋ค.
์ฅ์น ์ฟ ํค : authentication-session = _KaJDVq4lIdQgeHiHcnSMw1IEPDyg3-9XEIBBPxw ==; ๊ฒฝ๋ก = /; Expires = ์์์ผ, 2215 ๋ 5 ์ 15 ์ผ 20:47:49 UTC; ์ต๋ ์ฐ๋ น = 6307200000
2015/07/10 15:56:04 /routers/api/Auth.go:70 : securecookie : ๋ง๋ฃ ๋ ํ์ ์คํฌํ
์ฟ ํค๋ MaxAge ์ค์ ์ ๊ด๊ณ์์ด 30 ์ผ ํ์ ๋ชจ๋ ๋ง๋ฃ๋๋ ๊ฒ ๊ฐ์ต๋๋ค. ์ฐ๋ฆฌ์๊ฒ ํฐ ๋์์ด ๋์ญ์์ค. ๊ฐ์ฌํฉ๋๋ค!
์ข์, ๋๋ ์ ์ฒด ์์ ์์ MaxAge
๋ฅผ 2 ๊ฐ์ (86400 * 60)๋ก ์ค์ ํ๋ ์ต์ํ์ ๋ฐ๋ชจ ํ๋ก๊ทธ๋จ์ ๋ชจ์ํ๋ค.
package main
import (
"fmt"
"log"
"net/http"
"github.com/gorilla/sessions"
)
var store = sessions.NewCookieStore([]byte("some-appropriately-auth-key"))
func SomeHandler(w http.ResponseWriter, r *http.Request) {
session, err := store.Get(r, "example")
if err != nil {
http.Error(w, "No good!", 500)
return
}
session.Values["gorilla"] = "sessions!"
err = session.Save(r, w)
if err != nil {
http.Error(w, "No good!", 500)
return
}
fmt.Fprintf(w, "%v", session.Values["gorilla"])
}
func main() {
store.Options = &sessions.Options{
MaxAge: 86400 * 60, // 2 months
}
http.HandleFunc("/", SomeHandler)
log.Fatal(http.ListenAndServe(":8002", nil))
}
์ด๊ฒ์ ๋ด๊ฐ ์์ํ๋ ๋ง๋ฃ ์๊ฐ์ ์ ๊ณตํฉ๋๋ค.
์ผ์ญ์ผ์ผ๋ ๋์๊ฒ ๊ทธ๋ฌผ ~ ์๋์ผ๋ก ์์ผ๋ก ๋ด ์๊ณ๋ฅผ ์ค์ expired timestamp
์์ ์ค๋ฅ๋ฅผ securecookie
์ค๋ฅ๊ฐ -.
๋ธ๋ผ์ฐ์ ์์ ์ฟ ํค๋ฅผ ์ง์ฐ๊ณ ์๊ณ๋ฅผ now ()๋ก ๋ค์ ์ค์ ํ ๋ค์ ๋ค์์ ํตํด ๊ธฐ๋ณธ *securecookie.SecureCookie
MaxAge
์ ๊ฐ์ ์คํํฉ๋๋ค.
store.Options = &sessions.Options{
MaxAge: 86400 * 60, // 2 months
}
for _, s := range store.Codecs {
if cookie, ok := s.(*securecookie.SecureCookie); ok {
cookie.MaxAge(86400 * 90)
}
}
๊ฐ ์ฝ๋ฑ์ maxAge
ํ๋๊ฐ http.Cookie
์์ฑํ ๋ ๋ธ๋ผ์ฐ์ ์ ํ์๋๋ ๋ด์ฉ์ ์ํฅ์์ฃผ์ง ์๊ธฐ ๋๋ฌธ์ ์์ผ๋ก +2 ๊ฐ์ ๋ง๋ฃ๋๋ ๋ธ๋ผ์ฐ์ ์ฟ ํค๋ฅผ ์ ๊ณตํฉ๋๋ค. ๊ทธ๋ฌ๋ ์๊ณ๋ฅผ +33 ์ผ๋ก ์ค์ ํ๋ฉด ๋ง๋ฃ ๋ ํ์ ์คํฌํ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ง ์์ต๋๋ค.
๊ทธ๋์ ๋ช ๊ฐ์ง ํ๊ณ ๋ค์์ต๋๋ค.
CodecsFromPairs
๋ฅผ ํธ์ถํ๋ฉด ๊ฐ *securecookie.SecureCookie
(์ฝ๋ฑ ์ฌ๋ผ์ด์ค์ ์ผ๋ถ) ๋ด s.MaxAge
๊ฐ securecookie์ ๊ธฐ๋ณธ๊ฐ ์ธ 86400 * 30
๋ฉ๋๋ค.sessions.CookieStore.Codecs
์ด๊ณผํ๊ณ ๊ฐ ๋ณด์ ์ฟ ํค ์ธ์คํด์ค์ MaxAge๋ฅผ ์ค์ ํ๋ฉด์ด๋ฅผ ์ฐํํฉ๋๋ค.TL; DR : ๊ทผ๋ณธ ์์ธ์ ๋ธ๋ผ์ฐ์ ์ ์์ฑ๋ http.Cookie
๊ฐ ์ต์
์์ ์ค์ ํ ํ์ ์คํฌํ๋ฅผ ๊ฐ์ ธ ์ค์ง๋ง ๊ธฐ๋ณธ ๋ณด์ ์ฟ ํค ์ธ์คํด์ค์ ๋ํ HMAC๋ date | value | mac-์ฌ๊ธฐ์ date๋ ์ต์
์ด ์์ ํ์ง ์๋ _default_ MaxAge. ์ดํ 30 ์ผ ์ด์์ด๋๋ฉด HMAC ์ ํจ์ฑ ๊ฒ์ฌ๊ฐ ์คํจํฉ๋๋ค.
์์ ์ฌํญ์ sessions.NewCookieStore
๊ฐ ์์ฑํ๋ ์ฝ๋ฑ์ ๋ํด ๋ฒ์๋ฅผ ์ง์ ํ๊ณ Options.MaxAge๋ฅผ ๊ฐ *securecookie.SecureCookie
์ธ์คํด์ค์ ์ ์ฉํ์ฌ ์ฟ ํค ๋ง๋ฃ์ HMAC ํ์ ์คํฌํ ์ ํจ์ฑ ๊ฒ์ฌ ๊ฐ์ ๋ถ์ผ์น๋ฅผ ์์ ํ ์ ์๋๋กํฉ๋๋ค.
cc / @kisielk ๋ฅผ ์ฌ์ฉํ์ฌ ์์ ์ฌํญ์ ํธ์ํ๊ธฐ ์ ์ ๊ฒฐ๊ณผ๋ฅผ ํ์ธํฉ๋๋ค.
์ถ์ : ์ด๊ฒ๊ณผ ๊ด๊ณ์์ด ํ๋ก๊ทธ๋จ์์ ๋จ์ผ DB ํ์ ์ฌ๋ ๊ฒ์ด ์ข์ต๋๋ค. ์ ์ญ์ ํตํ๊ฑฐ๋ ํฌ์ธํฐ๋ฅผ ๋ช
์ ์ ์ผ๋ก ์ ๋ฌํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ์์ฒญ๋ณ๋ก ํ์ ์ด๊ณ ๋ซ์ผ๋ฉด ์ฑ๋ฅ์ด ์ ํ๋ฉ๋๋ค. *sql.DB
์ ๋์ ์ก์ธ์ค์ ์์ ํฉ๋๋ค.
์ด๋ ๋ํ ๋๋ถ๋ถ์ ์คํ ์ด ๊ตฌํ์ ์ํฅ์ ๋ฏธ์นฉ๋๋ค. ๋ชจ๋ ๋ฐฑ์๋ ์คํ ์ด์ ID๋ฅผ ์ ์ฅํ๊ธฐ ์ํด ๋ณด์ ์ฟ ํค๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
redistore
์ ์๋์ผ๋ก SetMaxAge
ํธ์ถํ๋ ๊ฒฝ์ฐ ์ฌ๋ฐ๋ฅธ ๊ตฌํ์ ์ ๋ฐ์ด์ง๋ง ๊ธฐ๋ณธ ์ฌ๋ก์ ์ง์ ์ ์ฉํ์ง ์์ต๋๋ค. ๊ธฐ๋ณธ๊ฐ (30 ์ผ)์ ๋ณด์ ์ฟ ํค์ ๋์ผํฉ๋๋ค.
๊ฐ๋ตํ ์ดํด๋ณด๋ฉด _all_ ๋ค๋ฅธ ์์ ์ด ์ํฅ์๋ฐ๋ ๊ฒ์ผ๋ก ๋ณด์ ๋๋ค. Options ๊ตฌ์กฐ์ฒด๋ฅผ ํตํ MaxAge ์ค์ ์ CodecsFromPairs์์ ์์ฑ ๋ ๊ธฐ๋ณธ ๋ณด์ ์ฟ ํค ์ธ์คํด์ค์ ์ ์ฉ๋์ง ์์ต๋๋ค. ๋๋ถ๋ถ์ ์ฌ์ฉ์๋ ๋ณด์ ์ฟ ํค๊ฐ HMAC์ ์์ ์ ์ผ๋ก ํฌํจ ๋ ๊ฒ๋ณด๋ค ๋ง๋ฃ ๋ ์ง๋ฅผ _less_ ์ค์ ํ๋ค๊ณ ์๊ฐํ๋ฏ๋ก ๋๋ถ๋ถ์ ์ต์ข ์ฌ์ฉ์๋์ด ๋ฒ๊ทธ๋ฅผ ๊ฒช์ง ์์์ ๊ฒ์ ๋๋ค.
FWIW : ๋ํ "๋จผ ๋ฏธ๋"์ฟ ํค ๋ง๋ฃ๋ ํน๋ณํ ํ์ํ ๊ฒฝ์ฐ๊ฐ ์๋๋ฉด ์ข์ง ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
๋ํ ํ์ฌ ๊ตฌํ์์ ํ์ฌ ํ์ ์คํฌํ๊ฐ ์์ ํ ์ํธํ๋์ง ์์ ์์ ์ง์ ํ๊ณ ์ถ์ต๋๋ค. ์ด๋ก ์ ์ผ๋ก๋ base64๋ก ์ฟ ํค๋ฅผ ๋์ฝ๋ฉํ๊ณ ํ์ ์คํฌํ๋ฅผ ํ์ฌ ๋ ์ง๋ก ๋ณ๊ฒฝํ๊ณ base64๋ก ์ฟ ํค๋ฅผ ์ธ์ฝ๋ฉํ๋ฉด options.MaxAge ๋ฌธ์ ๋ฅผ ์์ ํ๋๋ผ๋ MaxAge ์์ฑ์ ์ ํ ๋ฌธ์ ๊ฐ๋์ง ์์ต๋๋ค.
๋ค, "๋จผ ๋ฏธ๋"์ฟ ํค๋ ๋จ์ง ํ ์คํธ ์ฉ์ด์์ต๋๋ค. ์ด์ ํ๋ก๋์ ์๋ฒ์์ MaxAge๋ฅผ 0์ผ๋ก ์ค์ ํ์ต๋๋ค. ์ฐ๋ฆฌ๋ ์ฃผ๋ง ๋์ ๋ฌธ์ ๋ฅผ ๋ฐ๊ฒฌํ๊ณ ๋น์ทํ ์์ ์ ์์ฑํ์ง๋ง ๊ทํ์ ๊ฒ๋ณด๋ค ์ฝ๊ฐ ๋ ๊ฐ๊ฒฐํ์ต๋๋ค.
๋ฌธ์ ๋ฅผ ์กฐ์ฌํด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค!
@wbaron- ๋ฌธ์ ์์ต๋๋ค. ๊ณง ์
์คํธ๋ฆผ ํจํค์ง์์ ์์ ๋ ์์ ์ด๋ฉฐ
ํ ๋ฒ ์๋ฃ๋๋ฉด ํ์ํ์ฌ ์์ ์ ํฌํฌ๋ฅผ ์ ์งํ ํ์๊ฐ ์์ต๋๋ค.
์ํ์ง ์์).
@marksalpeter- ์ด๋๋ฅผ ์ง์ ํ ์ ์์ต๋๊น? ๋ณด์ ์ฟ ํค MAC
๋ฌธ์์ด ํํ์ ์ํด base64๋ก ์ธ์ฝ๋ฉํ๊ธฐ ์ ์ name | date | value. ๋ง์ฝ
ํด๋ผ์ด์ธํธ ์ธก์์ ๋์ฝ๋ฉํ๋ฉด ํ์ ์คํฌํ๋ฅผ ์์ ํ ์ ์์ต๋๋ค.
MAC'edโ ์ค์ ๋ก ๋ณ๊ฒฝํ ์์๋ ๊ฒ์ ์์ต๋๋ค.)
MAC์ด ์คํจํ๊ธฐ ๋๋ฌธ์ ์ฟ ํค๋ ๋์ฝ๋ฉ (์์ฒญ)์์ ์ ํจ์ฑ ๊ฒ์ฌ์ ์คํจํด์ผํฉ๋๋ค.
ํด์ / ์ธ์ฆ ํค์ ๋ํด ์ฌ๋ฐ๋ฅด๊ฒ ๋์ฝ๋ฉํฉ๋๋ค. ์ฐธ๊ณ :
https://github.com/gorilla/securecookie/blob/master/securecookie.go#L185 -L191
2015 ๋ 7 ์ 14 ์ผ ํ์์ผ ์คํ 10:40 wbaron [email protected] ์ ๋ค์๊ณผ ๊ฐ์ด ์ผ์ต๋๋ค.
๋ค, "๋จผ ๋ฏธ๋"์ฟ ํค๋ ํ ์คํธ ์ฉ์ด์๊ณ MaxAge๋
์ด์ ํ๋ก๋์ ์๋ฒ์์ 0์ ๋๋ค. ์ฃผ๋ง ๋์ ๋ฌธ์ ๋ฅผ ๋ฐ๊ฒฌํ๊ณ
์ฝ๊ฐ ๋ ๊ฐ๊ฒฐํ๊ฒ ๋น์ ๊ณผ ๋น์ทํ ์์ ์ ์ผ์ต๋๋ค.๋ฌธ์ ๋ฅผ ์กฐ์ฌํด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค!
โ
์ด ์ด๋ฉ์ผ์ ์ง์ ๋ต์ฅํ๊ฑฐ๋ GitHub์์ ํ์ธํ์ธ์.
https://github.com/gorilla/sessions/issues/48#issuecomment -121257995.
@elithrar ๋ด ์ค์. ์ฟ ํค๋ฅผ ๋์ฝ๋ฉ ํ ๋ [ํ์ ์คํฌํ] | [MAC ์ ๋ณด]๋ฅผ ์ป์ต๋๋ค. ์ต๋ ์ ๋ณด ์ด์ ์ ํ์ ์คํฌํ๊ฐ ์ฌ์ฉ์ค์ธ ๊ฒ์ด๋ผ๊ณ ๊ฐ์ ํ์ต๋๋ค.
@elithrar ๋น์ ์ด ์ ์ํ๋ ๊ฒ์ ๋์๊ฒ ์ข์ ์๋ฆฌ์ ๋๋ค. ๋ชจ๋ ๋งค์ฅ์ ๊ฐ๋ณ์ ์ผ๋ก ์ ์ฉํด์ผํ๋ค๋ ์ ์ด ์์ฝ์ต๋๋ค.
@kisielk- ๋ถ๋ช
ํ ๋ถ๋๋ฌ์ด ์ผ์
๋๋ค. ์ 3์๋ฅผ ๋ง์ง๋ ๊ฒ์ ํผํ๊ณ ์ถ์์ต๋๋ค.
์ 3 ์ ๋งค์ฅ์ ํจ๊ณผ์ ์ผ๋ก ๊ฒฐํฉ ํ ์์๋ ๊นจ๋ํ ๋ฐฉ๋ฒ์ด ์์์ต๋๋ค.
๋ณด์ ์ฟ ํค์์ s.MaxAge ๋ฉ์๋๊ฐ์๋ Options.MaxAge ํ๋.
๋ณด์ ์ฟ ํค์์ func CodecMaxAge(codecs []Codec, age int)
[]Codec
ํจ์๋ฅผ ์ ๊ณตํ๋ ๊ฒ์ ๊ณ ๋ คํ๊ณ ์์ต๋๋ค (๋จ์ :
์ธํฐํ์ด์ค + ๊ณต์ฉ API์ ์ถ๊ฐ) ๋ด๋ถ์ ์ผ๋ก ์ ํ์ ์ํํฉ๋๋ค.
assertion + ๊ฐ ์ฝ๋ฑ์์ s.MaxAge (age)๋ฅผ ํธ์ถํฉ๋๋ค. ์ด๊ฒ์ ์ค๋ณต์ ์ ์งํฉ๋๋ค (๋ฃจํ
์ฌ๋ผ์ด์ค, ์ฟ ํค ์ ํ์ ์ด์ค ์
์
๋ ฅ) ํ์ฌ ์ ์ฅ์์ ์ฝ๋
NewXXXXStore
ํจ์์์ securecookie.CodecMaxAge(mystore.Codecs,
mystore.opts.MaxAge)
๋ฅผ ํธ์ถํ์ฌ
๊ธฐ๋ณธ s.maxAge ํ๋.
๋ ๋์ ์์ด๋์ด์ ๊ฐ๋ฐฉ์ ์ด์ง๋ง ์ด๊ฒ์ด ๊ฐ์ฅ ๊ฐ๋จํ ๊ฒ ๊ฐ์ต๋๋ค.
2015 ๋
7 ์ 17 ์ผ ๊ธ์์ผ ์ค์ 8์ 3 ๋ถ Kamil Kisiel [email protected]
์ผ๋ค:
@elithrar https://github.com/elithrar ๋น์ ์ด ์ ์ํ๋ ๊ฒ์ ์ข์ ์๋ฆฌ์ ๋๋ค
๋๋ฅผ. ๋ชจ๋ ๋งค์ฅ์ ๊ฐ๋ณ์ ์ผ๋ก ์ ์ฉํด์ผํ๋ค๋ ์ ์ด ์์ฝ์ต๋๋ค.โ
์ด ์ด๋ฉ์ผ์ ์ง์ ๋ต์ฅํ๊ฑฐ๋ GitHub์์ ํ์ธํ์ธ์.
https://github.com/gorilla/sessions/issues/48#issuecomment -122133977.
๋ค ๊ด์ฐฎ์ ๊ฒ ๊ฐ์์. ์ฌ๊ธฐ์ ๊ฑฐ์ค๋ฆ๋์ ๋ฃ์ผ๋ฉด ์ฌ์ฉํ๊ธฐ ์ํด ๋ค๋ฅธ ์์ ์ PR์ ๋ณด๋ผ ๊ฒ์ ๋๋ค.
์ถ์ ๋ชฉ์ :
PR์ด ๋ณํฉ๋๋ฉด์ด๋ฅผ ์ถ์ ํ๊ฒ ์ต๋๋ค.
์ด ๋ฌธ์ ๋ ์ต๊ทผ ์ ๋ฐ์ดํธ๋ฅผ ๋ณด์ง ๋ชปํ๊ธฐ ๋๋ฌธ์ ์๋์ผ๋ก ์ค๋๋ ๊ฒ์ผ๋ก ํ์๋์์ต๋๋ค. ๋ฉฐ์น ํ ์๋์ผ๋ก ๋ซํ๋๋ค.
๋ค๋ฅธ ํจํค์ง์์ ์คํ ํ ํ์ด ๋ฌธ์ ๋ฅผ ์ดํด๋ณด๋ฉด ๋ซ์์ผ ํ ๊ฒ ๊ฐ์ง ์์ต๋๋ค ... ์ฒดํฌ๋ฆฌ์คํธ ๋ ํด๋น ์ ๋ณด๊ฐ ์ต์ ์ด ์๋ ๊ฒฝ์ฐ๋ฅผ ์ ์ธํ๊ณ ๋ ์ฌ์ ํ 10 ๋ฒ์ ํ์ธ์ด ํ์ํฉ๋๋ค.
์ ํํด์ผํ์ง๋ง ๋ชจ๋ ์์ ์ด ์ ๊ทน์ ์ผ๋ก ์ ์ง ๊ด๋ฆฌ๋๊ฑฐ๋ PR์ด ์ ์ถ ๋ ๊ฒ์ ์๋๋๋ค.
์ด ๋ฌธ์ ๋ ์ต๊ทผ ์ ๋ฐ์ดํธ๋ฅผ ๋ณด์ง ๋ชปํ๊ธฐ ๋๋ฌธ์ ์๋์ผ๋ก ์ค๋๋ ๊ฒ์ผ๋ก ํ์๋์์ต๋๋ค. ๋ฉฐ์น ํ ์๋์ผ๋ก ๋ซํ๋๋ค.
์ด ๋ฌธ์ ๋ ์ต๊ทผ ์ ๋ฐ์ดํธ๋ฅผ ๋ณด์ง ๋ชปํ๊ธฐ ๋๋ฌธ์ ์๋์ผ๋ก ์ค๋๋ ๊ฒ์ผ๋ก ํ์๋์์ต๋๋ค. ๋ฉฐ์น ํ ์๋์ผ๋ก ๋ซํ๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์ด๋ ๋ํ ๋๋ถ๋ถ์ ์คํ ์ด ๊ตฌํ์ ์ํฅ์ ๋ฏธ์นฉ๋๋ค. ๋ชจ๋ ๋ฐฑ์๋ ์คํ ์ด์ ID๋ฅผ ์ ์ฅํ๊ธฐ ์ํด ๋ณด์ ์ฟ ํค๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
redistore
์ ์๋์ผ๋กSetMaxAge
ํธ์ถํ๋ ๊ฒฝ์ฐ ์ฌ๋ฐ๋ฅธ ๊ตฌํ์ ์ ๋ฐ์ด์ง๋ง ๊ธฐ๋ณธ ์ฌ๋ก์ ์ง์ ์ ์ฉํ์ง ์์ต๋๋ค. ๊ธฐ๋ณธ๊ฐ (30 ์ผ)์ ๋ณด์ ์ฟ ํค์ ๋์ผํฉ๋๋ค.๊ฐ๋ตํ ์ดํด๋ณด๋ฉด _all_ ๋ค๋ฅธ ์์ ์ด ์ํฅ์๋ฐ๋ ๊ฒ์ผ๋ก ๋ณด์ ๋๋ค. Options ๊ตฌ์กฐ์ฒด๋ฅผ ํตํ MaxAge ์ค์ ์ CodecsFromPairs์์ ์์ฑ ๋ ๊ธฐ๋ณธ ๋ณด์ ์ฟ ํค ์ธ์คํด์ค์ ์ ์ฉ๋์ง ์์ต๋๋ค. ๋๋ถ๋ถ์ ์ฌ์ฉ์๋ ๋ณด์ ์ฟ ํค๊ฐ HMAC์ ์์ ์ ์ผ๋ก ํฌํจ ๋ ๊ฒ๋ณด๋ค ๋ง๋ฃ ๋ ์ง๋ฅผ _less_ ์ค์ ํ๋ค๊ณ ์๊ฐํ๋ฏ๋ก ๋๋ถ๋ถ์ ์ต์ข ์ฌ์ฉ์๋์ด ๋ฒ๊ทธ๋ฅผ ๊ฒช์ง ์์์ ๊ฒ์ ๋๋ค.
FWIW : ๋ํ "๋จผ ๋ฏธ๋"์ฟ ํค ๋ง๋ฃ๋ ํน๋ณํ ํ์ํ ๊ฒฝ์ฐ๊ฐ ์๋๋ฉด ์ข์ง ์๋ค๊ณ ์๊ฐํฉ๋๋ค.