摘要:最近,項(xiàng)目的安全認(rèn)證機(jī)制全面采用。為了伸縮性考慮,采用機(jī)制,必然面臨著應(yīng)用狀態(tài)的問(wèn)題,而且必然牽涉到的復(fù)制。為了安全性考慮,機(jī)制僅驗(yàn)證時(shí)天然對(duì)免疫。若有可能,使用標(biāo)志。采用來(lái)防止這是因?yàn)椋谡军c(diǎn)上發(fā)起向站點(diǎn)的請(qǐng)求時(shí),站點(diǎn)的同樣會(huì)被發(fā)送給。
最近,項(xiàng)目的安全認(rèn)證機(jī)制全面采用JWT。現(xiàn)在,趁整個(gè)工作基本告一段落之際,將一些知識(shí)點(diǎn)總結(jié)一下發(fā)布出來(lái)。
為什么要遷移?原因很簡(jiǎn)單,就以下幾點(diǎn):
為了遷移到微服務(wù)架構(gòu),由于服務(wù)分拆之后,單一的登錄入口點(diǎn)消失了,采用Token是必然之選。
為了伸縮性考慮,采用Cookie + Session機(jī)制,必然面臨著應(yīng)用狀態(tài)的問(wèn)題,而且必然牽涉到session的復(fù)制。采用Token,天然避免這一點(diǎn)。這里并非是指完全無(wú)Session化,但起碼可以降至最少。
為了移動(dòng)端考慮,Token更適合移動(dòng)端,比Cookie更靈活了。
為了安全性考慮,Token機(jī)制【僅驗(yàn)證request header時(shí)】天然對(duì)CSRF免疫。
JWT為何物?JWT由三部分組成:header + payload + signature,每部分是一個(gè)Json表示。最終的Token對(duì)這三部分進(jìn)行編碼之后的字符串,中間用“.”分割:
token = encodeBase64(header) + "." + encodeBase64(payload) + "." + encodeBase64(signature) # token is now: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJsb2dnZWRJbkFzIjoiYWRtaW4iLCJpYXQiOjE0MjI3Nzk2Mzh9.gzSraSYS8EXBxLN_oWnFSRgCzcmJmMjLiuyu5CSpyHI
在應(yīng)用與服務(wù)器之間傳遞的就是上述字符串形式的Token。
如何使用JWT?使用JWT的應(yīng)用基本都遵循下面的使用流程:
訪問(wèn)登錄點(diǎn)。
登錄服務(wù)驗(yàn)證之后,簽發(fā)證書(shū)返回給客戶端。
客戶端保存證書(shū),并在每次請(qǐng)求時(shí)將其附在request header中,表示已經(jīng)登錄。
服務(wù)器接收請(qǐng)求之后,通過(guò)簽名和時(shí)戳,驗(yàn)證Token的有效性。
若有效,則響應(yīng)客戶端。
對(duì)應(yīng)的request header如下:
Authorization:Bearer
整個(gè)過(guò)程如下圖:
在一般的應(yīng)用中,驗(yàn)證成功之后,服務(wù)器可能會(huì)在Cookie或Session中保留一些用戶相關(guān)的額外信息,簡(jiǎn)化后續(xù)的編程,同時(shí)避免反復(fù)讀取數(shù)據(jù)庫(kù)。
在JWT,同樣可以實(shí)現(xiàn)這樣的功能:只需將相應(yīng)的內(nèi)容放入payload即可。這樣,下次從客戶端發(fā)送的token中便可以解碼得出。
驗(yàn)證JWT的有效性時(shí),會(huì)考慮至少下面兩點(diǎn):
簽名是否正確?
Token是否到期?
整個(gè)過(guò)程的編碼其實(shí)并不復(fù)雜,請(qǐng)參見(jiàn)文后的鏈接,這里不再啰嗦。
使用中的注意事項(xiàng)出于安全性,注意以下幾點(diǎn):
簽名證書(shū)需要安全存放
不要將敏感信息放置于token中
請(qǐng)結(jié)合SSL使用
如果要在Cookie中保存Token【此時(shí),服務(wù)器要同時(shí)驗(yàn)證cookie或header中是否有token】
留意Token的大小超過(guò)Cookie的限制
請(qǐng)使用HttpOnly標(biāo)志。若有可能,使用Secure標(biāo)志。
采用Synchronize Token來(lái)防止CSRF【這是因?yàn)椋贏站點(diǎn)上發(fā)起向B站點(diǎn)的請(qǐng)求時(shí),B站點(diǎn)的Cookie同樣會(huì)被發(fā)送給B。若不使用另一個(gè)Token來(lái)防護(hù),則無(wú)法得知cookie中的JWT是否屬于從A->B,還是從B->B。目前,大部分現(xiàn)有的框架已經(jīng)支持】。
為了防止replay attack,可加上jti、exp和iat聲明
以上是對(duì)JWT的旋風(fēng)式說(shuō)明,其他的內(nèi)容,請(qǐng)參見(jiàn)參考文獻(xiàn)。
參考文獻(xiàn)Get Started with JSON Web Tokens
Introduction to JSON Web Tokens
維基百科上的JWT
Vert.x Web的JWT例子
Where to Store your JWTs – Cookies vs HTML5 Web Storage
Use JWT The Right Way!
Authentication: Cookies vs JWTs and why you’re doing it wrong
How to store a JWT token inside an HTTP only cookie?
Cookies vs Tokens: The Definitive Guide
管理JWT的生命周期
JWT規(guī)范
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/11225.html
摘要:通過(guò)請(qǐng)求和響應(yīng)的交換達(dá)成通信協(xié)議中已經(jīng)規(guī)定了請(qǐng)求是從客戶端發(fā)出,最后由服務(wù)端響應(yīng)這個(gè)請(qǐng)求并返回。隨后的字符串指明了請(qǐng)求訪問(wèn)的資源對(duì)象。協(xié)議自身不對(duì)請(qǐng)求和響應(yīng)之間的通信狀態(tài)進(jìn)行保存,也就是說(shuō)這個(gè)級(jí)別。從前發(fā)送請(qǐng)求后需等待并受到響應(yīng)。 showImg(https://segmentfault.com/img/bVbmDsG?w=1024&h=538); http協(xié)議用戶客戶端和服務(wù)器之間的...
摘要:報(bào)文用于協(xié)議交互的信息被稱為報(bào)文。現(xiàn)在出現(xiàn)的各種首部字段及狀態(tài)碼稍后會(huì)闡述。狀態(tài)碼響應(yīng)報(bào)文包含了多個(gè)范圍的內(nèi)容使用。如果服務(wù)器無(wú)法響應(yīng)范圍請(qǐng)求,則會(huì)返回狀態(tài)碼和完整的實(shí)體內(nèi)容。 showImg(https://segmentfault.com/img/bVbthNL?w=900&h=500); http報(bào)文 用于HTTP協(xié)議交互的信息被稱為HTTP報(bào)文。請(qǐng)求端的http報(bào)文叫做請(qǐng)求報(bào)文...
SSL,Secure Sockets Layer,安全Socket層TLS,Transport Layer Security,傳輸層安全協(xié)議 package network.secure; import java.io.*; import javax.net.ssl.*; public class HTTPSClient { public static void main(Strin...
閱讀 2055·2019-08-30 15:52
閱讀 2446·2019-08-29 18:37
閱讀 799·2019-08-29 12:33
閱讀 2846·2019-08-29 11:04
閱讀 1536·2019-08-27 10:57
閱讀 2101·2019-08-26 13:38
閱讀 2768·2019-08-26 12:25
閱讀 2455·2019-08-26 12:23