(2022.05.24 Tues)
HTTP作為無狀態(tài)協(xié)議(stateless protocol)怪瓶,在服務器端不保存客戶端信息,因而對于服務器端來說,接收到的不同請求是獨立的怎虫,服務器端無法判斷相鄰的請求是否來自同一個客戶端。同時服務器端不維護/保存客戶端信息困介。而對于需要將來自同一客戶端的不同請求聯(lián)系在一起的場景和應用來說大审,無狀態(tài)特性顯然并不方便。
因此引入cookie和session用于記錄用戶信息座哩。
Cookie
Cookie是保留在客戶端client的一段信息徒扶。客戶端與服務器首次連接時根穷,客戶端的請求報文中不含cookie姜骡,而服務器的第一次響應報文header中會包含cookie信息,即Set-Cookie: <cookie-name>=<cookie-value>
屿良,信息以key-value對的形式保存圈澈。客戶端保留此cookie信息尘惧,在之后向服務器發(fā)送請求的時候在header加入cookie信息康栈。服務器可依據(jù)cookie信息做出有針對性的響應。客戶端的瀏覽器可以禁止cookie使用谅将。Cookie最大只有4KB漾狼,瀏覽器端可保留上百個。
Cookie的作用
會話管理(session management)
登錄饥臂、購物車逊躁、游戲分數(shù)以及需要服務器記錄的其他信息
定制化
用戶喜好、主題和其他設定
追蹤
記錄和分析用戶行為
Cookie初始化和使用
Set-Cookie
信息中除了包含key-value對隅熙,還可以包括過期時間(Expires
)稽煤、存活時長(Max-Age
)、cookie發(fā)往的域名(Domain
)和路徑(Path
)囚戚、是否使用HTTPS協(xié)議(Secure
/HttpOnly
)等酵熙。如下面案例
Set-Cookie: SessionID=38afes7a8; Max-Age=259200; Domain=somecompany.co.uk; Path=/docs;Secure
在這個cookie中,指定了sessionid驰坊,最大存活時間(秒)匾二,域名,和是否使用HTTPS拳芙。
如果沒有指定Max-Age
或Expires
察藐,則該cookie被認為是永久的,成為一個session-cookie舟扎,只有在客戶端或客戶端瀏覽器關(guān)閉時才會刪除/退出該cookie分飞,也就是結(jié)束session。當指定的時間到達之后睹限,該cookie在瀏覽器上被刪除譬猫。
該cookie也指定了域名,如果服務器的域名與cookie中的域名不同羡疗,則服務器拒絕接收該cookie染服。
該cookie還有一個Secure
標志,此標志出現(xiàn)代表著客戶端只使用HTTPS協(xié)議向服務器發(fā)送cookie叨恨,man-in-the-middle攻擊對該cookie無效肌索。但注意該cookie在客戶端仍然可被其他瀏覽器訪問。
該cookie中還有Path=/docs
標志特碳,指定了在host上可以訪問的路徑,比如/docs
晕换,/docs/web
午乓,/docs/hs
等等由Path
指定路徑和次級路徑。
瀏覽器向服務器返回信息的header中需要加入Cookie
字段闸准,如
Cookie: SessionID=38afes7a8
Cookie的不安全性
客戶端的cookie并不非常安全益愈,客戶端的其他瀏覽器可讀取/分享cookie文件。
Session會話
session在服務器端臨時保存用戶信息用于跨頁面的訪問,是活躍活動的總時間蒸其。用戶session始于登錄終于退出或關(guān)閉瀏覽器敏释,之后session被自動刪除。當然可以將session保存在數(shù)據(jù)庫中避免用戶信息丟失摸袁。前面提到的cookie是服務器用于實現(xiàn)session的工具钥顽,cookie中保存session的唯一標識符,如SessionID
之類的靠汁。session較cookie更加安全蜂大,因保存在服務器端,被加密/存為二進制形式蝶怔。因session的安全性奶浦,在配合cookie使用時,session保存更關(guān)鍵和不可泄露信息踢星,cookie保存其他信息澳叉。
對每個用戶來說,session是獨一無二的沐悦。
服務器上session沒有個數(shù)限制成洗,但是過多顯然影響服務器性能。
Cookie Vs. Session
feature | Cookie | Session |
---|---|---|
存放位置 | client | server |
安全性 | 不安全 | 加密所踊、安全 |
容量 | <4KB | 無限制 |
格式 | 字符 | 任意格式 |
另外泌枪,session取決于cookie,而cookie不依賴于session秕岛,比如session需要讀取cookie的SessionID碌燕,如果client瀏覽器禁用cookie則只能通過在URL中傳遞sessionid實現(xiàn),否則服務器端無法保留session继薛。session和cookie的消失取決于cookie中的過期日期修壕,或用戶是否退出,或關(guān)閉瀏覽器遏考。