一文弄懂 HTTP、cookie、session
Http協議
超文字傳輸協議(HTTP,Hyper Text Transfer Protocol)是網際網路上應用最為廣泛的一種網路協議。是用於從WWW伺服器傳輸超文字到本地瀏覽器的傳輸協議。它可以使瀏覽器更加高效,使網路傳輸減少。它不僅保證計算機正確快速地傳輸超文字文件,還確定傳輸文件中的哪一部分,以及哪部分內容首先顯示(如文字先於圖形)。
Http協議的版本:
HTTP/1.0, 傳送請求,建立一次連線,獲得一個web資源,連線斷開(在最早的 http 協議中,每進行一次 http 通訊,就需要做一次 tcp 的連線。而一次連線需要進 行 3 次握手,這種通訊方式會增加通訊量的開銷)
HTTP/1.1,傳送請求,建立一次連線,獲得多個web資源,連線斷開。在 HTTP/1.1 中改用了持久連線,就是在一次連線建立之後,只要客戶端或者服務端沒有 明確提出斷開連線,那麼這個 tcp 連線會一直保持連線狀態 持久連線的一個最大的好處是:大大減少了連線的建立以及關閉時延。 HTTP1.1 中有一個 Transport 段。會攜帶一個 Connection:Keep-Alive,表示希望將此條連線作為持久連線。
HTTP協議的主要特點
1.支援客戶/伺服器模式。(c/s)
2.簡單快速:客戶向伺服器請求服務時,只需傳送請求方法和路徑。請求方法常用的有:
GET:獲取資源
POST:傳輸實體主體
PUT:傳輸檔案
HEAD: 獲得報文首部(相當於GET方法獲得的資源去掉正文)
DELETE: 刪除檔案
OPTIONS: 詢問支援的方法(客戶端問伺服器)
TRACE: 追蹤路徑
CONNECT:要求用隧道協議連線代理。
每種方法規定了客戶與伺服器聯絡的型別不同。由於HTTP協議簡單,使得HTTP伺服器的程式規模小,因而通訊速度很快。
3.靈活:HTTP允許傳輸任意型別的資料物件。正在傳輸的型別由Content-Type加以標記。
4.無連線:無連線的含義是限制每次連線只處理一個請求。伺服器處理完客戶的請求,並收到客戶的應答後,即斷開連線。採用這種方式可以節省傳輸時間。
5.無狀態:HTTP協議是無狀態協議。
- 無狀態是指協議對於事務處理沒有記憶能力。
- 對同一個url請求沒有上下文關係,每次的請求都是獨立的,它的執行情況和結果與前面的請求和之後的請求是無直接關係的,它不會受前面的請求應答情況直接影響,也不會直接影響後面的請求應答情況。
- 伺服器中沒有儲存客戶端的狀態,客戶端必須每次帶上自己的狀態去請求伺服器。
- 另一方面,缺少狀態意味著如果後續處理需要前面的資訊,則它必須重傳,這樣可能導致每次連線傳送的資料量增大。
會話跟蹤
在程式中,會話跟蹤是很重要的事情。理論上,一個使用者的所有請求操作都應該屬於同一個會話,而另一個使用者的所有請求操作則應該屬於另一個會話,二者不能混淆。例如,使用者張三在商場購買的任何商品都應該放在張三的購物車內,不論是使用者張三什麼時間購買的,這都是屬於同一個會話的,不能放入使用者李四或使用者牛二的購物車內,這不屬於同一個會話。
而Web應用程式是使用HTTP協議傳輸資料的。HTTP 協議是無狀態的,什麼是無狀態呢?通俗來講就是說http協議一旦資料交換完畢,客戶端與伺服器端的連線就會關閉,再次交換資料需要建立新的連線。 但是現在的應用程式都是有狀態的,如果是無狀態,那這些應用基本沒人用,你想想,訪問一個電商網站,先登入,然後去選購商品,當點選一個商品加入購物車以後又提示你登入。
每一次操作都要與系統底層的資料庫進行互動
這種繁雜、冗餘的使用者體驗根本不會有人去使用,那我們是如何實現帶狀態的協議呢?所以此時便引入了cookie和session兩個概念!
常用的會話跟蹤技術是Cookie與Session。
Cookie通過在客戶端記錄資訊確定使用者身份,Session通過在伺服器端記錄資訊確定使用者身份。
1、客戶端支援的 cookie
- Cookie就是這樣的一種機制。它可以彌補HTTP協議無狀態的不足。在Session出現之前,基本上所有的網站都採用Cookie來跟蹤會話
<1>什麼是Cookie?
Cookie意為“甜餅”,是由W3C組織提出,最早由Netscape社群發展的一種機制。目前Cookie已經成為標準,所有的主流瀏覽器如IE、google、Netscape、Firefox、Opera等都支援Cookie。
<2>Cookie的工作原理:
由於HTTP是一種無狀態的協議,伺服器單從網路連線上無從知道客戶身份。怎麼辦呢?就給客戶端們頒發一個通行證吧,每人一個,無論是誰訪問都必須攜帶自己通行證。這樣伺服器就能從通行證上確認客戶身份了。這就是Cookie的工作原理。
Cookie實際上是一小段的文字資訊。客戶端請求伺服器,如果伺服器需要記錄該使用者狀態,就使用response向客戶端瀏覽器頒發一個Cookie。客戶端瀏覽器會把Cookie儲存起來。當瀏覽器再請求該網站時,瀏覽器把請求的網址連同該Cookie一同提交給伺服器。伺服器檢查該Cookie,以此來辨認使用者狀態。伺服器還可以根據需要修Cookie的內容。
2、服務端支援的 session
- 除了使用Cookie,Web應用程式中還經常使用Session來記錄客戶端狀態。Session是伺服器端使用的一種記錄客戶端狀態的機制,使用上比Cookie簡單一些,相應的也增加了伺服器的儲存壓力。
<1>什麼是session?
Session是另一種記錄客戶狀態的機制,不同的是Cookie儲存在客戶端瀏覽器中,而Session儲存在伺服器上。客戶端瀏覽器訪問伺服器的時候,伺服器使用一種類似於雜湊表的結構(也可能就是使用雜湊表)來儲存客戶端資訊。 客戶端瀏覽器再次訪問時只需要從該Session中查詢該客戶的狀態就可以了,這就是Session。
為每個訪問伺服器的使用者建立一個儲存資料的容器,容器中的資料在多個請求之間共享;通過在伺服器端開闢一塊快取區,儲存、記憶、共享一些臨時資料(這個資料指的是客戶端和伺服器在臨時會話中產生的資料)
<2>session的工作原理
如果說Cookie機制是通過檢查客戶身上的“通行證”來確定客戶身份的話,那麼Session機制就是通過檢查伺服器上的“客戶明細表”來確認客戶身份。Session相當於程式在伺服器上建立的一份客戶檔案,客戶來訪的時候只需要查詢客戶檔案表就可以了。當程式需要為某個客戶端的請求建立一個session的時候,伺服器首先檢查這個客戶端的請求裡是否已包含了一個session標識 ——稱為session id,如果已包含一個session id則說明以前已經為此客戶端建立過session,伺服器就按照session id把這個session檢索出來使用(如果檢索不到,可能會新建一個),如果客戶端請求不包含session id,則為此客戶端建立一個session並且生成一個與session相關聯的session id,session id的值應該是一個既不會重複,又不容易被找到規律以仿造的字串,這個session id將被在本次響應中返回給客戶端儲存。
最後是我個人的一些總結,花了半天的時間研究了一下http協議以及cookie、和session的概念原理。
-
http協議本身是無狀態的,只是後來隨著網際網路的發展以及電商平臺的普及,越來越多的web應用程式出現,為了順應與人互動的便捷化,這兩個非正式協議的機制便被引入到http中,其實這兩種機制很久以前就已經存在(cookie是1993年提出,session暫不清楚)
-
cookie:預設情況下,當瀏覽器關閉後,Cookie資料被銷燬
-
session:可以認為是伺服器端開闢的一小塊緩衝空間
舉一個很貼近生活的例子,一般大部分小區都會有保安看守,想進小區無非不過就兩種方法:
一、擁有你自己的身份證明,能證明你是小區裡的人,拿給保安看。
二、讓保安查詢對應的小區出入資訊登記表,核對身份後,方可進入。
這裡的第一點就好比你自己的cookie,第二點裡的登記表就好比小區為業主為專門設定的緩衝區(或者說記錄表),也就是session。
本人小白,第一次發文,以上均為個人見解,如有不嚴謹的地方還望各位不吝賜教!
參考文連結:cookie
相關文章
- 一篇文章弄懂cookie、session和tokenCookieSession
- Cookie && Session && localStorage && sessionstorage && HTTP快取CookieSessionHTTP快取
- 一文搞懂Cookie,Session,Token,JWTCookieSessionJWT
- 一文搞懂 Cookie,Session,Token,JWTCookieSessionJWT
- 一文快速回顧 Session 和 CookieSessionCookie
- http協議/cookie詳解/session詳解HTTP協議CookieSession
- cookie sessionCookieSession
- cookie & sessionCookieSession
- http中session和cookie的區別和關係HTTPSessionCookie
- HTTP協議Cookie和Session有什麼區別HTTP協議CookieSession
- 一文搞懂Session和Cookie的用法及區別SessionCookie
- cookie 和 sessionCookieSession
- session和cookieSessionCookie
- cookie&sessionCookieSession
- Session與CookieSessionCookie
- Cookie和SessionCookieSession
- cookie、session總結CookieSession
- Cookie & Session詳解CookieSession
- Cookie&Session&JSPCookieSessionJS
- 理解 cookie、session、tokenCookieSession
- Django Cookie與SessionDjangoCookieSession
- cookie、session、web storageCookieSessionWeb
- 【Javaweb】Cookie和SessionJavaWebCookieSession
- session和cookie關係SessionCookie
- Session和Cookie機制SessionCookie
- cookie與session的使用CookieSession
- Cookie與Session 關係CookieSession
- 撩下Cookie和SessionCookieSession
- Cookie與Session詳解CookieSession
- laravel操作session和cookieLaravelSessionCookie
- 關於Session和CookieSessionCookie
- 一文弄懂“分散式鎖”分散式
- 一文弄懂HTTPS加密原理HTTP加密
- 一文弄懂CGAffineTransform和CTMORM
- localStorage 與 sessionStorage / cookie 和 sessionSessionCookie
- Cookie&Session概念解讀CookieSession
- cookie和session的區別CookieSession
- 聊一聊session和cookieSessionCookie