前言

你有沒有想過,為什麼當你登入估狗、輸入帳號密碼之後過好幾天,你的登入紀錄都不會消失,此後好幾天都不用再輸入帳號密碼,估狗總是會記得我的登入狀態。為什麼能那麼神奇?

HTTP — Stateless Protocol

HTTP 連線本身是無狀態式協定 (stateless protocol),無狀態的意思就是指它有失憶症、過目即忘、下一秒就忘記剛上一秒做過什麼事。

你透過 HTTP 對某台伺服器發出請求,下一次你又再對他發出請求,他不記得你是誰、也不記得你曾對他發過請求,你跟他之間發生的一切他通通忘了。因為在使用 HTTP 溝通的過程中,伺服器或客戶端沒做「紀錄」這件事,沒人在記誰來過。 (但是有些傳輸協定會)

可是回到前面的問題:為什麼我昨天登過估狗,到今天還能保持登入?這就表示有人記得你曾登入過了 — 這個人就是伺服器。

「state」 是什麼?

你昨天登入時,伺服器在它筆記本裡記下了「你幾月幾號來過」這則訊息,然後又隨手撕一張便條、把這句話寫下來後拿給你說:「以後把這個拿給我看,我就知道你之前來過。」

過幾天你又來了,把紙條給他看,果真它就記得你 — 這一來一往的紙條、以及伺服器記在筆記本上的訊息 — 我們就叫做 state。

**state 就是協助保留對話內容的一組資料。**你輸入帳號密碼登入時,伺服器確認有這組帳號、密碼也正確,就會生成一個 session 在它的資料庫裡,session 本身是一個 Key-Value 對,Key 是一串人類看不懂的 id (E2sf8Ca77987Xyd 這種天書);Value 包含使用者資訊、登入日期、session 有效期等,可以含任何類型的資料。

伺服器會把 session-id (紙條)給你,通常是設定在你的 Cookie;session 則是留給自己 (寫在筆記本)。當你發送請求過來時,瀏覽器會讓你自帶 Cookie,伺服器就是靠這個辨別你的。

既然你登入的時候會生成 session,登出時伺服器自然會刪掉 session。以及過幾天這個 session 會過期 (我們不會讓一個 session 沒有有效期限,這不安全),到時伺服器會無效化這個 session,到時即使你 Cookie 還在,你還是得再重登入一次 (例如:Codepen 就這樣做) 。