摘要:最近,項目的安全認證機制全面采用。為了伸縮性考慮,采用機制,必然面臨著應用狀態的問題,而且必然牽涉到的復制。為了安全性考慮,機制僅驗證時天然對免疫。若有可能,使用標志。采用來防止這是因為,在站點上發起向站點的請求時,站點的同樣會被發送給。
最近,項目的安全認證機制全面采用JWT。現在,趁整個工作基本告一段落之際,將一些知識點總結一下發布出來。
為什么要遷移?原因很簡單,就以下幾點:
為了遷移到微服務架構,由于服務分拆之后,單一的登錄入口點消失了,采用Token是必然之選。
為了伸縮性考慮,采用Cookie + Session機制,必然面臨著應用狀態的問題,而且必然牽涉到session的復制。采用Token,天然避免這一點。這里并非是指完全無Session化,但起碼可以降至最少。
為了移動端考慮,Token更適合移動端,比Cookie更靈活了。
為了安全性考慮,Token機制【僅驗證request header時】天然對CSRF免疫。
JWT為何物?JWT由三部分組成:header + payload + signature,每部分是一個Json表示。最終的Token對這三部分進行編碼之后的字符串,中間用“.”分割:
token = encodeBase64(header) + "." + encodeBase64(payload) + "." + encodeBase64(signature) # token is now: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJsb2dnZWRJbkFzIjoiYWRtaW4iLCJpYXQiOjE0MjI3Nzk2Mzh9.gzSraSYS8EXBxLN_oWnFSRgCzcmJmMjLiuyu5CSpyHI
在應用與服務器之間傳遞的就是上述字符串形式的Token。
如何使用JWT?使用JWT的應用基本都遵循下面的使用流程:
訪問登錄點。
登錄服務驗證之后,簽發證書返回給客戶端。
客戶端保存證書,并在每次請求時將其附在request header中,表示已經登錄。
服務器接收請求之后,通過簽名和時戳,驗證Token的有效性。
若有效,則響應客戶端。
對應的request header如下:
Authorization:Bearer
整個過程如下圖:
在一般的應用中,驗證成功之后,服務器可能會在Cookie或Session中保留一些用戶相關的額外信息,簡化后續的編程,同時避免反復讀取數據庫。
在JWT,同樣可以實現這樣的功能:只需將相應的內容放入payload即可。這樣,下次從客戶端發送的token中便可以解碼得出。
驗證JWT的有效性時,會考慮至少下面兩點:
簽名是否正確?
Token是否到期?
整個過程的編碼其實并不復雜,請參見文后的鏈接,這里不再啰嗦。
使用中的注意事項出于安全性,注意以下幾點:
簽名證書需要安全存放
不要將敏感信息放置于token中
請結合SSL使用
如果要在Cookie中保存Token【此時,服務器要同時驗證cookie或header中是否有token】
留意Token的大小超過Cookie的限制
請使用HttpOnly標志。若有可能,使用Secure標志。
采用Synchronize Token來防止CSRF【這是因為,在A站點上發起向B站點的請求時,B站點的Cookie同樣會被發送給B。若不使用另一個Token來防護,則無法得知cookie中的JWT是否屬于從A->B,還是從B->B。目前,大部分現有的框架已經支持】。
為了防止replay attack,可加上jti、exp和iat聲明
以上是對JWT的旋風式說明,其他的內容,請參見參考文獻。
參考文獻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規范
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/11225.html
摘要:通過請求和響應的交換達成通信協議中已經規定了請求是從客戶端發出,最后由服務端響應這個請求并返回。隨后的字符串指明了請求訪問的資源對象。協議自身不對請求和響應之間的通信狀態進行保存,也就是說這個級別。從前發送請求后需等待并受到響應。 showImg(https://segmentfault.com/img/bVbmDsG?w=1024&h=538); http協議用戶客戶端和服務器之間的...
摘要:報文用于協議交互的信息被稱為報文。現在出現的各種首部字段及狀態碼稍后會闡述。狀態碼響應報文包含了多個范圍的內容使用。如果服務器無法響應范圍請求,則會返回狀態碼和完整的實體內容。 showImg(https://segmentfault.com/img/bVbthNL?w=900&h=500); http報文 用于HTTP協議交互的信息被稱為HTTP報文。請求端的http報文叫做請求報文...
SSL,Secure Sockets Layer,安全Socket層TLS,Transport Layer Security,傳輸層安全協議 package network.secure; import java.io.*; import javax.net.ssl.*; public class HTTPSClient { public static void main(Strin...
閱讀 2053·2019-08-30 15:52
閱讀 2445·2019-08-29 18:37
閱讀 797·2019-08-29 12:33
閱讀 2845·2019-08-29 11:04
閱讀 1533·2019-08-27 10:57
閱讀 2101·2019-08-26 13:38
閱讀 2767·2019-08-26 12:25
閱讀 2454·2019-08-26 12:23