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ī)制景描。