安全認(rèn)證機(jī)制

安全認(rèn)證機(jī)制

最近項(xiàng)目要用到安全驗(yàn)證了历涝,以前的實(shí)現(xiàn)方式都是單個(gè)服務(wù)模式诅需,加攔截器和cookie即可⊙Γ現(xiàn)在在微服務(wù)上需要實(shí)現(xiàn)單點(diǎn)登錄,重寫了解一下認(rèn)證機(jī)制堰塌。

1. HTTP Basic Auth

最簡單的一種實(shí)現(xiàn)赵刑,每次請(qǐng)求API都提供用戶的賬號(hào)與密碼。但這種方式會(huì)有信息暴露風(fēng)險(xiǎn)场刑。使用的越來越少般此。

2. OAuth

OAuth(開放授權(quán))是一個(gè)開放的授權(quán)標(biāo)準(zhǔn),允許用戶讓第三方應(yīng)用訪問該用戶在某一服務(wù)器上的資源牵现,而無需將用戶名和密碼提供給第三方應(yīng)用恤煞。如:微信/QQ登錄第三方網(wǎng)站等。

OAuth允許用戶提供一個(gè)令牌施籍,而不是賬號(hào)和密碼來訪問用戶的數(shù)據(jù)居扒。每一個(gè)令牌授權(quán)一個(gè)特定的第三方系統(tǒng)在特定的時(shí)間段內(nèi)訪問特定的資源。丑慎。這 樣喜喂,OAuth讓用戶可以授權(quán)第三方網(wǎng)站訪問他們存儲(chǔ)在另外服務(wù)提供者的某些特定信 息,而非所有內(nèi)容竿裂。

OAuth2.0流程如下:


3. Cookie-Session 機(jī)制

????該機(jī)制為一次請(qǐng)求認(rèn)證在服務(wù)端創(chuàng)建一個(gè)Session對(duì)象玉吁,同時(shí)在客戶端創(chuàng)建一個(gè)Cookie對(duì)象。通過客戶端上帶來的Cookie與服務(wù)端的Session對(duì)象匹配來實(shí)現(xiàn)狀態(tài)管理腻异。cookie與session可以設(shè)置過期時(shí)間进副。


4. JWT實(shí)現(xiàn)令牌(token)

????一種無狀態(tài)的方式,在服務(wù)端不需要存儲(chǔ)用戶的登錄記錄悔常。

流程如下:


????客戶端使用用戶名與密碼登錄

????服務(wù)端收到請(qǐng)求影斑,驗(yàn)證用戶名與密碼

????驗(yàn)證成功后,服務(wù)端簽發(fā)一個(gè)token机打,再把token發(fā)送給客戶端

????客戶端收到并存儲(chǔ)token矫户,如放在cookie中 ,發(fā)送的時(shí)候它應(yīng)該保存在請(qǐng)求頭里

????客戶端每次去訪問服務(wù)器帶著token

????服務(wù)器收到請(qǐng)求残邀,驗(yàn)證token皆辽,如果驗(yàn)證成功,就返回響應(yīng)

5. Token對(duì)于Cookie機(jī)制的好處

????支持跨域訪問: Cookie是不允許垮域訪問的芥挣,這一點(diǎn)對(duì)Token機(jī)制是不存在的驱闷,前提 是傳輸?shù)挠脩粽J(rèn)證信息通過HTTP頭傳輸.

????無狀態(tài)(也稱:服務(wù)端可擴(kuò)展行):Token機(jī)制在服務(wù)端不需要存儲(chǔ)session信息,因?yàn)?Token 自身包含了所有登錄用戶的信息空免,只需要在客戶端的? ?cookie或本地介質(zhì)存儲(chǔ) 狀態(tài)信息.

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

????去耦: 不需要綁定到一個(gè)特定的身份驗(yàn)證方案鼓蜒。Token可以在任何地方生成痹换,只要在 你的API被調(diào)用的時(shí)候,你可以進(jìn)行Token生成調(diào)用即可.

????擴(kuò)展性: 使用session用戶認(rèn)證之后都弹,服務(wù)端做認(rèn)證記錄娇豫,如果認(rèn)證的記錄被保存在內(nèi)存中的話,這意味著用戶下次請(qǐng)求還必須要請(qǐng)求在這臺(tái)服務(wù)器上,這樣才能拿到授權(quán)的資源畅厢,這樣在分布式的應(yīng)用上冯痢,相應(yīng)的限制了負(fù)載均衡器的能力。這也意味著限制了應(yīng)用的擴(kuò)展能力框杜。

????更適用于移動(dòng)應(yīng)用: 當(dāng)你的客戶端是一個(gè)原生平臺(tái)(iOS, Android浦楣,Windows 8等) 時(shí),Cookie是不被支持的(你需要通過Cookie容器進(jìn)行處理)咪辱,這時(shí)采用Token認(rèn) 證機(jī)制就會(huì)簡單得多振劳。

????CSRF:因?yàn)椴辉僖蕾囉贑ookie,所以你就不需要考慮對(duì)CSRF(跨站請(qǐng)求偽造)的防 范油狂。

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

????不需要為登錄頁面做特殊處理: 如果你使用Protractor 做功能測試的時(shí)候历恐,不再需要 為登錄頁面做特殊處理.

????基于標(biāo)準(zhǔn)化:你的API可以采用標(biāo)準(zhǔn)化的 JSON Web Token (JWT). 這個(gè)標(biāo)準(zhǔn)已經(jīng)存在 多個(gè)后端庫(.NET, Ruby, Java,Python, PHP)和多家公司的支持

6. JWT

????JSON Web Token: 三部分組成:header+payload+signature

????頭信息指定了該JWT使用的簽名算法:

????header = '{"alg":"HS256","typ":"JWT"}'

????消息體包含了JWT的意圖,包含一些需要傳輸?shù)南ⅲ?/p>

????????payload = '{"loggedInAs":"admin","iat":1422779638}'//iat表示令牌生成的時(shí)間

????未簽名的令牌由base64url編碼的頭信息和消息體拼接而成(使用"."分隔)专筷,簽名則通過私有的key計(jì)算而成:

????????key='secretkey'//服務(wù)器的私鑰

????????unsignedToken=encodeBase64(header)+'.'+encodeBase64(payload)

????????signature=HMAC-SHA256(key, unsignedToken)

????最后在未簽名的令牌尾部拼接上base64url編碼的簽名(同樣使用"."分隔)就是JWT了:

????????token=encodeBase64(header)+'.'+encodeBase64(payload)+'.'+encodeBase64(signature)

?

????# token看起來像這樣: ????????eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJsb2dnZWRJbkFzIjoiYWRtaW4iLCJpYXQiOjE0MjI3Nzk2Mzh9.gzSraSYS8EXBxLN_oWnFSRgCzcmJmMjLiuyu5CSpyHI

????一般使用為Authorization: Bearer token串形式

jwt誤區(qū)

防止token被竊取

CSRF 簡介

CSRF攻擊攻擊原理及過程如下:

? ? 1. 用戶C打開瀏覽器弱贼,訪問受信任網(wǎng)站A,輸入用戶名和密碼請(qǐng)求登錄網(wǎng)站A磷蛹;

? ? 2.在用戶信息通過驗(yàn)證后吮旅,網(wǎng)站A產(chǎn)生Cookie信息并返回給瀏覽器,此時(shí)用戶登錄網(wǎng)站A成功味咳,可以正常發(fā)送請(qǐng)求到網(wǎng)站A庇勃;

? ? 3. 用戶未退出網(wǎng)站A之前,在同一瀏覽器中槽驶,打開一個(gè)TAB頁訪問網(wǎng)站B匪凉;

? 4. 網(wǎng)站B接收到用戶請(qǐng)求后,返回一些攻擊性代碼捺檬,并發(fā)出一個(gè)請(qǐng)求要求訪問第三方站點(diǎn)A再层;

? 5. 瀏覽器在接收到這些攻擊性代碼后,根據(jù)網(wǎng)站B的請(qǐng)求堡纬,在用戶不知情的情況下攜帶Cookie信息聂受,向網(wǎng)站A發(fā)出請(qǐng)求。網(wǎng)站A并不知道該請(qǐng)求其實(shí)是由B發(fā)起的烤镐,所以會(huì)根據(jù)用戶C的Cookie信息以C的權(quán)限處理該請(qǐng)求蛋济,導(dǎo)致來自網(wǎng)站B的惡意代碼被執(zhí)行。

(一般情況下炮叶,關(guān)閉網(wǎng)頁后cookie即被刪除)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末碗旅,一起剝皮案震驚了整個(gè)濱河市渡处,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌祟辟,老刑警劉巖医瘫,帶你破解...
    沈念sama閱讀 219,427評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件渣叛,死亡現(xiàn)場離奇詭異碉碉,居然都是意外死亡角钩,警方通過查閱死者的電腦和手機(jī)利凑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門缀雳,熙熙樓的掌柜王于貴愁眉苦臉地迎上來已旧,“玉大人嫂便,你說我怎么就攤上這事念赶∞趾校” “怎么了怖竭?”我有些...
    開封第一講書人閱讀 165,747評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長陡蝇。 經(jīng)常有香客問我侵状,道長,這世上最難降的妖魔是什么毅整? 我笑而不...
    開封第一講書人閱讀 58,939評(píng)論 1 295
  • 正文 為了忘掉前任趣兄,我火速辦了婚禮,結(jié)果婚禮上悼嫉,老公的妹妹穿的比我還像新娘艇潭。我一直安慰自己,他們只是感情好戏蔑,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,955評(píng)論 6 392
  • 文/花漫 我一把揭開白布蹋凝。 她就那樣靜靜地躺著,像睡著了一般总棵。 火紅的嫁衣襯著肌膚如雪鳍寂。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,737評(píng)論 1 305
  • 那天情龄,我揣著相機(jī)與錄音迄汛,去河邊找鬼。 笑死骤视,一個(gè)胖子當(dāng)著我的面吹牛鞍爱,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播专酗,決...
    沈念sama閱讀 40,448評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼睹逃,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了祷肯?” 一聲冷哼從身側(cè)響起沉填,我...
    開封第一講書人閱讀 39,352評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤疗隶,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后翼闹,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體斑鼻,經(jīng)...
    沈念sama閱讀 45,834評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,992評(píng)論 3 338
  • 正文 我和宋清朗相戀三年橄碾,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了卵沉。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片颠锉。...
    茶點(diǎn)故事閱讀 40,133評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡法牲,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出琼掠,到底是詐尸還是另有隱情拒垃,我是刑警寧澤,帶...
    沈念sama閱讀 35,815評(píng)論 5 346
  • 正文 年R本政府宣布瓷蛙,位于F島的核電站悼瓮,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏艰猬。R本人自食惡果不足惜横堡,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,477評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望冠桃。 院中可真熱鬧命贴,春花似錦、人聲如沸食听。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽樱报。三九已至葬项,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間迹蛤,已是汗流浹背民珍。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評(píng)論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留盗飒,地道東北人穷缤。 一個(gè)月前我還...
    沈念sama閱讀 48,398評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像箩兽,于是被迫代替她去往敵國和親津肛。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,077評(píng)論 2 355