掃二維碼與項(xiàng)目經(jīng)理溝通
我們?cè)谖⑿派?4小時(shí)期待你的聲音
解答本文疑問(wèn)/技術(shù)咨詢(xún)/運(yùn)營(yíng)咨詢(xún)/技術(shù)建議/互聯(lián)網(wǎng)交流
在我們的 java 業(yè)務(wù)系統(tǒng)中,或多或少的會(huì)涉及到權(quán)限、認(rèn)證等類(lèi)似的概念。但是很多小伙伴還是傻傻的分不清這些的概念和區(qū)別,今天我們就來(lái)好好的捋一捋,將其區(qū)別的概念深深的刻在腦海中。

成都創(chuàng)新互聯(lián)公司堅(jiān)持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:網(wǎng)站設(shè)計(jì)制作、成都做網(wǎng)站、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿(mǎn)足客戶(hù)于互聯(lián)網(wǎng)時(shí)代的羅定網(wǎng)站設(shè)計(jì)、移動(dòng)媒體設(shè)計(jì)的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!
百度百科中對(duì)于認(rèn)證的解釋是:身份驗(yàn)證(Authentication),在 .NET Framework 安全中,通過(guò)對(duì)照某些機(jī)構(gòu)檢查用戶(hù)的憑據(jù),發(fā)現(xiàn)和驗(yàn)證主體標(biāo)識(shí)的過(guò)程。
當(dāng)然,今天我們來(lái)討論肯定不會(huì)用這么生硬的詞來(lái)解釋的。
常見(jiàn)的認(rèn)證方式:
所謂授權(quán),就是某個(gè)用戶(hù)授予其他應(yīng)用訪問(wèn)該用戶(hù)某些資源的權(quán)限。
例如,在你安裝手機(jī)應(yīng)用的時(shí)候,APP肯定會(huì)跳出來(lái)問(wèn)是否允許授予權(quán)限(訪問(wèn)相冊(cè)、位置等權(quán)限);你在訪問(wèn)微信小程序時(shí),當(dāng)?shù)卿洉r(shí),小程序會(huì)詢(xún)問(wèn)是否允許授予權(quán)限(獲取昵稱(chēng)、頭像、地區(qū)、性別等個(gè)人信息)
實(shí)現(xiàn)授權(quán)的方式有:cookie、session、token、OAuth
實(shí)現(xiàn)認(rèn)證和授權(quán)的前提是需要一種媒介(證書(shū)) 來(lái)標(biāo)記訪問(wèn)者的身份。
這個(gè)其實(shí)很好理解,身份證大家肯定是都有的。過(guò)身份證,我們可以辦理手機(jī)卡/銀行卡/個(gè)人貸款/交通出行等等,這就是認(rèn)證的憑證。
在互聯(lián)網(wǎng)應(yīng)用中,一般網(wǎng)站會(huì)有兩種模式,游客模式和登錄模式。
HTTP 是無(wú)狀態(tài)的協(xié)議(對(duì)于事務(wù)處理沒(méi)有記憶能力,每次客戶(hù)端和服務(wù)端會(huì)話(huà)完成時(shí),服務(wù)端不會(huì)保存任何會(huì)話(huà)信息):每個(gè)請(qǐng)求都是完全獨(dú)立的,服務(wù)端無(wú)法確認(rèn)當(dāng)前訪問(wèn)者的身份信息,無(wú)法分辨上一次的請(qǐng)求發(fā)送者和這一次的發(fā)送者是不是同一個(gè)人。
所以服務(wù)器與瀏覽器為了進(jìn)行會(huì)話(huà)跟蹤(知道是誰(shuí)在訪問(wèn)我),就必須主動(dòng)的去維護(hù)一個(gè)狀態(tài),這個(gè)狀態(tài)用于告知服務(wù)端前后兩個(gè)請(qǐng)求是否來(lái)自同一瀏覽器。而這個(gè)狀態(tài)需要通過(guò) cookie 或者 session 去實(shí)現(xiàn)。
cookie 存儲(chǔ)在客戶(hù)端:cookie 是服務(wù)器發(fā)送到用戶(hù)瀏覽器并保存在本地的一小塊數(shù)據(jù),它會(huì)在瀏覽器下次向同一服務(wù)器再發(fā)起請(qǐng)求時(shí)被攜帶并發(fā)送到服務(wù)器上。
cookie 是不可跨域的:每個(gè) cookie 都會(huì)綁定單一的域名,無(wú)法在別的域名下獲取使用,一級(jí)域名和二級(jí)域名之間是允許共享使用的(靠的是 domain)。
session 是另外一種記錄服務(wù)器和客戶(hù)端會(huì)話(huà)狀態(tài)的機(jī)制,通常情況下,session 是基于 cookie 實(shí)現(xiàn)的,session 存儲(chǔ)在服務(wù)器端,sessionId 會(huì)被存儲(chǔ)到客戶(hù)端的cookie 中。
session 認(rèn)證流程:
目前,大部分系統(tǒng)都是根據(jù)此原理來(lái)驗(yàn)證用戶(hù)的登錄狀態(tài)的。
這個(gè)應(yīng)該是面試中問(wèn)的頻率非常高的一個(gè)問(wèn)題了。
Acesss Token
訪問(wèn)資源接口(API)時(shí)所需要的資源憑證,簡(jiǎn)單 token 的組成:uid(用戶(hù)唯一的身份標(biāo)識(shí))、time(當(dāng)前時(shí)間的時(shí)間戳)、sign(簽名,token 的前幾位以哈希算法壓縮成的一定長(zhǎng)度的十六進(jìn)制字符串)
Acesss Token的特點(diǎn)是 * 服務(wù)端無(wú)狀態(tài)化、可擴(kuò)展性好 * 支持移動(dòng)端設(shè)備 * 安全 * 支持跨程序調(diào)用
token 的身份驗(yàn)證流程如下:
refresh token 是專(zhuān)用于刷新 access token 的 token。
如果沒(méi)有 refresh token,也可以刷新 access token,但每次刷新都要用戶(hù)輸入登錄用戶(hù)名與密碼,會(huì)很麻煩。有了 refresh token,可以減少這個(gè)麻煩,客戶(hù)端直接用 refresh token 去更新 access token,無(wú)需用戶(hù)進(jìn)行額外的操作。
Access Token 的有效期比較短,當(dāng) Acesss Token 由于過(guò)期而失效時(shí),使用 Refresh Token 就可以獲取到新的 Token,如果 Refresh Token 也失效了,用戶(hù)就只能重新登錄了。
Refresh Token 及過(guò)期時(shí)間是存儲(chǔ)在服務(wù)器的數(shù)據(jù)庫(kù)中,只有在申請(qǐng)新的 Acesss Token 時(shí)才會(huì)驗(yàn)證,不會(huì)對(duì)業(yè)務(wù)接口響應(yīng)時(shí)間造成影響,也不需要向 Session 一樣一直保持在內(nèi)存中以應(yīng)對(duì)大量的請(qǐng)求。
Session 是一種記錄服務(wù)器和客戶(hù)端會(huì)話(huà)狀態(tài)的機(jī)制,使服務(wù)端有狀態(tài)化,可以記錄會(huì)話(huà)信息。而 Token 是令牌,訪問(wèn)資源接口(API)時(shí)所需要的資源憑證。Token 使服務(wù)端無(wú)狀態(tài)化,不會(huì)存儲(chǔ)會(huì)話(huà)信息。
Session 和 Token 并不矛盾,作為身份認(rèn)證 Token 安全性比 Session 好,因?yàn)槊恳粋€(gè)請(qǐng)求都有簽名還能防止監(jiān)聽(tīng)以及重放攻擊,而 Session 就必須依賴(lài)鏈路層來(lái)保障通訊安全了。如果你需要實(shí)現(xiàn)有狀態(tài)的會(huì)話(huà),仍然可以增加 Session 來(lái)在服務(wù)器端保存一些狀態(tài)。
所謂 Session 認(rèn)證只是簡(jiǎn)單的把 User 信息存儲(chǔ)到 Session 里,因?yàn)?SessionID 的不可預(yù)測(cè)性,暫且認(rèn)為是安全的。而 Token ,如果指的是 OAuth Token 或類(lèi)似的機(jī)制的話(huà),提供的是 認(rèn)證 和 授權(quán) ,認(rèn)證是針對(duì)用戶(hù),授權(quán)是針對(duì) App 。其目的是讓某 App 有權(quán)利訪問(wèn)某用戶(hù)的信息。這里的 Token 是唯一的。不可以轉(zhuǎn)移到其它 App上,也不可以轉(zhuǎn)到其它用戶(hù)上。Session 只提供一種簡(jiǎn)單的認(rèn)證,即只要有此 SessionID ,即認(rèn)為有此 User 的全部權(quán)利。是需要嚴(yán)格保密的,這個(gè)數(shù)據(jù)應(yīng)該只保存在站方,不應(yīng)該共享給其它網(wǎng)站或者第三方 App。
所以簡(jiǎn)單來(lái)說(shuō):如果你的用戶(hù)數(shù)據(jù)可能需要和第三方共享,或者允許第三方調(diào)用 API 接口,用 Token 。如果永遠(yuǎn)只是自己的網(wǎng)站,自己的 App,用什么就無(wú)所謂了。
JSON Web Token(簡(jiǎn)稱(chēng) JWT)是目前最流行的跨域認(rèn)證解決方案
JWT 是為了在網(wǎng)絡(luò)應(yīng)用環(huán)境間傳遞聲明而執(zhí)行的一種基于 JSON 的開(kāi)放標(biāo)準(zhǔn)(RFC 7519)。JWT 的聲明一般被用來(lái)在身份提供者和服務(wù)提供者間傳遞被認(rèn)證的用戶(hù)身份信息,以便于從資源服務(wù)器獲取資源。比如用在用戶(hù)登錄上。
可以使用 HMAC 算法或者是 RSA 的公/私秘鑰對(duì) JWT 進(jìn)行簽名。因?yàn)閿?shù)字簽名的存在,這些傳遞的信息是可信的。
JWT 認(rèn)證流程:

我們?cè)谖⑿派?4小時(shí)期待你的聲音
解答本文疑問(wèn)/技術(shù)咨詢(xún)/運(yùn)營(yíng)咨詢(xún)/技術(shù)建議/互聯(lián)網(wǎng)交流