程序員過關斬將--cookie和session的關係其實很簡單


月高風下,下班路上....


菜菜哥,告訴你一個祕密,但是不允許告訴任何人

這麼祕密,你有男票了?~

不是,昨天我偷偷去面試了,結果掛了

這不是好事嗎,上天讓公司留住你.....

好吧,不過還是要請教你一個問題,cookie和session有什麼相同和不同嗎?

這個可能要講很長時間


定義


Cookie,有時也用其複數形式 Cookies,指某些網站爲了辨別用戶身份、進行 session 跟蹤而儲存在用戶本地終端上的數據(通常經過加密)


Session:在計算機中,尤其是在網絡應用中,稱爲“會話控制”。Session對象存儲特定用戶會話所需的屬性及配置信息。


很簡短的兩段定義,但是已經道出了cookie和session本質的區別,一個位於客戶端,一個位於服務端。這個特性帶着濃重的色彩,實際中的應用都離不開這個定義。

存儲


這裏針對瀏覽器中的cookie來討論,不要做過多遐想


如果拋開其他特性來說,cookie本質上是瀏覽器(http請求)提供的一種客戶端存儲的數據,但是這個存儲數據有自己的一些特性,比如:cookie長度的限制,跨域的限制(當然可以在服務端配合的情況下的突破這種限制)等。就像所有的存儲一樣,cookie也可以保存在內存中,也可以保存在磁盤中,只不過保存在磁盤的時候是在瀏覽器的存儲目錄下,畢竟cookie是基於http的,http請求又基於瀏覽器。

session在很多情況下被稱爲會話,本質上是一種服務端的存儲數據。誕生的主要原因是爲了解決http無狀態這種特性。既然是數據,其實就可以存儲於任何介質中,像實際應用中,有存儲於內存中的,也有存儲於redis的。所以只要看透了它的本質,存儲在哪裏可能就只是一個驅動的問題了。其實完全可以自己寫一個程序把session的數據存儲在txt中,只不過性能上可能需要多加考慮。

有聯繫嗎

cookie

當用戶第一次訪問並登陸一個網站的時候,cookie的設置以及發送會經歷以下4個步驟:

1. 客戶端發送一個請求到服務器 --》 

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

3. 客戶端保存cookie,之後向服務器發送請求時,HttpRequest請求中會包含一個Cookie的頭部 --》

4. 服務器返回響應數據

set-cookie: session=4a0b9b1cce73c469b8a6b6a8aec294d5; domain=.xx.com; path=/; expires=Sun, 25 Aug 2019 08:21:27 -0000; secure; HttpOnly

以上過程很明顯是一個最常見的場景,cookie的特性以及值是由服務端來下發,但是不要忘記cookie本質上是一種客戶端技術,所以客戶端其實同樣能操作cookie,比如:登錄的時候服務端的返回結果中可以不包含set-cookie的頭部,而是把值通過正文來返回,客戶端腳本通過讀取返回的正文解析出結果,然後寫入cookie同樣能達到相同的效果。set-cookie只不過是http協議中已經約定好的格式,服務端告訴客戶端需要設置cookie的協議而已。當然cookie還有其他很多特性(可能隨着發展有所增加或者減少):

屬性介紹
namename字段爲一個cookie的名稱
valuevalue字段爲一個cookie的值
domain可以訪問此cookie的域名
path可以訪問此cookie的頁面路徑
expires/Max-Age此cookie超時時間。
SizeSize字段 此cookie大小
httpcookie的httponly屬性
secure設置是否只能通過https來傳遞此條cookie

由於瀏覽器的安全策略,不同域名(何爲不同域名,請百度)的cookie是不允許的,但是可以通過服務端的配置可以解決這個問題。

session

session的創建目的初衷就是爲了讓服務端記住會話,簡而言之就是讓服務端能識別出來是哪個客戶端,既然要記住,那服務端必須要存儲每個會話的數據,比如:實際項目中最常用的用戶信息等。服務端存儲這些用戶數據沒問題,最大的一個障礙是怎麼樣識別諸多請求中哪些是同一個會話。要解決這個問題,只依靠服務端無法解決,必須需要客戶端來配合:需要上傳會話的標識。

客戶端上傳會話的標識,必須是客戶端和服務端都能支持的協議和數據,其實也可以看做是http請求支持的協議和數據,既然是基於http請求,最方便的就是利用cookie,cookie是一種key-value的數據存儲格式,value的值正適合作爲session的標識(session也是一種key-value的存儲),在這種情況下cookie終於和session有了一定的聯繫。

session機制利用cookie來作爲標識的傳輸機制,並不意味着只能用cookie,只要是服務端和客戶端約定好了位置,session標識我可以放到http請求的任何位置(當然http請求必須得支持傳輸纔可以)。你完全可以把session的標識放到http頭Authorization字段,只要服務端能正確的讀到此值並且正確解析即可。

有些面試官喜歡問cookie和session的相同和不同,甚至他們的聯繫,這樣的提問在某種程度上是不太好的,容易讓人錯誤的認爲cookie和session的聯繫很密切,但是其實他們的聯繫很單純,純潔的朋友利用關係。

此文篇幅屬於5分鐘系列,更能有效利用碎片化時間,下一篇,我們也許可以討論一下基於cookie和session的認證



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章