天天看點

還沒徹底了解cookie和session嗎?

作者:程式猿冰冰
還沒徹底了解cookie和session嗎?

關注我,帶你了解java

現在網上有很不少關于cookie,session的教程,但是我還是想要以我的了解來總結一下二者的關系。

http協定是無狀态的,在很多場景下往往需要保持會話狀态,是以cookie和session應運而生。

一、cookie

Cookie是一段可以辨別使用者的資訊,由伺服器産生發送給用戶端儲存;

由于HTTP是一種無狀态的協定,伺服器單從網絡連接配接上無從知道客戶身份。使用者A購買了一件商品放入購物車内,當再次購買商品時伺服器已經無法判斷該購買行為是屬于使用者A的會話還是使用者B的會話了。怎麼辦呢?伺服器就給用戶端們頒發一個通行證,每人一個,無論誰通路都必須攜帶自己通行證。這樣伺服器就能從通行證上确認客戶身份了。這就是Cookie 的工作原理。

Cookie實際上是一小段的文本資訊。用戶端請求伺服器,如果伺服器需要記錄該使用者狀态,就使用response向用戶端浏覽器頒發一個Cookie。用戶端會把Cookie儲存起來。 當浏覽器再請求該網站時,浏覽器把請求的網址連同該Cookie一同送出給伺服器。伺服器檢查該Cookie,以此來辨認使用者狀态。伺服器還可以根據需要修改Cookie的内容。

當使用者第一次通路并登入一個網站的時候,cookie的設定以及發送會經曆以下4個步驟:

1.用戶端發送一個請求到伺服器;

2.伺服器發送一個HttpResponse響應到用戶端,其中包含Set-Cookie的頭部;

3.用戶端儲存cookie,之後向伺服器發送請求時,HttpRequest請求中會包含一個Cookie的頭部;

4.伺服器傳回響應資料。

還沒徹底了解cookie和session嗎?

cookie資料的存儲方式通常是以key-value鍵值對的形式存儲,這個資料一般會包含sessionID字段,并且cookie具有不可跨域性,即浏覽器通路谷歌不會攜帶百度的cookie,是以,我們可以了解為不同的url對應的不同浏覽器視窗有一個獨立的cookie存放容器,該容器中的key就是目前通路的伺服器的url位址,而value就是cookie的對象集合。

二、session

我們把這種基于唯一ID識别使用者身份的機制稱為Session。與cookie不同的是Cookie儲存在用戶端浏覽器中,而Session儲存在伺服器上。每個使用者第一次通路伺服器後,會自動獲得一個Session ID。如果使用者在一段時間内沒有通路伺服器,那麼Session會自動失效,下次即使帶着上次配置設定的Session ID通路,伺服器也認為這是一個新使用者,會配置設定新的Session ID。

session原理

伺服器建立session出來後,會把session的id号,以cookie的形式回寫給客戶機,這樣,隻要客戶機的浏覽器不關,再去通路伺服器時,都會帶着session的id号去,伺服器發現客戶機浏覽器帶session id過來了,就會使用記憶體中與之對應的session為之服務。

cookie和session的關系

當使用者浏覽器輸入視窗輸入一個全新的url,第一次請求伺服器的非靜态資料的時候,伺服器會根據使用者送出的相關資訊,建立對應的session,響應傳回浏覽器時會将該session唯一的辨別資訊SessionID傳回給浏覽器,浏覽器接收到伺服器傳回的SessionID資訊後,會将此資訊以鍵值對的形式存入到該url對應的cookie對象集合中。

還沒徹底了解cookie和session嗎?

cookie和session的差別

(1)cookie資料存放在客戶的浏覽器上,session資料放在伺服器上

(2)cookie不是很安全,别人可以分析存放在本地的COOKIE并進行COOKIE欺騙,如果主要考慮到安全應當使用session

(3)session會在一定時間内儲存在伺服器上。當通路增多,會比較占用你伺服器的性能,如果主要考慮到減輕伺服器性能方面,應當使用COOKIE

(4)單個cookie在用戶端的限制是3K,就是說一個站點在用戶端存放的COOKIE不能3K。 (5)是以:将登陸資訊等重要資訊存放為SESSION;其他資訊如果需要保留,可以放在COOKIE中

面試題:

Session将産生的session_id放在Cookie裡面,如果使用者把Cookie所禁用了,那麼是不是Session的功能也無法使用了?

先回答,禁用了Cookie功能,Session功能還是可以正常使用的,隻是我們可以通過其他方式來傳遞session_id,例如通過類似get請求方式一樣,将session_id附加到URL位址的後面進行傳輸,或者通過Post請求方式。進而一樣可以讓服務端和用戶端進行狀态确認。

在開發中,session是公認的比Cookie安全。為什麼?

第一點,先說下為什麼Cookie不安全:一:在我過去的面試經曆中,有一位技術經理告訴過我,他可以通過将Cookie的檔案拷貝到另一台計算機,另一個用戶端上進行對相同網站的登入,可以這樣欺騙服務端,實作登入。是的,這就是由于Cookie是存儲在用戶端浏覽器上的,導緻使用者可以直接進行操作,導緻了安全性的降低。

真正的Cookie是存儲在用戶端的硬碟上的一個文本檔案,如果兩者的安全性一樣,那麼就可以不使用Session,這樣就可以減輕伺服器的負載了。

通過Cookie來擷取session_id,得有兩個條件:必須要有人首次進行登入之後,或者重新開機session才會有。第二個條件就是session_id必須是要有效的,是以必須保證session_id是最後一次登入所生成的,session在生命周期以内,且解密已經加密的session_id在短時間很難受實作。。

對于使得Session失效的方法有多種:1.重新開機tomcat,2.session生命周期結束(可以手動配置),3.可以調用session.invalidate();方法進行回收。

星辰大海,永不止步

END

繼續閱讀