Cookie Session
Cookie
- 什麽是cookie?
MDN是這樣說的:HTTP Cookie(也叫Web cookie或者瀏覽器Cookie)是服務器發送到用戶瀏覽器並保存在瀏覽器上的一塊數據,它會在瀏覽器下一次發起請求時被攜帶並發送到服務器上。
- 設置cookie
- 服務器通過在響應頭裏添加一個 Set-Cookie的字符串創造cookie,其格式如下(中括號中的部分是可選的):
Set-Cookie: value[; expires=date][; domain=domain][; path=path][; secure]
註意:value部分通常是name=value 格式的字符串,這一項必須填。
- 當瀏覽器在收到的響應報文看到含有Set-Cookie這個字段以後,這個cookie值就會在隨後的每次請求中被發送至服務器,cookie值被存儲在名為 Cookie 的 HTTP 請求頭中,並且只包含了 cookie 的值,忽略全部設置選項。例如:
Cookie: value
註意:這裏只有value會發給服務器,在Set-cookie裏的可選設置選項只會在瀏覽器端使用,不會發回給服務器。如果有多個value,可以用逗號隔開,例如:
Cookie: value1; value2; name1=value1
- expires
expires指定Cookie的有效期,它的選項的值是一個 GMT 日期格式的值,例如:
Set-Cookie: name=chiang; expires=Tue, 20 Jun 2017 07:17:37 GMT
如果我們沒有設置expires屬性,cookie 的生命周期僅限於當前會話中,關閉瀏覽器意味著這次會話的結束,所以會話 cookie 僅存在於瀏覽器打開狀態之下。如果expires屬性的值是一個過去的時間,那麽cookie將會被瀏覽器立即刪除。
- domain
指定了 cookie 將要被發送至哪個或哪些域中。默認情況下,domain 會被設置為創建該 cookie 的頁面所在的域名,
domin屬性將指定作為Cookie適用對象的域名,即cookie將會被發送至哪個或者哪些域名中。默認為為創建Cookie的頁面所在域名。
domain屬性可以擴充 cookie 可發送域的數量,例如
Set-Cookie: name=fang; domain=fang.com
這裏我們把domain設置為chiang.com,那麽如果我們從a.fang.com、b.fang.com發送請求,就可以將該 cookie 的值發送至所有這些站點。因為瀏覽器會把 domain 的值與請求的域名做一個尾部比較(即從字符串的尾部開始比較),並將匹配的 cookie 發送至服務器。
註意:domain值必須是發送 Set-Cookie 消息頭的主機名的一部分,因為這會產生安全問題。不合法的 domain 選擇將直接被忽略。
- path
path屬性指定了請求的資源 URL 中必須存在指定的路徑時才會發送Cookie 消息頭。默認為當前發送Set-cookie請求所對應URL的path部分。
Set-Cookie:name=chiang;path=/blog
在這個例子中,path 選項值會與 /blog,/blogxxx 等等相匹配;任何以 /blog 開頭的選項都是合法的。
註意:只有在 domain 匹配完畢之後才會對 path 屬性進行比較。
- source
source屬性只是一個標記而沒有值。只有當一個請求通過 SSL 或 HTTPS 創建時,包含 secure 選項的 cookie 才能被發送至服務器。
Set-Cookie:name=fang;path=/blog
默認情況下,在 HTTPS 鏈接上傳輸的 cookie 都會被自動添加上 secure 選項。
- cookie 自動刪除
cookie 會被瀏覽器自動刪除的情況:
- 會話 cookie (Session cookie) 在會話結束時(瀏覽器關閉)會被刪除
- 持久化 cookie(Persistent cookie)在到達失效日期時會被刪除
- 如果瀏覽器中的 cookie 數量達到限制,那麽 cookie 會被刪除以為新建的 cookie 創建空間。
-HTTP-Only cookies
HTTP-Only 的意思是告訴瀏覽器這個 cookie 絕不能通過 JavaScript 的 document.cookie
屬性訪問。這個屬性是為了幫助阻止通過 JavaScript 發起的跨站腳本攻擊 (XSS) 竊取 cookie 的行為。
要創建一個 HTTP-Only cookie,只要在 cookie 中添加一個 HTTP-Only 標記即可:
Set-Cookie: name=fang; HttpOnly
Session
- 什麽是session
維基百科關於session的解釋:
在計算機科學領域來說,尤其是在網絡領域,會話(session)是一種持久網絡協議,在用戶(或用戶代理)端和服務器端之間創建關聯,從而起到交換數據包的作用機制,session在網絡協議(例如telnet或FTP)中是非常重要的部分。
- 通過cookie來管理session
由於HTTP是無狀態協議,也就以為著它無法實現狀態管理,例如登陸認證成功的用戶狀態無法在協議層面保存下來。當該用戶下一次繼續訪問就無法區分他與其他的用戶。於是我們使用Cookie 來管理Session,以彌補HTTP 協議中不存在的狀態管理功能。
步驟:
- 客戶端把用戶ID和密碼等登錄信息通過請求報文發送給服務器
- 服務器收到請求後,給該用戶標記Session ID,記錄其認證狀態。然後將這個Session ID寫入響應頭的Set-cookie。
- 客戶端在接收到從服務器端發來的Session ID 後,會將其作為Cookie 保存在本地。下次向服務器發送同樣的請求時,瀏覽器會自動發送帶有Session ID的Cookie,服務器端可通過驗證接收到的Session ID 識別用戶和其認證狀態。
以上是一個登錄認證的session示例,通過這個例子我們可以了解session的基本原理,其實session可以理解為是服務器對cookie的一個映射。
Cookie Session