程序员过关斩将--cookie和session的关系其实很简单
喜歡就點(diǎn)關(guān)注吧!
月高風(fēng)下,下班路上....
菜菜哥,告訴你一個(gè)秘密,但是不允許告訴任何人
這么秘密,你有男票了?~
不是,昨天我偷偷去面試了,結(jié)果掛了
這不是好事嗎,上天讓公司留住你.....
好吧,不過還是要請(qǐng)教你一個(gè)問題,cookie和session有什么相同和不同嗎?
這個(gè)可能要講很長時(shí)間
定義
Cookie,有時(shí)也用其復(fù)數(shù)形式 Cookies,指某些網(wǎng)站為了辨別用戶身份、進(jìn)行 session 跟蹤而儲(chǔ)存在用戶本地終端上的數(shù)據(jù)(通常經(jīng)過加密)
Session:在計(jì)算機(jī)中,尤其是在網(wǎng)絡(luò)應(yīng)用中,稱為“會(huì)話控制”。Session對(duì)象存儲(chǔ)特定用戶會(huì)話所需的屬性及配置信息。
很簡短的兩段定義,但是已經(jīng)道出了cookie和session本質(zhì)的區(qū)別,一個(gè)位于客戶端,一個(gè)位于服務(wù)端。這個(gè)特性帶著濃重的色彩,實(shí)際中的應(yīng)用都離不開這個(gè)定義。
存儲(chǔ)
這里針對(duì)瀏覽器中的cookie來討論,不要做過多遐想
如果拋開其他特性來說,cookie本質(zhì)上是瀏覽器(http請(qǐng)求)提供的一種客戶端存儲(chǔ)的數(shù)據(jù),但是這個(gè)存儲(chǔ)數(shù)據(jù)有自己的一些特性,比如:cookie長度的限制,跨域的限制(當(dāng)然可以在服務(wù)端配合的情況下的突破這種限制)等。就像所有的存儲(chǔ)一樣,cookie也可以保存在內(nèi)存中,也可以保存在磁盤中,只不過保存在磁盤的時(shí)候是在瀏覽器的存儲(chǔ)目錄下,畢竟cookie是基于http的,http請(qǐng)求又基于瀏覽器。
session在很多情況下被稱為會(huì)話,本質(zhì)上是一種服務(wù)端的存儲(chǔ)數(shù)據(jù)。誕生的主要原因是為了解決http無狀態(tài)這種特性。既然是數(shù)據(jù),其實(shí)就可以存儲(chǔ)于任何介質(zhì)中,像實(shí)際應(yīng)用中,有存儲(chǔ)于內(nèi)存中的,也有存儲(chǔ)于redis的。所以只要看透了它的本質(zhì),存儲(chǔ)在哪里可能就只是一個(gè)驅(qū)動(dòng)的問題了。其實(shí)完全可以自己寫一個(gè)程序把session的數(shù)據(jù)存儲(chǔ)在txt中,只不過性能上可能需要多加考慮。
有聯(lián)系嗎
cookie
當(dāng)用戶第一次訪問并登陸一個(gè)網(wǎng)站的時(shí)候,cookie的設(shè)置以及發(fā)送會(huì)經(jīng)歷以下4個(gè)步驟:
1. 客戶端發(fā)送一個(gè)請(qǐng)求到服務(wù)器 --》?
2. 服務(wù)器發(fā)送一個(gè)HttpResponse響應(yīng)到客戶端,其中包含Set-Cookie的頭部 --》?
3. 客戶端保存cookie,之后向服務(wù)器發(fā)送請(qǐng)求時(shí),HttpRequest請(qǐng)求中會(huì)包含一個(gè)Cookie的頭部 --》
4. 服務(wù)器返回響應(yīng)數(shù)據(jù)
set-cookie:?session=4a0b9b1cce73c469b8a6b6a8aec294d5;?domain=.xx.com;?path=/;?expires=Sun,?25?Aug?2019?08:21:27?-0000;?secure;?HttpOnly以上過程很明顯是一個(gè)最常見的場(chǎng)景,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ā)展有所增加或者減少):
| name | name字段為一個(gè)cookie的名稱 |
| value | value字段為一個(gè)cookie的值 |
| domain | 可以訪問此cookie的域名 |
| path | 可以訪問此cookie的頁面路徑 |
| expires/Max-Age | 此cookie超時(shí)時(shí)間。 |
| Size | Size字段 此cookie大小 |
| http | cookie的httponly屬性 |
| secure | 設(shè)置是否只能通過https來傳遞此條cookie |
由于瀏覽器的安全策略,不同域名(何為不同域名,請(qǐng)百度)的cookie是不允許的,但是可以通過服務(wù)端的配置可以解決這個(gè)問題。
session
session的創(chuàng)建目的初衷就是為了讓服務(wù)端記住會(huì)話,簡而言之就是讓服務(wù)端能識(shí)別出來是哪個(gè)客戶端,既然要記住,那服務(wù)端必須要存儲(chǔ)每個(gè)會(huì)話的數(shù)據(jù),比如:實(shí)際項(xiàng)目中最常用的用戶信息等。服務(wù)端存儲(chǔ)這些用戶數(shù)據(jù)沒問題,最大的一個(gè)障礙是怎么樣識(shí)別諸多請(qǐng)求中哪些是同一個(gè)會(huì)話。要解決這個(gè)問題,只依靠服務(wù)端無法解決,必須需要客戶端來配合:需要上傳會(huì)話的標(biāo)識(shí)。
客戶端上傳會(huì)話的標(biāo)識(shí),必須是客戶端和服務(wù)端都能支持的協(xié)議和數(shù)據(jù),其實(shí)也可以看做是http請(qǐng)求支持的協(xié)議和數(shù)據(jù),既然是基于http請(qǐng)求,最方便的就是利用cookie,cookie是一種key-value的數(shù)據(jù)存儲(chǔ)格式,value的值正適合作為session的標(biāo)識(shí)(session也是一種key-value的存儲(chǔ)),在這種情況下cookie終于和session有了一定的聯(lián)系。
session機(jī)制利用cookie來作為標(biāo)識(shí)的傳輸機(jī)制,并不意味著只能用cookie,只要是服務(wù)端和客戶端約定好了位置,session標(biāo)識(shí)我可以放到http請(qǐng)求的任何位置(當(dāng)然http請(qǐng)求必須得支持傳輸才可以)。你完全可以把session的標(biāo)識(shí)放到http頭Authorization字段,只要服務(wù)端能正確的讀到此值并且正確解析即可。
有些面試官喜歡問cookie和session的相同和不同,甚至他們的聯(lián)系,這樣的提問在某種程度上是不太好的,容易讓人錯(cuò)誤的認(rèn)為cookie和session的聯(lián)系很密切,但是其實(shí)他們的聯(lián)系很單純,純潔的朋友利用關(guān)系。
此文篇幅屬于5分鐘系列,更能有效利用碎片化時(shí)間,下一篇,我們也許可以討論一下基于cookie和session的認(rèn)證
完
●程序員修神之路--用NOSql給高并發(fā)系統(tǒng)加速
●程序員修神之路--高并發(fā)系統(tǒng)設(shè)計(jì)負(fù)載均衡架構(gòu)
●程序員修神之路--做好分庫分表其實(shí)很難之一(繼續(xù)送書)
●程序員修神之路--做好分庫分表其實(shí)很難之二(送書繼續(xù))
●程序員過關(guān)斬將--你為什么還在用存儲(chǔ)過程?
●程序員過關(guān)斬將--小小的分頁引發(fā)的加班血案
●程序員修神之路--問世間異步為何物?
●程序員修神之路--提高網(wǎng)站的吞吐量?
●程序員修神之路--?分布式高并發(fā)下Actor模型如此優(yōu)秀?
●程序員過關(guān)斬將--你的面向接口編程一定對(duì)嗎?
●程序員修神之路--高并發(fā)下為什么更喜歡進(jìn)程內(nèi)緩存
總結(jié)
以上是生活随笔為你收集整理的程序员过关斩将--cookie和session的关系其实很简单的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 从“梁漱溟:思考问题有八层境界”所联想到
- 下一篇: ASP.NET Core 双因素验证2