日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

JWT生成Token做登录校验讲解

發布時間:2023/12/31 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JWT生成Token做登录校验讲解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Free碼農?2017-12-28 00:08:02

JWT簡介

JWT(json web token)是為了在網絡應用環境間傳遞聲明而執行的一種基于JSON的開放標準。

JWT的聲明一般被用來在身份提供者和服務提供者間傳遞被認證的用戶身份信息,以便于從資源服務器獲取資源。比如用在用戶登錄上。

基于session的登錄認證

在傳統的用戶登錄認證中,因為http是無狀態的,所以都是采用session方式。用戶登錄成功,服務端會保證一個session,當然會給客戶端一個sessionId,客戶端會把sessionId保存在cookie中,每次請求都會攜帶這個sessionId。

圖片來源于網絡博客

cookie+session這種模式通常是保存在內存中,而且服務從單服務到多服務會面臨的session共享問題,隨著用戶量的增多,開銷就會越大。而JWT不是這樣的,只需要服務端生成token,客戶端保存這個token,每次請求攜帶這個token,服務端認證解析就可。

JWT生成Token后的樣子

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJvcmciOiLku4rml6XlpLTmnaEiLCJuYW1lIjoiRnJlZeeggeWGnCIsImV4cCI6MTUxNDM1NjEwMywiaWF0IjoxNTE0MzU2MDQzLCJhZ2UiOiIyOCJ9.49UF72vSkj-sA4aHHiYN5eoZ9Nb4w5Vb45PsLF7x_NY

JWT的構成

第一部分我們稱它為頭部(header),第二部分我們稱其為載荷(payload),第三部分是簽證(signature)。

header

jwt的頭部承載兩部分信息:

  • 聲明類型,這里是jwt

  • 聲明加密的算法 通常直接使用 HMAC SHA256

完整的頭部就像下面這樣的JSON:

{"typ": "JWT","alg": "HS256"}

然后將頭部進行base64加密(該加密是可以對稱解密的),構成了第一部分:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9

playload

載荷就是存放有效信息的地方。這個名字像是特指飛機上承載的貨品,這些有效信息包含三個部分

  • 標準中注冊的聲明

  • 公共的聲明

  • 私有的聲明

標準中注冊的聲明?(建議但不強制使用) :

  • iss: jwt簽發者

  • sub: jwt所面向的用戶

  • aud: 接收jwt的一方

  • exp: jwt的過期時間,這個過期時間必須要大于簽發時間

  • nbf: 定義在什么時間之前,該jwt都是不可用的.

  • iat: jwt的簽發時間

  • jti: jwt的唯一身份標識,主要用來作為一次性token,從而回避重放攻擊。

公共的聲明 :

公共的聲明可以添加任何的信息,一般添加用戶的相關信息或其他業務需要的必要信息.但不建議添加敏感信息,因為該部分在客戶端可解密.

私有的聲明 :

私有聲明是提供者和消費者所共同定義的聲明,一般不建議存放敏感信息,因為base64是對稱解密的,意味著該部分信息可以歸類為明文信息。

定義一個payload:

{"name":"Free碼農","age":"28","org":"今日頭條"}

然后將其進行base64加密,得到Jwt的第二部分:

eyJvcmciOiLku4rml6XlpLTmnaEiLCJuYW1lIjoiRnJlZeeggeWGnCIsImV4cCI6MTUxNDM1NjEwMywiaWF0IjoxNTE0MzU2MDQzLCJhZ2UiOiIyOCJ9

signature

jwt的第三部分是一個簽證信息,這個簽證信息由三部分組成:

  • header (base64后的)

  • payload (base64后的)

  • secret

這個部分需要base64加密后的header和base64加密后的payload使用.連接組成的字符串,然后通過header中聲明的加密方式進行加鹽secret組合加密,然后就構成了jwt的第三部分:

49UF72vSkj-sA4aHHiYN5eoZ9Nb4w5Vb45PsLF7x_NY

密鑰secret是保存在服務端的,服務端會根據這個密鑰進行生成token和驗證,所以需要保護好。

java方式實現

Maven

<dependency><groupId>com.auth0</groupId><artifactId>java-jwt</artifactId><version>3.1.0</version></dependency>

加密與校驗代碼:

加密方法與校驗方法

測試代碼:

測試方法

代碼輸出結果:

代碼輸出結果

可以很清楚的看到,第一次用生成的Token去校驗,校驗通過,并且輸出了Token中包涵的信息。第二次用過期的Token調用校驗方法,直接拋出異常,提示Token信息過期。

JWT總結

1、因為json的通用性,所以JWT是可以進行跨語言支持的,像JAVA,JavaScript,NodeJS,PHP等很多語言都可以使用。

2、payload部分,JWT可以在自身存儲一些其他業務邏輯所必要的非敏感信息。

3、便于傳輸,jwt的構成非常簡單,字節占用很小,所以它是非常便于傳輸的。它不需要在服務端保存會話信息, 所以它易于應用的擴展

總結

以上是生活随笔為你收集整理的JWT生成Token做登录校验讲解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。