一、JWT基礎
概念:JWT(JSON WEB TOKEN) 是一個開放標准(RFC 7519),它定義了一種緊湊、自包含的方式,用於作為JSON對象在各方之間安全的傳輸信息。該信息可以被驗證和信任,因為它是數字簽名
場景:
Authorization(授權):使用JWT最常見的場景,一旦用戶登錄,后續每個請求都將包含JWT,允許用戶訪問該令牌允許的路由、服務和資源。單點登錄是現在廣泛使用的JWT的一個特性,因為它的開銷很小,並且可以輕松地跨域使用。
Information exchange(信息交換): 對於安全的在各方之間傳輸信息而言,JSON Web Tokens無疑是一種很好的方式。因為JWTs可以被簽名,例如,用公鑰/私鑰對,你可以確定發送人就是它們所說的那個人。另外,由於簽名是使用頭和有效負載計算的,您還可以驗證內容沒有被篡改。
二、JWT結構
Json Web Token由三部分組成,Header(頭部)、Payload(聲明)、Signature(簽名),它們之間用圓點(.)連接,例如xxxxx.yyyyyy.zzzzz
Header:header典型的由兩部分組成:token類型(“JWT”)和算法名稱(比如:HMAC SHA256或者RSA等等)
{ "typ":"JWT", "alg":""RSA", }
Payload:包含聲明(要求),自定義的用戶信息,根據需求制定。比如用戶名、權限等等
{ "name":"levi", "permission":["USER_ADD","USER_DELETE","USER_SEARCH"] }
Signature:驗證消息在傳遞過程中有沒有被更改
三、JWT工作流程
在用戶用他們的憑證登錄認證成功以后,生成一個JWT返回。此后,token就是用戶憑證了,必須非常小心防止出現安全問題(token泄露)。一般而言,保存令牌的時候不應該超過你所需要它的時間。
無論何時用戶想要訪問受保護的路由或者資源的時候,用戶代理(通常是瀏覽器)都應該帶上JWT,典型的,通常放在Authorization header中,用Bearer schema。
- 應用(或者客戶端)想授權服務器請求授權。例如,如果用授權碼流程的話,就是/oauth/authorize
- 當授權被許可以后,授權服務器返回一個access token給應用
- 應用使用access token訪問受保護的資源(比如:API)
四、基於 Token 的身份認證 與 基於服務器的身份認證
1、基於服務器的身份認證
傳統的做法是將已經認證過的用戶信息存儲在服務器上,比如Session。用戶下次請求的時候帶着Session ID,然后服務器以此檢查用戶是否認證過。
存在如下問題:
a、session存儲內存,用戶過多,消耗內存
b、session共享問題
c、跨域請求授權問題
d、容易遭受CSRF攻擊
2、JWT 與 session 的差異
a、session 存儲在服務器,JWT保存在客戶端,JWT更利於減輕服務端內存壓力
b、JWT是無狀態的,可以解決 用戶信息 共享問題
c、JWT是加密字符串,更加安全,有助於防止CSRF攻擊
3、JWT 與 OAuth 的區別
a、OAuth2 是一種授權框架,JWT 是一種認證協議
b、無論使用哪種方式切記用HTTPS來保證數據的安全性