Cookie與Session

HTTP是一種不保存狀態的協議,也就是無狀態協議。Http自身不對請求和響應之間的通信狀態做出保存,也就是說在在HTTP這個級別,協議對于發送過的請求和響應都不做出保存。

事實上:由于通常一臺服務器會服務于幾萬個甚至更多的客戶(客戶端),如果把所有的客戶端信息都記錄下來,那么會大大增加服務器的壓力,HTTP協議是無狀態的,也就意味著服務器沒法記住某個客戶發出的請求和做出的響應,這樣的話客戶下一次再次請求時,服務器也無法識別這個客戶,因此又會做出新的響應。比如登錄時,客戶明明已經登錄過了,但是跳轉到網站的其他頁面,由于是服務器是無狀態的服務器還得請求一次。為了實現期望的保持狀態功能,于是引入了cookie技術。

Cookie是保存在客戶端的小段文本,隨著客戶端每一個請求發送該url下的所有cookies到服務器端。

cookies_1.png

Cookie的詳細工作流程如下:cookie_0.png

1、第一次請求時,瀏覽器中是沒有cookie信息的。

cookies_2.png

2、服務器接收到請求后,會首先檢查是否存在Cookie,如果沒有Cookie,會生成一個Cookie。在響應頭中Set-Cookie中生成Cookie信息。生成的Cookie文本中,存在一個sessionId,服務器會記錄下來這個sessionId。

cookies_3png.png

3、客戶端再次請求時,瀏覽器會自動將Cookie信息添加到請求頭上,服務器接到請求會根據sessionId來判斷身份。

cookies_4png.png

Session

Session保存在服務器端(在服務器端生成),通過唯一的sessionId來區別每一個用戶。sessionId隨每個請求發送到服務器(sessionId實際上是Cookie中的一個字段),Session實際上是一個保存在服務器的數據表,每一個sessionId對應一個用戶。通過Cookie獲取到SessionId,然后再通過session的key獲取session值。

session_id.png

思考:如果不使用Cookie能不能實現維持會話?

仔細分析Cookie的功能,我們使用Cookie最重要的就是保存了一個sessionId然后每次請求時,在請求頭中攜帶過去。如果沒有了Cookie,那么我們可以不可以通過其他的手段把這個sessionId發送到服務端,并通過其他手段再吉首這個sessionId。比如我們可以通過在Url后面添加上sessionId,這樣的話服務器端也能獲取到sessionId,然后 服務端再將sessionId返回回來,客戶端再進行保存。這樣的話也能夠實現類似于Cookie的功能,但是這樣不太安全,因為sessionId直接在Url后面是可見的,很容易就被模仿了。也存在一個方法提高安全性,那就是服務器產生一個tooken,每請求一次tooken發生變化,tooken只能使用一次,這樣也能提高安全性。

posted @ 2019-12-06 11:03  海因斯坦  閱讀(...)  評論(...編輯  收藏