什么是session淆衷?什么是cookie缸榄?session和cookie有什么區(qū)別? 什么場景適用于session祝拯?什么場景適用于cookie甚带?

什么是session?什么是cookie佳头?session和cookie有什么區(qū)別鹰贵?什么場景適用于session?什么場景適用于cookie康嘉?

1.背景介紹

過例子簡單引入

星巴克開始優(yōu)惠活動碉输,每消費10杯咖啡,會免費贈送1杯亭珍》蠹兀考慮到一個人一次性消費10杯咖啡幾乎不可能菌赖,所以需要采取某種方式來記錄顧客的消費數(shù)量铅鲤。

解決方案

1,店員很厲害漩怎,每個顧客的消費記錄都記得一清二楚众羡;

2侨赡,分給顧客一張卡片,每消費一次記錄一次纱控;

3辆毡,發(fā)給顧客一張卡片,上面有卡號甜害,顧客每消費一次,由店員在操作機上記錄一次球昨。

分析:方案一的可執(zhí)行性幾乎為0尔店。方案二和方案三我們都見過。

? 而方案二和三正是對應的客戶端記錄和服務端記錄主慰。與之相對應的正是cookie和session嚣州。

好了,我們進入正題共螺。

由于HTTP是一種無狀態(tài)協(xié)議,服務器沒有辦法單單從網(wǎng)絡連接上面知道訪問者的身份,為了解決這個問題,就誕生了Cookie

Cookie實際上是一小段的文本信息该肴。客戶端請求服務器藐不,如果服務器需要記錄該用戶狀態(tài)匀哄,就使用response向客戶端瀏覽器頒發(fā)一個Cookie

客戶端瀏覽器會把Cookie保存起來秦效。當瀏覽器再請求該網(wǎng)站時,瀏覽器把請求的網(wǎng)址連同該Cookie一同提交給服務器涎嚼。服務器檢查該Cookie阱州,

以此來辨認用戶狀態(tài)。服務器還可以根據(jù)需要修改Cookie的內(nèi)容法梯。

實際就是頒發(fā)一個通行證苔货,每人一個,無論誰訪問都必須攜帶自己通行證立哑。這樣服務器就能從通行證上確認客戶身份了夜惭。這就是Cookie的工作原理

cookie可以讓服務端程序跟蹤每個客戶端的訪問,但是每次客戶端的訪問都必須傳回這些 Cookie铛绰,如果 Cookie很多滥嘴,這無形地增加了客戶端與服務端的數(shù)據(jù)傳輸量,

而 Session的出現(xiàn)正是為了解決這個問題至耻。同一個客戶端每次和服務端交互時若皱,不需要每次都傳回所有的 Cookie值,而是只要傳回一個 ID尘颓,這個 ID是客戶端第一次訪問服務器的時候生成的走触,

而且每個客戶端是唯一的。這樣每個客戶端就有了一個唯一的 ID疤苹,客戶端只要傳回這個 ID就行了互广,這個 ID通常是 NANE為 JSESIONID的一個 Cookie。

cookie機制

?

cookie的內(nèi)容主要包括name(名字)卧土、value(值)惫皱、maxAge(失效時間)、path(路徑),domain(域)和secure

name:cookie的名字尤莺,一旦創(chuàng)建旅敷,名稱不可更改。

value:cookie的值颤霎,如果值為Unicode字符媳谁,需要為字符編碼。如果為二進制數(shù)據(jù)友酱,則需要使用BASE64編碼.

maxAge:cookie失效時間晴音,單位秒。如果為正數(shù)缔杉,則該cookie在maxAge后失效锤躁。如果為負數(shù),該cookie為臨時cookie或详,關閉瀏覽器即失效系羞,

瀏覽器也不會以任何形式保存該cookie郭计。如果為0,表示刪除該cookie觉啊。默認為-1

path:該cookie的使用路徑拣宏。如果設置為"/sessionWeb/",則只有ContextPath為“/sessionWeb/”的程序可以訪問該cookie杠人。如果設置為“/”勋乾,則本域名下ContextPath都可以訪問該cookie。

domain:域.可以訪問該Cookie的域名嗡善。第一個字符必須為".",如果設置為".google.com",則所有以"google.com結尾的域名都可以訪問該cookie",如果不設置,則為所有域名

?

secure:該cookie是否僅被使用安全協(xié)議傳輸辑莫。


Session機制

Session機制是一種服務端的機制,服務器使用一種類似散列表的結構來保存信息罩引。

當程序需要為某個客戶端的請求創(chuàng)建一個session的時候各吨,服務器首先檢查這個客戶端里的請求里是否已包含了一個session標識--sessionID,

如果已經(jīng)包含一個sessionID袁铐,則說明以前已經(jīng)為此客戶端創(chuàng)建過session揭蜒,服務器就按照sessionID把這個session檢索出來使用

如果客戶端請求不包含sessionID,則為此客戶端創(chuàng)建一個session并且聲稱一個與此session相關聯(lián)的sessionID剔桨,

sessionID的值應該是一個既不會重復屉更,又不容易被找到規(guī)律以仿造的字符串(服務器會自動創(chuàng)建),這個sessionID將被在本次響應中返回給客戶端保存。

3.常見問題

使用cookie的弊端? ? ?

使用session的弊端

cookie和session的區(qū)別

4.解決方案

使用cookie的缺點

如果瀏覽器使用的是 cookie洒缀,那么所有的數(shù)據(jù)都保存在瀏覽器端瑰谜,

cookie可以被用戶禁止

cookie不安全(對于敏感數(shù)據(jù),需要加密)

cookie只能保存少量的數(shù)據(jù)(大約是4k)树绩,cookie的數(shù)量也有限制(大約是幾百個)萨脑,不同瀏覽器設置不一樣,反正都不多

cookie只能保存字符串

對服務器壓力小

使用session的缺點

一般是寄生在Cookie下的饺饭,當Cookie被禁止渤早,Session也被禁止

當然可以通過url重寫來擺脫cookie

當用戶訪問量很大時,對服務器壓力大

我們現(xiàn)在知道session是將用戶信息儲存在服務器上面,如果訪問服務器的用戶越來越多,那么服務器上面的session也越來越多, session會對服務器造成壓力砰奕,影響服務器的負載.如果Session內(nèi)容過于復雜蛛芥,當大量客戶訪問服務器時還可能會導致內(nèi)存溢出。

用戶信息丟失,或者說用戶訪問的不是這臺服務器的情況下,就會出現(xiàn)數(shù)據(jù)庫丟失.

cookie和session的區(qū)別

具體來說cookie機制采用的是在客戶端保持狀態(tài)的方案军援,而session機制采用的是在服務器端保持狀態(tài)的方案。同時我們也看到称勋,

由于采用服務器端保持狀態(tài)的方案在客戶端也需要保存一個標識胸哥,所以session機制可能需要借助于cookie機制來達到保存標識的目的

cookie不是很安全,別人可以分析存放在本地的cookie并進行cookie欺騙赡鲜,考慮到安全應當使用session

? ? session會在一定時間內(nèi)保存在服務器上空厌。當訪問增多庐船,會比較占用你服務器的性能,考慮到減輕服務器性能方面嘲更,應當使用cookie

? ? 單個cookie保存的數(shù)據(jù)不能超過4k,很多瀏覽器都限制一個站點最多保存20個cookie筐钟。

? ? 可以將登陸信息等重要信息存放為session。

5.擴展思考


?

一般的驗證方式

?

1.生成3個cookie,分別使用用戶名赋朦,登錄時間篓冲,用戶名+登錄時間DES加密后的密文

?

2.使用cookie與session進行比對驗證

?

3.使用JWT生成token,解密出被加密的部分進行驗證。

?

?

JSON Web Token(JWT)是一個開放的標準(RFC 7519)宠哄,它定義了一個緊湊且自包含的方式壹将,用于在各方之間以JSON對象安全地傳輸信息。

?

一個JWT實際上就是一個字符串毛嫉,它由三部分組成诽俯,頭部、載荷與簽名承粤。

?

JWT的頭部用于描述關于該JWT的最基本的信息暴区,例如其類型以及簽名所用的算法等。這也可以被表示成一個JSON對象辛臊。

?

"typ": "JWT",

?

"alg": "HS256"

?

當然頭部要進行BASE64編碼

?

?

簽名(Signature)

?

將上面的兩個編碼后的字符串都用句號.連接在一起(頭部在前)例如頭部使用base64編碼后為123.456

?

我們將上面拼接完的字符串用HS256算法進行加密仙粱。在加密的時候,還需要我們自己提供一個密鑰(secret)浪讳。 得到789.

?

將他們完全拼在一起,我們就得到了完整的JWT"123.456.789"在我們的請求URL中會帶上這串JWT字符串

?

?

載荷

iss:該JWT的簽發(fā)者缰盏,? 是否使用是可選的;

sub:該JWT所面向的用戶淹遵,是否使用是可選的口猜;

aud:接收該JWT的一方, 是否使用是可選的透揣;

exp(expires):什么時候過期济炎,這里是一個Unix時間戳,是否使用是可選的辐真;

iat(issued at):在什么時候簽發(fā)的(UNIX時間)须尚,是否使用是可選的;

nbf (Not Before):如果當前時間在nbf里的時間之前侍咱,則Token不被接受耐床;一般都會留一些余地,比如幾分鐘楔脯;撩轰,是否使用是可選的;

?

JWT的Token認證

?

?

JWT的Token認證

?

?

JWT的Token認證

?

?

JWT的Token認證

?

?

JWT的Token認證

?

?

JWT的Token認證

?

?

JWT的Token認證

?

?

JWT的Token認證

?

? ?

? ?

對Token認證的五點認識

? ?

對Token認證機制有5點直接注意的地方:

? ?

一個Token就是一些信息的集合;

? ?

在Token中包含足夠多的信息堪嫂,以便在后續(xù)請求中減少查詢數(shù)據(jù)庫的幾率偎箫;

? ?

服務端需要對cookie和HTTP Authrorization Header進行Token信息的檢查;

? ?

基于上一點皆串,你可以用一套token認證代碼來面對瀏覽器類客戶端和非瀏覽器類客戶端淹办;

? ?

因為token是被簽名的,所以我們可以認為一個可以解碼認證通過的token是由我們系統(tǒng)發(fā)放的恶复,其中帶的信息是合法有效的怜森;

? ?

?

Token機制相對于Cookie機制又有什么好處呢?

?

支持跨域訪問:Cookie是不允許垮域訪問,這一點對Token機制是不存在的,前提是傳輸?shù)挠脩粽J證信息通過HTTP頭傳輸.

?

無狀態(tài)(也稱:服務端可擴展行):Token機制在服務端不需要存儲session信息寂玲,因為Token自身包含了所有登錄用戶的信息塔插,只需要在客戶端的cookie或本地介質(zhì)存儲狀態(tài)信息.

?

更適用CDN:可以通過內(nèi)容分發(fā)網(wǎng)絡請求你服務端的所有資料(如:javascript,HTML,圖片等)拓哟,而你的服務端只要提供API即可.

?

?

去耦:不需要綁定到一個特定的身份驗證方案想许。Token可以在任何地方生成,只要在你的API被調(diào)用的時候断序,你可以進行Token生成調(diào)用即可.

?

更適用于移動應用:當你的客戶端是一個原生平臺(iOS, Android流纹,Windows 8等)時,Cookie是不被支持的(你需要通過Cookie容器進行處理)违诗,這時采用Token認證機制就會簡單得多漱凝。

?

CSRF:因為不再依賴于Cookie,所以你就不需要考慮對CSRF(跨站請求偽造)的防范诸迟。

?

性能:一次網(wǎng)絡往返時間(通過數(shù)據(jù)庫查詢session信息)總比做一次HMACSHA256計算 的Token驗證和解析要費時得多.

?

?

不需要為登錄頁面做特殊處理:如果你使用Protractor做功能測試的時候茸炒,不再需要為登錄頁面做特殊處理.

?

基于標準化:你的API可以采用標準化的 JSON Web Token (JWT).這個標準已經(jīng)存在多個后端庫(.NET, Ruby, Java,Python, PHP)和多家公司的支持(如:Firebase,Google, Microsoft).

? ? ?

? ? ? ? ?

7.參考文獻

? ? ? ? ?

百度

?

http://blog.csdn.net/fangaoxin/article/details/6952954/

?

http://www.cnblogs.com/xiekeli/p/5607107.html

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市阵苇,隨后出現(xiàn)的幾起案子壁公,更是在濱河造成了極大的恐慌,老刑警劉巖绅项,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件紊册,死亡現(xiàn)場離奇詭異,居然都是意外死亡快耿,警方通過查閱死者的電腦和手機囊陡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來掀亥,“玉大人撞反,你說我怎么就攤上這事√禄ǎ” “怎么了痢畜?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵垛膝,是天一觀的道長鳍侣。 經(jīng)常有香客問我丁稀,道長,這世上最難降的妖魔是什么倚聚? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任线衫,我火速辦了婚禮,結果婚禮上惑折,老公的妹妹穿的比我還像新娘授账。我一直安慰自己,他們只是感情好惨驶,可當我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布白热。 她就那樣靜靜地躺著,像睡著了一般粗卜。 火紅的嫁衣襯著肌膚如雪屋确。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天续扔,我揣著相機與錄音攻臀,去河邊找鬼。 笑死纱昧,一個胖子當著我的面吹牛刨啸,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播识脆,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼设联,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了灼捂?” 一聲冷哼從身側響起离例,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎纵东,沒想到半個月后粘招,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡偎球,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年洒扎,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片衰絮。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡袍冷,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出猫牡,到底是詐尸還是另有隱情胡诗,我是刑警寧澤,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站煌恢,受9級特大地震影響骇陈,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜瑰抵,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一你雌、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧二汛,春花似錦婿崭、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至婿着,卻和暖如春授瘦,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背祟身。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工奥务, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人袜硫。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓氯葬,卻偏偏與公主長得像,于是被迫代替她去往敵國和親婉陷。 傳聞我的和親對象是個殘疾皇子帚称,可洞房花燭夜當晚...
    茶點故事閱讀 42,792評論 2 345

推薦閱讀更多精彩內(nèi)容