月高風(fēng)下,下班路上....
菜菜哥,告訴你一個秘密,但是不允許告訴任何人
這么秘密,你有男票了?~
不是,昨天我偷偷去面試了,結(jié)果掛了
這不是好事嗎,上天讓公司留住你.....
好吧,不過還是要請教你一個問題,cookie和session有什么相同和不同嗎?
這個可能要講很長時(shí)間
定義
Cookie,有時(shí)也用其復(fù)數(shù)形式 Cookies,指某些網(wǎng)站為了辨別用戶身份、進(jìn)行 session 跟蹤而儲存在用戶本地終端上的數(shù)據(jù)(通常經(jīng)過加密)
Session:在計(jì)算機(jī)中,尤其是在網(wǎng)絡(luò)應(yīng)用中,稱為“會話控制”。Session對象存儲特定用戶會話所需的屬性及配置信息。
很簡短的兩段定義,但是已經(jīng)道出了cookie和session本質(zhì)的區(qū)別,一個位于客戶端,一個位于服務(wù)端。這個特性帶著濃重的色彩,實(shí)際中的應(yīng)用都離不開這個定義。
存儲
這里針對瀏覽器中的cookie來討論,不要做過多遐想
如果拋開其他特性來說,cookie本質(zhì)上是瀏覽器(http請求)提供的一種客戶端存儲的數(shù)據(jù),但是這個存儲數(shù)據(jù)有自己的一些特性,比如:cookie長度的限制,跨域的限制(當(dāng)然可以在服務(wù)端配合的情況下的突破這種限制)等。就像所有的存儲一樣,cookie也可以保存在內(nèi)存中,也可以保存在磁盤中,只不過保存在磁盤的時(shí)候是在瀏覽器的存儲目錄下,畢竟cookie是基于http的,http請求又基于瀏覽器。
session在很多情況下被稱為會話,本質(zhì)上是一種服務(wù)端的存儲數(shù)據(jù)。誕生的主要原因是為了解決http無狀態(tài)這種特性。既然是數(shù)據(jù),其實(shí)就可以存儲于任何介質(zhì)中,像實(shí)際應(yīng)用中,有存儲于內(nèi)存中的,也有存儲于redis的。所以只要看透了它的本質(zhì),存儲在哪里可能就只是一個驅(qū)動的問題了。其實(shí)完全可以自己寫一個程序把session的數(shù)據(jù)存儲在txt中,只不過性能上可能需要多加考慮。
有聯(lián)系嗎
cookie
當(dāng)用戶第一次訪問并登陸一個網(wǎng)站的時(shí)候,cookie的設(shè)置以及發(fā)送會經(jīng)歷以下4個步驟:
1. 客戶端發(fā)送一個請求到服務(wù)器 --》?
2. 服務(wù)器發(fā)送一個HttpResponse響應(yīng)到客戶端,其中包含Set-Cookie的頭部 --》?
3. 客戶端保存cookie,之后向服務(wù)器發(fā)送請求時(shí),HttpRequest請求中會包含一個Cookie的頭部 --》
4. 服務(wù)器返回響應(yīng)數(shù)據(jù)
set-cookie:?session=4
a0b9b1cce73c469b8a6b6a8aec294d5;?domain=.xx.com;?path=/;?expires=Sun,?25?Aug?2019?08:21:27?-0000;?secure;?HttpOnly
以上過程很明顯是一個最常見的場景,cookie的特性以及值是由服務(wù)端來下發(fā),但是不要忘記cookie本質(zhì)上是一種客戶端技術(shù),所以客戶端其實(shí)同樣能操作cookie,比如:登錄的時(shí)候服務(wù)端的返回結(jié)果中可以不包含set-cookie的頭部,而是把值通過正文來返回,客戶端腳本通過讀取返回的正文解析出結(jié)果,然后寫入cookie同樣能達(dá)到相同的效果。set-cookie只不過是http協(xié)議中已經(jīng)約定好的格式,服務(wù)端告訴客戶端需要設(shè)置cookie的協(xié)議而已。當(dāng)然cookie還有其他很多特性(可能隨著發(fā)展有所增加或者減少):
屬性介紹
namename字段為一個cookie的名稱
valuevalue字段為一個cookie的值
domain可以訪問此cookie的域名
path可以訪問此cookie的頁面路徑
expires/Max-Age此cookie超時(shí)時(shí)間。
SizeSize字段 此cookie大小
httpcookie的httponly屬性
secure設(shè)置是否只能通過https來傳遞此條cookie
由于瀏覽器的安全策略,不同域名(何為不同域名,請百度)的cookie是不允許的,但是可以通過服務(wù)端的配置可以解決這個問題。
session
session的創(chuàng)建目的初衷就是為了讓服務(wù)端記住會話,簡而言之就是讓服務(wù)端能識別出來是哪個客戶端,既然要記住,那服務(wù)端必須要存儲每個會話的數(shù)據(jù),比如:實(shí)際項(xiàng)目中最常用的用戶信息等。服務(wù)端存儲這些用戶數(shù)據(jù)沒問題,最大的一個障礙是怎么樣識別諸多請求中哪些是同一個會話。要解決這個問題,只依靠服務(wù)端無法解決,必須需要客戶端來配合:需要上傳會話的標(biāo)識。
客戶端上傳會話的標(biāo)識,必須是客戶端和服務(wù)端都能支持的協(xié)議和數(shù)據(jù),其實(shí)也可以看做是http請求支持的協(xié)議和數(shù)據(jù),既然是基于http請求,最方便的就是利用cookie,cookie是一種key-value的數(shù)據(jù)存儲格式,value的值正適合作為session的標(biāo)識(session也是一種key-value的存儲),在這種情況下cookie終于和session有了一定的聯(lián)系。
session機(jī)制利用cookie來作為標(biāo)識的傳輸機(jī)制,并不意味著只能用cookie,只要是服務(wù)端和客戶端約定好了位置,session標(biāo)識我可以放到http請求的任何位置(當(dāng)然http請求必須得支持傳輸才可以)。你完全可以把session的標(biāo)識放到http頭Authorization字段,只要服務(wù)端能正確的讀到此值并且正確解析即可。
有些面試官喜歡問cookie和session的相同和不同,甚至他們的聯(lián)系,這樣的提問在某種程度上是不太好的,容易讓人錯誤的認(rèn)為cookie和session的聯(lián)系很密切,但是其實(shí)他們的聯(lián)系很單純,純潔的朋友利用關(guān)系。
此文篇幅屬于5分鐘系列,更能有效利用碎片化時(shí)間,下一篇,我們也許可以討論一下基于cookie和session的認(rèn)證
完
熱門工具 換一換