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=chiang; domain=chiang.com
這里我們把domain設置為chiang.com,那么如果我們從a.chiang.com、b.chiang.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=chiang;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=chiang; HttpOnly
Session
- 什么是session
維基百科關于session的解釋:
在計算機科學領域來說,尤其是在網絡領域,會話(session)是一種持久網絡協議,在用戶(或用戶代理)端和服務器端之間創建關聯,從而起到交換數據包的作用機制,session在網絡協議(例如telnet或FTP)中是非常重要的部分。
- 通過cookie來管理session
由于HTTP是無狀態協議,也就以為著它無法實現狀態管理,例如登陸認證成功的用戶狀態無法在協議層面保存下來。當該用戶下一次繼續訪問就無法區分他與其他的用戶。于是我們使用Cookie 來管理Session,以彌補HTTP 協議中不存在的狀態管理功能。
步驟:
- 客戶端把用戶ID和密碼等登錄信息通過請求報文發送給服務器
- 服務器收到請求后,給該用戶標記Session ID(如PHPSESSID=048z9j…,為了防止這個ID被盜用,最好將其設置成難以推測的字符串,保證安全),記錄其認證狀態。然后將這個Session ID寫入響應頭的Set-cookie。
- 客戶端在接收到從服務器端發來的Session ID 后,會將其作為Cookie 保存在本地。下次向服務器發送同樣的請求時,瀏覽器會自動發送帶有Session ID的Cookie,服務器端可通過驗證接收到的Session ID 識別用戶和其認證狀態。
以上是一個登錄認證的session示例,通過這個例子我們可以了解session的基本原理,其實session可以理解為是服務器對cookie的一個映射。