欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

JWT概述以及Token刷新機制詳解

 更新時間:2025年03月25日 10:08:15   作者:透明果凍  
這篇文章主要介紹了JWT概述以及Token刷新機制,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

一、概述

什么是JWT,簡單的說就是一個存儲在請求頭中的字符串,包含了用戶信息和校驗信息。較為正式一點的來說, JWT(JSON Web Token)是一種無狀態(tài)的身份認證機制,通常用于前后端分離項目。

它具有以下特點:

  • 無狀態(tài):JWT是基于客戶端存儲的,不會存儲在服務端,減輕了服務端的存儲壓力
  • 高性能:每次請求都會攜帶JWT,而不用查詢數據庫或緩存,就能完成身份認證
  • 對于跨域友好:由于是通過HTTP請求進行傳輸,不存在跨域限制

二、JWT組成

JWT由三部分組成,各部分用.隔開。header.payload.signature。

  • header(頭部):用于存儲JWT類型和加密算法。
  • payload(負載):存儲數據,如用戶id,過期時間等。
  • signature(簽名):由密鑰(通常是一個對稱密鑰或者非對稱密鑰) 對前兩部分利用某種特定的加密算法進行簽名,防止篡改。

三、JWT認證

用戶輸入賬號密碼,經過服務端校驗成功后,就會生成一個JWT,首先選擇其加密算法類型,如 HS256,將這一部分內容放入頭部中,然后在負載中放入用戶id,過期時間等信息;然后會使用一個 密鑰 對前兩部分進行 HMAC-SHA256 簽名,防止篡改。然后將JWT返回給客戶端,客戶端將其存儲在本地緩存中。

以后的每次請求中,都帶上該JWT。服務端從請求頭請求頭中獲取該JWT,然后使用相同的密鑰對其進行驗證,若驗證成功則獲取負載中的信息,對其中的信息進行驗證,一般是查詢db,驗證用戶id的有效性。然后才對該請求進行放行。

四、與傳統(tǒng)session相比較

JWT與傳統(tǒng)session的區(qū)別:

  • JWT是存儲在客戶端,服務端 通過請求頭獲取,而session通常是存儲在服務端,一般通過查詢緩存獲取
  • JWT更適合分布式項目,而session則需要使用共享方案來實現
  • JWT容易被篡改,而session由于是存儲在服務端,更安全
  • 服務器不能更改JWT的過期時間和刪除它,而對于session來說較為容易

五、對于token失效的解決策略

我們之前討論的 JWT 認證 基本流程是:

  1. 用戶登錄后,服務器生成一個 Access Token(通常較短有效期,如 15 分鐘),并返回給客戶端。
  2. 客戶端每次請求時都會攜帶 Access Token,服務器通過驗證 Access Token 來確認用戶身份。

但存在一定問題:

  • Access Token 一旦過期,用戶需要重新登錄才能獲取新的 Access Token。
  • 頻繁要求用戶登錄會影響用戶體驗,尤其是對于需要長時間使用的app

所以引入 Refresh Token機制來解決上述問題:

Refresh Token 是一個長期有效的 Token,一般有效期7-30天,它的作用是用來刷新已過期的 Access Token。

工作流程

用戶登錄

  • 用戶提交用戶名和密碼給服務器。
  • 服務器驗證成功后,生成 Access Token 和 Refresh Token。
  • Access Token 有較短的有效期(例如 15 分鐘),而 Refresh Token 有較長的有效期(例如 7 天)。

Access Token 過期

  • 當 Access Token 過期時,客戶端發(fā)送請求到服務器,攜帶過期的 Access Token和有效的 Refresh Token,這時候客戶端不需要讓用戶重新登錄,而是使用Refresh Token來向服務器請求刷新一個新的 Access Token。
  • 服務器驗證 Refresh Token,如果有效,則生成新的 Access Token 和新的 Refresh Token(防止Refresh Token被盜用)返回給客戶端。
  • 客戶端用新的 Access Token 繼續(xù)訪問 API。

Token 刷新失敗

  • 如果 Refresh Token 也過期,或者 Refresh Token 被篡改,服務器會要求用戶重新登錄。

注意

  • Refresh Token 本身不會直接用于訪問 API,僅用于刷新 Access Token。

總結

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • 將Springboot項目升級成Springcloud項目的圖文教程

    將Springboot項目升級成Springcloud項目的圖文教程

    本文主要介紹了將Springboot項目升級成Springcloud項目,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-06-06
  • spring的data派生查詢機制的實現

    spring的data派生查詢機制的實現

    SpringData的派生查詢是一種通過方法名約定自動生成數據庫查詢的機制,無需手動編寫SQL或JPQL,下面就來介紹一下spring data派生查詢的實現,感興趣的可以了解一下
    2025-03-03
  • java?map的key值轉駝峰命名的方法

    java?map的key值轉駝峰命名的方法

    這篇文章主要介紹了java?map的key值轉駝峰,通過實例代碼介紹了Map把“_”形式的key轉化為駝峰形式,本文通過實例代碼給大家介紹的非常詳細,需要的朋友可以參考下
    2023-12-12
  • jdk自帶定時器使用方法詳解

    jdk自帶定時器使用方法詳解

    這篇文章主要為大家詳細介紹了jdk自帶定時器的使用方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • JAVA 多線程之信號量(Semaphore)實例詳解

    JAVA 多線程之信號量(Semaphore)實例詳解

    這篇文章主要介紹了JAVA 多線程之信號量(Semaphore)實例詳解的相關資料,需要的朋友可以參考下
    2017-01-01
  • MyBatis中${}?和?#{}?有什么區(qū)別小結

    MyBatis中${}?和?#{}?有什么區(qū)別小結

    ${}?和?#{}?都是?MyBatis?中用來替換參數的,它們都可以將用戶傳遞過來的參數,替換到?MyBatis?最終生成的?SQL?中,但它們區(qū)別卻是很大的,今天通過本文介紹下MyBatis中${}?和?#{}?有什么區(qū)別,感興趣的朋友跟隨小編一起看看吧
    2022-11-11
  • 舉例詳解Java中的訪問權限修飾符

    舉例詳解Java中的訪問權限修飾符

    這篇文章主要介紹了舉例詳解Java中的訪問權限修飾符,是Java入門學習中的基礎知識,需要的朋友可以參考下
    2015-08-08
  • java多線程實現同步鎖賣票實戰(zhàn)項目

    java多線程實現同步鎖賣票實戰(zhàn)項目

    本文主要介紹了java多線程實現同步鎖賣票實戰(zhàn)項目,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-01-01
  • Java使用PreparedStatement接口及ResultSet結果集的方法示例

    Java使用PreparedStatement接口及ResultSet結果集的方法示例

    這篇文章主要介紹了Java使用PreparedStatement接口及ResultSet結果集的方法,結合實例形式分析了PreparedStatement接口及ResultSet結果集的相關使用方法與操作注意事項,需要的朋友可以參考下
    2018-07-07
  • 解決OpenFeign遠程調用返回的對象總是null問題

    解決OpenFeign遠程調用返回的對象總是null問題

    OpenFeign在SpringCloud中用于遠程調用,配置簡單,在使用Ribbon或Hystrix時,需要注意path參數必須以/開頭,否則回參會是null
    2024-11-11

最新評論