cookie,session剖煌,token的理解

cookie

cookie 是一個非常具體的東西材鹦,指的就是瀏覽器里面能永久存儲的一種數(shù)據(jù),僅僅是瀏覽器實(shí)現(xiàn)的一種數(shù)據(jù)存儲功能耕姊。

cookie由服務(wù)器生成桶唐,發(fā)送給瀏覽器,瀏覽器把cookie以kv形式保存到某個目錄下的文本文件內(nèi)茉兰,下一次請求同一網(wǎng)站時會把該cookie發(fā)送給服務(wù)器尤泽。由于cookie是存在客戶端上的,所以瀏覽器加入了一些限制確保cookie不會被惡意使用规脸,同時不會占據(jù)太多磁盤空間坯约,所以每個域的cookie數(shù)量是有限的。

Session

session 從字面上講莫鸭,就是會話闹丐。這個就類似于你和一個人交談,你怎么知道當(dāng)前和你交談的是張三而不是李四呢被因?對方肯定有某種特征(長相等)表明他就是張三卿拴。

session 也是類似的道理,服務(wù)器要知道當(dāng)前發(fā)請求給自己的是誰梨与。為了做這種區(qū)分堕花,服務(wù)器就要給每個客戶端分配不同的“身份標(biāo)識”,然后客戶端每次向服務(wù)器發(fā)請求的時候蛋欣,都帶上這個“身份標(biāo)識”,服務(wù)器就知道這個請求來自于誰了如贷。至于客戶端怎么保存這個“身份標(biāo)識”陷虎,可以有很多種方式,對于瀏覽器客戶端杠袱,大家都默認(rèn)采用 cookie 的方式尚猿。

服務(wù)器使用session把用戶的信息臨時保存在了服務(wù)器上,用戶離開網(wǎng)站后session會被銷毀楣富。這種用戶信息存儲方式相對cookie來說更安全凿掂,可是session有一個缺陷:如果web服務(wù)器做了負(fù)載均衡,那么下一個操作請求到了另一臺服務(wù)器的時候session會丟失。

Token

在Web領(lǐng)域基于Token的身份驗(yàn)證隨處可見庄萎。在大多數(shù)使用Web API的互聯(lián)網(wǎng)公司中踪少,tokens 是多用戶下處理認(rèn)證的最佳方式。

以下幾點(diǎn)特性會讓你在程序中使用基于Token的身份驗(yàn)證

1.無狀態(tài)糠涛、可擴(kuò)展

2.支持移動設(shè)備

3.跨程序調(diào)用

4.安全

那些使用基于Token的身份驗(yàn)證的大佬們

大部分你見到過的API和Web應(yīng)用都使用tokens援奢。例如Facebook, Twitter, Google+, GitHub等。

Token的起源

在介紹基于Token的身份驗(yàn)證的原理與優(yōu)勢之前忍捡,不妨先看看之前的認(rèn)證都是怎么做的集漾。

基于服務(wù)器的驗(yàn)證

我們都是知道HTTP協(xié)議是無狀態(tài)的,這種無狀態(tài)意味著程序需要驗(yàn)證每一次請求砸脊,從而辨別客戶端的身份具篇。

在這之前,程序都是通過在服務(wù)端存儲的登錄信息來辨別請求的凌埂。這種方式一般都是通過存儲Session來完成驱显。

下圖展示了基于服務(wù)器驗(yàn)證的原理

隨著Web,應(yīng)用程序侨舆,已經(jīng)移動端的興起秒紧,這種驗(yàn)證的方式逐漸暴露出了問題。尤其是在可擴(kuò)展性方面挨下。

基于服務(wù)器驗(yàn)證方式暴露的一些問題

1.Seesion:每次認(rèn)證用戶發(fā)起請求時熔恢,服務(wù)器需要去創(chuàng)建一個記錄來存儲信息。當(dāng)越來越多的用戶發(fā)請求時臭笆,內(nèi)存的開銷也會不斷增加叙淌。

2.可擴(kuò)展性:在服務(wù)端的內(nèi)存中使用Seesion存儲登錄信息,伴隨而來的是可擴(kuò)展性問題愁铺。

3.CORS(跨域資源共享):當(dāng)我們需要讓數(shù)據(jù)跨多臺移動設(shè)備上使用時鹰霍,跨域資源的共享會是一個讓人頭疼的問題。在使用Ajax抓取另一個域的資源茵乱,就可以會出現(xiàn)禁止請求的情況茂洒。

4.CSRF(跨站請求偽造):用戶在訪問銀行網(wǎng)站時,他們很容易受到跨站請求偽造的攻擊瓶竭,并且能夠被利用其訪問其他的網(wǎng)站督勺。

在這些問題中,可擴(kuò)展行是最突出的斤贰。因此我們有必要去尋求一種更有行之有效的方法智哀。

基于Token的驗(yàn)證原理

基于Token的身份驗(yàn)證是無狀態(tài)的,我們不將用戶信息存在服務(wù)器或Session中荧恍。

這種概念解決了在服務(wù)端存儲信息時的許多問題

NoSession意味著你的程序可以根據(jù)需要去增減機(jī)器瓷叫,而不用去擔(dān)心用戶是否登錄。

基于Token的身份驗(yàn)證的過程如下:

1.用戶通過用戶名和密碼發(fā)送請求。

2.程序驗(yàn)證摹菠。

3.程序返回一個簽名的token 給客戶端盒卸。

4.客戶端儲存token,并且每次用于每次發(fā)送請求。

5.服務(wù)端驗(yàn)證token并返回?cái)?shù)據(jù)辨嗽。

每一次請求都需要token世落。token應(yīng)該在HTTP的頭部發(fā)送從而保證了Http請求無狀態(tài)。我們同樣通過設(shè)置服務(wù)器屬性Access-Control-Allow-Origin:* 糟需,讓服務(wù)器能接受到來自所有域的請求屉佳。需要主要的是,在ACAO頭部標(biāo)明(designating)*時洲押,不得帶有像HTTP認(rèn)證武花,客戶端SSL證書和cookies的證書。

實(shí)現(xiàn)思路:

1.用戶登錄校驗(yàn)杈帐,校驗(yàn)成功后就返回Token給客戶端体箕。

2.客戶端收到數(shù)據(jù)后保存在客戶端

3.客戶端每次訪問API是攜帶Token到服務(wù)器端。

4.服務(wù)器端采用filter過濾器校驗(yàn)挑童。校驗(yàn)成功則返回請求數(shù)據(jù)累铅,校驗(yàn)失敗則返回錯誤碼

Tokens的優(yōu)勢

無狀態(tài)、可擴(kuò)展

在客戶端存儲的Tokens是無狀態(tài)的站叼,并且能夠被擴(kuò)展娃兽。基于這種無狀態(tài)和不存儲Session信息尽楔,負(fù)載負(fù)載均衡器能夠?qū)⒂脩粜畔囊粋€服務(wù)傳到其他服務(wù)器上投储。

如果我們將已驗(yàn)證的用戶的信息保存在Session中,則每次請求都需要用戶向已驗(yàn)證的服務(wù)器發(fā)送驗(yàn)證信息(稱為Session親和性)阔馋。用戶量大時玛荞,可能會造成

一些擁堵。

但是不要著急呕寝。使用tokens之后這些問題都迎刃而解勋眯,因?yàn)閠okens自己hold住了用戶的驗(yàn)證信息。

安全性

請求中發(fā)送token而不再是發(fā)送cookie能夠防止CSRF(跨站請求偽造)下梢。即使在客戶端使用cookie存儲token客蹋,cookie也僅僅是一個存儲機(jī)制而不是用于認(rèn)證。不將信息存儲在Session中怔球,讓我們少了對session操作嚼酝。

token是有時效的浮还,一段時間之后用戶需要重新驗(yàn)證。我們也不一定需要等到token自動失效,token有撤回的操作爆价,通過token revocataion可以使一個特定的token或是一組有相同認(rèn)證的token無效。

可擴(kuò)展性()

Tokens能夠創(chuàng)建與其它程序共享權(quán)限的程序涎跨。例如,能將一個隨便的社交帳號和自己的大號(Fackbook或是Twitter)聯(lián)系起來崭歧。當(dāng)通過服務(wù)登錄Twitter(我們將這個過程Buffer)時隅很,我們可以將這些Buffer附到Twitter的數(shù)據(jù)流上(we are allowing Buffer to post to our Twitter stream)。

使用tokens時率碾,可以提供可選的權(quán)限給第三方應(yīng)用程序叔营。當(dāng)用戶想讓另一個應(yīng)用程序訪問它們的數(shù)據(jù),我們可以通過建立自己的API所宰,得出特殊權(quán)限的tokens绒尊。

多平臺跨域

我們提前先來談?wù)撘幌翪ORS(跨域資源共享),對應(yīng)用程序和服務(wù)進(jìn)行擴(kuò)展的時候仔粥,需要介入各種各種的設(shè)備和應(yīng)用程序婴谱。

Having our API just serve data, we can also make the design choice to serve assets from a CDN. This eliminates the issues that CORS brings up after we set a quick header configuration for our application.

只要用戶有一個通過了驗(yàn)證的token,數(shù)據(jù)和資源就能夠在任何域上被請求到躯泰。

基于標(biāo)準(zhǔn)

創(chuàng)建token的時候谭羔,你可以設(shè)定一些選項(xiàng)。我們在后續(xù)的文章中會進(jìn)行更加詳盡的描述麦向,但是標(biāo)準(zhǔn)的用法會在JSON Web Tokens體現(xiàn)瘟裸。

最近的程序和文檔是供給JSON Web Tokens的。它支持眾多的語言磕蛇。這意味在未來的使用中你可以真正的轉(zhuǎn)換你的認(rèn)證機(jī)制景描。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市秀撇,隨后出現(xiàn)的幾起案子超棺,更是在濱河造成了極大的恐慌,老刑警劉巖呵燕,帶你破解...
    沈念sama閱讀 216,591評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件棠绘,死亡現(xiàn)場離奇詭異,居然都是意外死亡再扭,警方通過查閱死者的電腦和手機(jī)氧苍,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來泛范,“玉大人让虐,你說我怎么就攤上這事“盏矗” “怎么了赡突?”我有些...
    開封第一講書人閱讀 162,823評論 0 353
  • 文/不壞的土叔 我叫張陵对扶,是天一觀的道長。 經(jīng)常有香客問我惭缰,道長浪南,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,204評論 1 292
  • 正文 為了忘掉前任漱受,我火速辦了婚禮络凿,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘昂羡。我一直安慰自己絮记,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,228評論 6 388
  • 文/花漫 我一把揭開白布虐先。 她就那樣靜靜地躺著到千,像睡著了一般。 火紅的嫁衣襯著肌膚如雪赴穗。 梳的紋絲不亂的頭發(fā)上憔四,一...
    開封第一講書人閱讀 51,190評論 1 299
  • 那天,我揣著相機(jī)與錄音般眉,去河邊找鬼了赵。 笑死,一個胖子當(dāng)著我的面吹牛甸赃,可吹牛的內(nèi)容都是我干的柿汛。 我是一名探鬼主播,決...
    沈念sama閱讀 40,078評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼埠对,長吁一口氣:“原來是場噩夢啊……” “哼络断!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起项玛,我...
    開封第一講書人閱讀 38,923評論 0 274
  • 序言:老撾萬榮一對情侶失蹤貌笨,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后襟沮,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體锥惋,經(jīng)...
    沈念sama閱讀 45,334評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,550評論 2 333
  • 正文 我和宋清朗相戀三年开伏,在試婚紗的時候發(fā)現(xiàn)自己被綠了膀跌。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,727評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡固灵,死狀恐怖捅伤,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情巫玻,我是刑警寧澤丛忆,帶...
    沈念sama閱讀 35,428評論 5 343
  • 正文 年R本政府宣布困介,位于F島的核電站,受9級特大地震影響蘸际,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜徒扶,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,022評論 3 326
  • 文/蒙蒙 一粮彤、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧姜骡,春花似錦导坟、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至康栈,卻和暖如春递递,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背啥么。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評論 1 269
  • 我被黑心中介騙來泰國打工登舞, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人悬荣。 一個月前我還...
    沈念sama閱讀 47,734評論 2 368
  • 正文 我出身青樓菠秒,卻偏偏與公主長得像,于是被迫代替她去往敵國和親氯迂。 傳聞我的和親對象是個殘疾皇子践叠,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,619評論 2 354

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